curl --request GET \
--url https://api.brale.xyz/accounts/{account_id}/transfers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.brale.xyz/accounts/{account_id}/transfers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.brale.xyz/accounts/{account_id}/transfers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.brale.xyz/accounts/{account_id}/transfers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.brale.xyz/accounts/{account_id}/transfers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.brale.xyz/accounts/{account_id}/transfers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.brale.xyz/accounts/{account_id}/transfers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"pagination": {
"next": "g3QAAAABdw...",
"prev": null,
"page_size": 25
},
"transfers": [
{
"id": "30NoY6R1Ns2tRBcx1Kb16SnuXOW",
"status": "complete",
"failure": null,
"source": {
"transaction_id": "0xdd5646ea…",
"address_id": "2MhCCIHu…",
"value_type": "USDC",
"transfer_type": "polygon"
},
"destination": {
"transaction_id": "0xdd5646ea…",
"address_id": "2O6asmN…",
"value_type": "USDC",
"transfer_type": "polygon"
},
"amount": {
"value": "100.00",
"currency": "USD"
},
"note": null,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}
]
}List transfers
Returns a paginated list of transfers for a given account, with optional filters.
curl --request GET \
--url https://api.brale.xyz/accounts/{account_id}/transfers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.brale.xyz/accounts/{account_id}/transfers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.brale.xyz/accounts/{account_id}/transfers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.brale.xyz/accounts/{account_id}/transfers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.brale.xyz/accounts/{account_id}/transfers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.brale.xyz/accounts/{account_id}/transfers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.brale.xyz/accounts/{account_id}/transfers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"pagination": {
"next": "g3QAAAABdw...",
"prev": null,
"page_size": 25
},
"transfers": [
{
"id": "30NoY6R1Ns2tRBcx1Kb16SnuXOW",
"status": "complete",
"failure": null,
"source": {
"transaction_id": "0xdd5646ea…",
"address_id": "2MhCCIHu…",
"value_type": "USDC",
"transfer_type": "polygon"
},
"destination": {
"transaction_id": "0xdd5646ea…",
"address_id": "2O6asmN…",
"value_type": "USDC",
"transfer_type": "polygon"
},
"amount": {
"value": "100.00",
"currency": "USD"
},
"note": null,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}
]
}Filters
You can narrow results by appending query parameters. All filters use exact match and are case-sensitive. When you combine multiple filters they apply with AND semantics — only transfers matching every supplied filter are returned. If no transfers match the filters, the API returns200 with an empty transfers array and a pagination object.
| Parameter | Filters by | Format | Example |
|---|---|---|---|
automation_id | Automation that created the transfer | KSUID (26-char string) | 2MhCCIHuK4TGVgT9a4loQzJx1rj |
value_type | Currency / token on source or destination | Canonical API id (case-sensitive) | USDC, SBC, usd |
transfer_type | Payment rail / chain on source or destination | Canonical API id (case-sensitive) | polygon, wire, solana |
transaction_id | On-chain transaction hash or off-chain payment reference | String (exact match, case-sensitive) | 0xdd5646ea… |
value_type and transfer_type use canonical API identifiers. See Value types and Transfer types for the full list of valid values.Filtering by transaction_id
Pass the full on-chain transaction hash or off-chain payment reference to find transfers that match on either the source or destination leg. The filter is exact match and case-sensitive. If no transfer matches, the API returns 200 with an empty transfers array.
You can combine transaction_id with other filters — multiple filters use AND semantics.
Pagination
| Parameter | Description | Default |
|---|---|---|
page[size] | Number of transfers per page (1–100) | 25 |
page[after] | Cursor for forward pagination | — |
page[prev] | Cursor from pagination.prev in a previous response | — |
page[after] or page[prev] may be present per request. Filters persist across pages — you do not need to resend them when paging. Use the pagination.next value from the previous response as the page[after] query parameter in the next request.
Examples
Filter by transaction_id
curl "https://api.brale.xyz/accounts/${ACCOUNT_ID}/transfers?transaction_id=0xdd5646ea..." \
-H "Authorization: Bearer ${AUTH_TOKEN}"
Filter by automation_id
curl "https://api.brale.xyz/accounts/${ACCOUNT_ID}/transfers?automation_id=2MhCCIHuK4TGVgT9a4loQzJx1rj" \
-H "Authorization: Bearer ${AUTH_TOKEN}"
Filter by value_type
curl "https://api.brale.xyz/accounts/${ACCOUNT_ID}/transfers?value_type=USDC" \
-H "Authorization: Bearer ${AUTH_TOKEN}"
Filter by transfer_type
curl "https://api.brale.xyz/accounts/${ACCOUNT_ID}/transfers?transfer_type=polygon" \
-H "Authorization: Bearer ${AUTH_TOKEN}"
Combined filters
Return only Polygon USDC transfers created by a specific Automation, 10 per page:curl "https://api.brale.xyz/accounts/${ACCOUNT_ID}/transfers?automation_id=2MhCCIHuK4TGVgT9a4loQzJx1rj&value_type=USDC&transfer_type=polygon&page[size]=10" \
-H "Authorization: Bearer ${AUTH_TOKEN}"
Response schema
A successful response returns200 with the following structure:
{
"pagination": {
"next": "g3QAAAABdw...",
"page_size": 25
},
"transfers": [
{
"id": "30NoY6R1Ns2tRBcx1Kb16SnuXOW",
"status": "complete",
"amount": {
"value": "100.00",
"currency": "USD"
},
"created_at": "2025-07-25T21:03:55.364134Z",
"updated_at": "2025-07-25T21:05:07.779018Z",
"source": {
"address_id": "2MhCCIHuK4TGVgT9a4loQzJx1rj",
"value_type": "USDC",
"transfer_type": "polygon",
"transaction_id": "0xdd5646ea…"
},
"destination": {
"address_id": "2O6asmNK4TGVgT9a4loQzJx1rj",
"value_type": "USDC",
"transfer_type": "polygon",
"transaction_id": "0xdd5646ea…"
},
"note": null
},
{
"id": "3C0QcbwVywOGyU2HBSenljm5dhU",
"status": "complete",
"failure": null,
"amount": {
"value": "102.0",
"currency": "USD"
},
"created_at": "2026-04-07T00:01:27.756775Z",
"updated_at": "2026-04-07T00:01:44.824834Z",
"source": {
"transfer_type": "wire",
"financial_institution_id": "3AjRnbvj9Mq6crkviJv08d0KLB2",
"value_type": "USD",
"payment_details": {
"received_at": "2026-04-07T00:01:24.514000Z",
"sender_name": "Originator Name",
"sender_bank_name": "JPMorgan Chase Bank",
"sender_bank_routing_number": "000000123",
"payment_reference": "Simulated Wire",
"imad": "20260406XOIZJDPP953495"
}
},
"destination": {
"transaction_id": "0x41c66f1d059dad7a55a854e157a1b5b938780c77ba5296e434a02dfb1727fe5e",
"transfer_type": "base",
"address_id": "3ARaM0I93ObWOIFDIztsTx4TAsp",
"value_type": "ARB"
},
"note": null,
"automation_id": "3AjRnDClEzwuCKlRioG3OXMS4pH"
},
{
"id": "3D1RcbwVywOGyU2HBSenljm5dhV",
"status": "complete",
"amount": {
"value": "100.00",
"currency": "USD"
},
"created_at": "2026-04-07T00:01:27.756775Z",
"updated_at": "2026-04-07T00:05:12.102000Z",
"source": {
"address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
"value_type": "SBC",
"transfer_type": "solana",
"transaction_id": "5K8…"
},
"destination": {
"address_id": "34yGFQf7tP1HJCPAWNGaN4rh4nX",
"value_type": "USD",
"transfer_type": "wire",
"wire_memo": "Invoice 1048",
"payment_details": {
"imad": "20260406XOIZJDPP953495"
}
},
"note": null
}
]
}
source.payment_details
source.payment_details appears when Brale has underlying payment metadata to expose for the source leg of a transfer. This is primarily relevant for inbound fiat-funded transfers. The object is optional and is not present on all transfers.
Wire transfers typically include the full set of fields. ACH transfers may include only a subset — fields may be null or omitted depending on available rail metadata.
| Field | Type | Description |
|---|---|---|
received_at | string (ISO 8601) | When the underlying payment was received or posted |
sender_name | string | null | Name of the originating sender, when available |
sender_bank_name | string | null | Originating bank name, when available |
sender_bank_routing_number | string | null | Originating bank routing number, when available |
payment_reference | string | null | Sender-provided payment reference or memo, when available |
imad | string | null | Wire IMAD / tracking identifier, when available |
trace_number | string | null | ACH trace identifier for the underlying payment, when available. Primarily relevant for inbound ACH-funded transfers. |
source.payment_details for full details.
destination.payment_details
destination.payment_details appears when Brale has underlying payment metadata to expose for the destination leg of a transfer. This is primarily relevant for outbound wire transfers. The object is optional and may be absent immediately after a transfer is created; for outbound wires, Brale populates it later once the IMAD is available from the sending bank.
| Field | Type | Description |
|---|---|---|
imad | string | null | Wire IMAD / tracking identifier for the outbound wire, when available |
destination.payment_details for full details.Authorizations
Use the Bearer token returned from the Auth endpoint via OAuth2 client_credentials flow. Include the token in the "Authorization: Bearer " header.
Path Parameters
The ID of the account
^[a-zA-Z0-9]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Query Parameters
Filter transfers to only those created by the specified Automation. Must be a valid KSUID. Exact match.
^[a-zA-Z0-9]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Filter transfers by currency or token identifier. Matches transfers where the source or destination value_type equals this value. Case-sensitive. Use canonical API ids from the Coverage page.
Filter transfers by payment rail or chain identifier. Matches transfers where the source or destination transfer_type equals this value. Case-sensitive. Use canonical API ids from the Coverage page.
Filter transfers by on-chain transaction hash or off-chain payment reference. Exact match against the transaction_id field on either the source or destination leg.
The number of transfers to return per page (1–100, default 25).
1 <= x <= 100Cursor for the next page (value returned in pagination.next)
Cursor for the previous page (value returned in pagination.prev)
Was this page helpful?