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 (27-char string) | 2MhCCIHuK4TGVgT9a4loQzJx1rj |
value_type | Currency / token on source or destination | Canonical API id (case-sensitive) | USDC, SBC, usd |
transfer_type | Blockchain on source or destination. Fiat rails such as wire and fednow_credit are not supported as filter values. | Canonical API id (case-sensitive) | polygon, base, 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}"
FedNow Transfers for an Automation
Inbound FedNow deposits create Transfers withsource.transfer_type: "fednow_credit" and the Automation’s automation_id. Outbound FedNow payouts have destination.transfer_type: "fednow_credit".
The transfer_type query parameter filters by blockchain only. Fiat rails such as fednow_credit, same_day_ach_credit, and wire are not supported as filter values. Filter by automation_id (inbound) or address_id (outbound), then check source.transfer_type or destination.transfer_type on each Transfer.
curl "https://api.brale.xyz/accounts/${ACCOUNT_ID}/transfers?automation_id=35kVg1llbsOBYvx9XKr9eOtsD9z" \
-H "Authorization: Bearer ${AUTH_TOKEN}"
payment.completed webhook is not a Transfer ID. See Receive FedNow deposits to correlate the two.
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": "2O6asmNK4TGVgT9a4loQzJx1rjH",
"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. For inbound wires, Brale may also populate this field from “Instruction for Creditor Agent,” which some banks label “Message to receiving bank.” This fallback is used only when no existing memo, Originator-to-Beneficiary Information (OBI), or remittance reference is available. Existing reference precedence is preserved. |
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 and ACH transfers. The object is optional and may be absent immediately after a transfer is created. Brale populates it later once the wire IMAD or the ACH trace number is available.
| Field | Type | Description |
|---|---|---|
imad | string | null | Wire IMAD / tracking identifier for the outbound wire, when available |
trace_number | string | null | ACH trace number for the outbound ACH payout (ach_credit or same_day_ach_credit), when available |
sent_at | string (date-time) | null | When the outbound wire or ACH payout was sent, 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]{27}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Query Parameters
Filter transfers to only those created by the specified Automation. Must be a valid KSUID. Exact match.
^[a-zA-Z0-9]{27}$"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 blockchain chain (for example, solana, base, ethereum). Fiat payment types (for example, same_day_ach_credit, wire, fednow_credit) are not supported as filter values. To find FedNow Transfers, filter by automation_id or address_id and check source.transfer_type or destination.transfer_type.
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?