Skip to main content
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 name.
Requires the addresses:write scope and a unique Idempotency-Key header on every request.
All values in 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 with status: "active" and a non-null address.
201 (synchronous)
{
  "id": "3EdBHmAtfm7tct7varYqgAz6iYW",
  "status": "active",
  "name": "My EVM Wallet",
  "address": "0xc109f7016aF02fBF21E9f0d7d50a6A48f5F644Ad",
  "transfer_types": ["ethereum", "polygon"]
}
Non-deterministic chains (Spark, Canton, Hedera) return 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"]
}
Use the playground below to try this endpoint directly, or review the OpenAPI details in the right panel.

Authorizations

Authorization
string
header
required

Use the Bearer token returned from the Auth endpoint via OAuth2 client_credentials flow. Include the token in the "Authorization: Bearer " header.

Headers

Idempotency-Key
string
required

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

account_id
string<ksuid>
required

The ID of the account

Pattern: ^[a-zA-Z0-9]{26}$
Example:

"2VcUIIsgARwVbEGlIYbhg6fGG57"

Body

application/json
transfer_types
string[]
required

One or more transfer types that must all resolve to the same chain environment (e.g. ["ethereum","polygon"] for EVM, ["stellar"] for Stellar).

Minimum array length: 1
name
string | null
required

A human-readable name for the new internal address.

Response

201 - */*

Internal address successfully created

id
string<ksuid>
Pattern: ^[a-zA-Z0-9]{26}$
Example:

"2VcUIIsgARwVbEGlIYbhg6fGG57"

status
enum<string>
Available options:
pending,
active,
archived
Example:

"active"

name
string
Example:

"Solana Custodial Wallet"

address
string

The on-chain wallet address

Example:

"73uyt9HkEqx9bThYXWaUBP67sWsiJEsyJ5rSCieDx5me"

transfer_types
string[]
Example:
["solana", "base", "wire"]