curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/addresses/internal \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "My EVM Wallet",
"transfer_types": [
"ethereum",
"polygon"
]
}
'
{
"id": "3EdBHmAtfm7tct7varYqgAz6iYW",
"status": "active",
"name": "My EVM Wallet",
"address": "0xc109f7016aF02fBF21E9f0d7d50a6A48f5F644Ad",
"transfer_types": [
"ethereum",
"polygon"
]
}
Addresses
Create a new internal address
Provision an additional custodial (internal) address for the specified account.
POST
/
accounts
/
{account_id}
/
addresses
/
internal
curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/addresses/internal \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "My EVM Wallet",
"transfer_types": [
"ethereum",
"polygon"
]
}
'
{
"id": "3EdBHmAtfm7tct7varYqgAz6iYW",
"status": "active",
"name": "My EVM Wallet",
"address": "0xc109f7016aF02fBF21E9f0d7d50a6A48f5F644Ad",
"transfer_types": [
"ethereum",
"polygon"
]
}
Use this endpoint to provision an additional custodial (internal) address on an account beyond the wallets Brale creates automatically at onboarding. This is useful when you want to segment funds within a single account (per end-user, per-purpose, or per-business-unit) and distinguish wallets by
All values in
Non-deterministic chains (Spark, Canton, Hedera) return
Use the playground below to try this endpoint directly, or review the OpenAPI details in the right panel.
name.
Requires the
addresses:write scope and a unique Idempotency-Key header on every request.transfer_types must resolve to the same chain environment (for example ["ethereum", "polygon"] for EVM, or ["stellar"] for Stellar).
Request
Request (EVM)
{
"name": "My EVM Wallet",
"transfer_types": ["ethereum", "polygon"]
}
Request (Stellar)
{
"name": "Stellar Custodial Wallet",
"transfer_types": ["stellar"]
}
Responses
Deterministic-address chains (Solana, Stellar, Ethereum, Base, Polygon) return synchronously withstatus: "active" and a non-null address.
201 (synchronous)
{
"id": "3EdBHmAtfm7tct7varYqgAz6iYW",
"status": "active",
"name": "My EVM Wallet",
"address": "0xc109f7016aF02fBF21E9f0d7d50a6A48f5F644Ad",
"transfer_types": ["ethereum", "polygon"]
}
status: "pending" and address: null until the chain confirms. The address transitions to active once provisioning completes — see Address lifecycle.
201 (asynchronous)
{
"id": "3EdBHmAtfm7tct7varYqgAz6iYW",
"status": "pending",
"name": "Hedera Custodial Wallet",
"address": null,
"transfer_types": ["hedera"]
}
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
Pattern:
^[a-zA-Z0-9]{26}$Example:
"2VcUIIsgARwVbEGlIYbhg6fGG57"
Body
application/json
Response
201 - */*
Internal address successfully created
Pattern:
^[a-zA-Z0-9]{26}$Example:
"2VcUIIsgARwVbEGlIYbhg6fGG57"
Available options:
pending, active, archived Example:
"active"
Example:
"Solana Custodial Wallet"
The on-chain wallet address
Example:
"73uyt9HkEqx9bThYXWaUBP67sWsiJEsyJ5rSCieDx5me"
Example:
["solana", "base", "wire"]
Was this page helpful?