API reference

Security controls

Limit where payouts can go, and give reporting systems keys that can only read.

Payout address allowlist

When the allowlist is on, every payout — from the API and from the console — must go to an active address on the app's list. A new address becomes usable 24 hours after it is added, so a leaked key or session can't add an address and pay it out straight away. Removed addresses stop working immediately.

Managed in the console

Turn the allowlist on or off and add or remove addresses in the console (your app → Security). It can't be changed with an API key, and when two-factor authentication is on for your console account every change needs a current code.

Address status

  • PENDINGstatus
    Added, waiting for the 24-hour activation period to end. Payouts to it are refused until then.
  • ACTIVEstatus
    Usable for payouts.
  • REVOKEDstatus
    Removed. Payouts to it are refused.
403 ForbiddenPayout to an address that is not active on the list.
{
  "success": false,
  "data": null,
  "error": {
    "code": "ADDRESS_NOT_ALLOWLISTED",
    "message": "This address is not on the payout allowlist, or is still in its activation period."
  }
}

Read-only API keys

Create up to five extra keys per app that can read — customers, balances, transactions and payout history — but never write. Give them to reporting and reconciliation systems so those systems never hold a key that can move funds.
Authorization: ApiKey {key_id}:{secret}

Send it exactly like your main key, with the key ID in place of the client ID. Read endpoints behave the same as with your main key.

Created in the console

Create and revoke read-only keys in the console (your app → Security). The secret is shown once, when the key is created.
403 ForbiddenAny write with a read-only key — creating customers, adjusting balances, payouts — is refused.
{
  "success": false,
  "data": null,
  "error": {
    "code": "READ_ONLY_KEY",
    "message": "This API key is read-only."
  }
}

Pay wallet addresses, not token accounts

On Solana, USDT is held in token accounts that belong to a wallet. Always pay to the owner wallet address. A payout to a token account or to the token's mint address is refused with ADDRESS_IS_TOKEN_ACCOUNT, so funds can't end up somewhere the recipient doesn't control.
400 Bad Request
{
  "success": false,
  "data": null,
  "error": {
    "code": "ADDRESS_IS_TOKEN_ACCOUNT",
    "message": "Destination is a token account or mint. Use the owner wallet address."
  }
}

Error codes

  • ADDRESS_NOT_ALLOWLISTED403
    The allowlist is on and the destination isn't an active address on it — it isn't listed, was removed, or is still in its 24-hour activation period.
  • READ_ONLY_KEY403
    The request was made with a read-only key and would change something.
  • ADDRESS_IS_TOKEN_ACCOUNT400
    The destination is a token account or the token's mint address. Send to the owner wallet address instead.

In the console, the Security tab of each app shows the allowlist, its addresses with their activation times, and your read-only keys.