- Value Types:
/coverage/value-types - Transfer Types:
/coverage/transfer-types
ID conventions
Brale resource identifiers are KSUIDs. Treat IDs as opaque strings: store them and pass them back, but don’t parse them.Exact ID names used in docs
When examples refer to an ID, we use these exact names:| Resource | Use this name |
|---|---|
| Account | account_id |
| Address | address_id |
| Transfer | transfer_id |
| Automation | automation_id |
Note: API responses often contain a genericid. In docs, we useaccount_id/transfer_id/ etc. as variable names so it’s obvious whichidto reuse in follow-up calls.
Enum casing + SBC (use API ids)
Enum values in requests are case-sensitive. Always use the API id (not a display name).value_type
Use the API ids listed in Coverage → Value Types.
- Offchain fiat value types are lowercase (e.g.,
usd,mxn). - Onchain tokens use their canonical tickers/codes (e.g.,
SBC,USDC,MXNe).
transfer_type
Use the API ids listed in Coverage → Transfer Types.
- Transfer types are lowercase identifiers (e.g.,
wire,ach_debit,solana,canton). - Testnet uses testnet chain values (e.g.,
solana_devnet,base_sepolia,sepolia).
SBC
Examples frequently useSBC as a placeholder stablecoin. Replace it with the stablecoin your integration uses when appropriate.
Note:amount.currencyis an ISO-4217 code (e.g.,USD). It is separate fromvalue_type.
Canonical Create Transfer request shape
All Create Transfer examples use the same top-level shape:amountsourcedestination
Canonical JSON (minimum shape)
Notes
amount.valueis a decimal string (avoid floats).sourceanddestinationincludevalue_typeandtransfer_type.address_idis required when a leg targets a specific address (wallet, Plaid-linked bank account, external bank destination, etc.).address_idis omitted for rails where Brale returns deposit instructions for funding (e.g., wire onramp-style sources).
Reminder: Include an Idempotency-Key header on create POSTs, and reuse the same key on retries of the same logical request.
Automations exception (where it differs)
Automations are rules that generate transfers later when funds arrive. They differ from Create Transfer:- No
amount(amount is determined by the inbound deposit) sourcedoes not includetransfer_typeoraddress_id- Additional required field:
name
Canonical Create Automation request shape
Note: When an automation becomes active, Brale populates source.funding_instructions with bank details (routing/account number, beneficiary, memo rules, etc.). Those are the coordinates you share to fund the automation.
Pagination standard
List endpoints that paginate use:page[size]page[next]page[prev]
Rules
page[size]is an integer in the range1..100.page[next]is the cursor token frompagination.next.page[prev]is the cursor token frompagination.prev.- Include at most one of
page[next]orpage[prev]in a request.
Examples
First page:Testnet terminology
Use testnet as the only term for the non-production environment.- Say testnet and mainnet (when contrast is needed).
- Do not call the environment “sandbox.”
- Only testnet networks are supported in testnet (e.g.,
sepolia,solana_devnet,base_sepolia).
Warning: In docs prose, examples, and headings: use testnet. Never name an environment “sandbox.”
9-point author checklist (prevents copy/paste failures)
- IDs are KSUIDs: treat IDs as opaque; don’t parse or validate by length.
- Correct ID names: use
account_id,address_id,transfer_id,automation_idin examples (never camelCase). - Snake_case everywhere: no
valueType,transferType, etc. value_typeis exact: copy API ids from Coverage → Value Types (case-sensitive).transfer_typeis exact: copy API ids from Coverage → Transfer Types (lowercase; use testnet variants on testnet).- Create Transfer is canonical: top-level keys are exactly
amount,source,destination. address_idusage is correct: include it when a leg targets a specific address; omit it only when Brale returns deposit instructions for funding.- Automations follow the exception: include
name; omitamount;sourceis only{ "value_type": "usd" }. - Idempotency is correct: include
Idempotency-Keyon create POSTs, reuse on retries of the same request, and do not send it on GETs.