curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/addresses/external \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "Base External Wallet",
"transfer_types": [
"base"
],
"address": "0xE57e438aE0b1557bFC1ad70BD7751635E473D888"
}
'{
"id": "3EaxQ8mDX3RLdK9wvn1BAptMs6H",
"name": "checking 7890",
"owner": "Jane Doe",
"status": "active",
"ownership": "customer-owned",
"bank_address": null,
"beneficiary_address": {
"street_line_1": "100 Example St",
"street_line_2": "Suite 500",
"city": "Springfield",
"state": "CA",
"zip": "90001",
"country": "US"
},
"created": "2026-06-02T20:01:02.226850Z",
"transfer_types": [
"ach_credit"
],
"account_number": "****7890",
"account_type": "checking",
"needs_update": false,
"last_updated": "2026-06-02T20:01:03.321461Z",
"routingNumber": "063108680"
}Create a new external address
Creates a non-custodial address (EOA) for the specified account using the Direct bank entry path.
curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/addresses/external \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "Base External Wallet",
"transfer_types": [
"base"
],
"address": "0xE57e438aE0b1557bFC1ad70BD7751635E473D888"
}
'{
"id": "3EaxQ8mDX3RLdK9wvn1BAptMs6H",
"name": "checking 7890",
"owner": "Jane Doe",
"status": "active",
"ownership": "customer-owned",
"bank_address": null,
"beneficiary_address": {
"street_line_1": "100 Example St",
"street_line_2": "Suite 500",
"city": "Springfield",
"state": "CA",
"zip": "90001",
"country": "US"
},
"created": "2026-06-02T20:01:02.226850Z",
"transfer_types": [
"ach_credit"
],
"account_number": "****7890",
"account_type": "checking",
"needs_update": false,
"last_updated": "2026-06-02T20:01:03.321461Z",
"routingNumber": "063108680"
}wire, ach_credit, same_day_ach_credit, or rtp_credit.
ach_debit. If you need ACH debit, use the Plaid-linked bank account flow instead.bank_address and beneficiary_address are required when transfer_types includes wire. They are optional for ach_credit, same_day_ach_credit, and rtp_credit. For ACH/RTP-only addresses, do not provide placeholder or generic bank addresses—omit these fields unless you have accurate values.Direct bank entry field requirements
For Direct bank entry, required fields depend on the transfer types you request.| Field | ACH Credit | Same Day ACH Credit | RTP Credit | Wire |
|---|---|---|---|---|
owner | Required | Required | Required | Required |
account_number | Required | Required | Required | Required |
routing_number | Required | Required | Required | Required |
account_type | Required | Required | Required | Required |
transfer_types | Required | Required | Required | Required |
bank_address | Optional | Optional | Optional | Required |
beneficiary_address | Optional | Optional | Optional | Required |
transfer_types includes wire, wire requirements apply. For ACH/RTP-only addresses, omit bank_address and beneficiary_address unless you have accurate values.
Direct bank entry examples
ACH Credit (ach_credit, same_day_ach_credit)
Omit bank_address and beneficiary_address for ACH-only addresses.
{
"owner": "Jane Doe",
"transfer_types": ["ach_credit", "same_day_ach_credit"],
"account_number": "1234567890",
"routing_number": "063108680",
"account_type": "checking",
"name": "Example Bank"
}
RTP Credit (rtp_credit)
Omit bank_address and beneficiary_address for RTP-only addresses.
{
"owner": "Jane Doe",
"transfer_types": ["ach_credit", "same_day_ach_credit", "rtp_credit"],
"account_number": "1234567890",
"routing_number": "063108680",
"account_type": "checking",
"name": "Example Bank"
}
rtp_credit transfer type may not appear immediately. See Key Concepts → Addresses for details.Wire (wire)
Wire-capable addresses require both bank_address and beneficiary_address.
{
"owner": "Jane Doe",
"transfer_types": ["wire"],
"account_number": "1234567890",
"routing_number": "063108680",
"account_type": "checking",
"name": "Example Bank",
"bank_address": {
"street_line_1": "100 Example St",
"street_line_2": "Suite 500",
"city": "Springfield",
"state": "CA",
"zip": "90001"
},
"beneficiary_address": {
"street_line_1": "100 Example St",
"street_line_2": "Suite 500",
"city": "Springfield",
"state": "CA",
"zip": "90001"
}
}
wire in transfer_types, both bank_address and beneficiary_address are required, even if the same address also includes ACH or RTP rails.Authorizations
Use the Bearer token returned from the Auth endpoint via OAuth2 client_credentials flow. Include the token in the "Authorization: Bearer " header.
Headers
A unique string used to prevent duplicate operations. Each POST request must use a new idempotency key. Use a UUIDv4 string. Example: idemp-123e4567-e89b-12d3-a456-426614174000
Path Parameters
The ID of the account
^[a-zA-Z0-9]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Body
Response
External address successfully created
The full external address object returned by POST /accounts/{account_id}/addresses/external.
^[a-zA-Z0-9]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
"checking 7890"
"Jane Doe"
"active"
"customer-owned"
US street address as returned in external address responses. Includes country, unlike the request USStreetAddress schema.
Show child attributes
Show child attributes
US street address as returned in external address responses. Includes country, unlike the request USStreetAddress schema.
Show child attributes
Show child attributes
"2026-06-02T20:01:02.226850Z"
["ach_credit"]
Returned masked (e.g. ****7890).
"****7890"
checking, savings "checking"
false
"2026-06-02T20:01:03.321461Z"
Note: this single field is currently returned in camelCase (routingNumber) while all other fields use snake_case.
"063108680"
Was this page helpful?