Balances

Stables can hold a balance that you can use to initiate transfers for your customers.

Balances can be held in the following assets:

NetworkAssets
EthereumUSDC, USDT
PolygonUSDC, USDT
SolanaUSDC, USDT
TronUSDT

Each network has its own deposit address and each asset its own balance. They are not pooled. A transfer draws only on the balance of the asset and network it is sent from.

Money moves in and out of a balance only through wallets you have whitelisted. Whitelist the wallet first, then deposit from it or withdraw to it.


Whitelist a wallet

Stables only credits deposits that come from a wallet you have whitelisted, and only sends withdrawals to one. This protects your balance from unknown senders and from typos in a withdrawal address.

One whitelisted wallet covers both directions and every asset on its network. Whitelist a Polygon wallet once and it can send USDC and USDT to your Polygon deposit address, and receive both from your balance.

Whitelist a wallet in the dashboard

  1. Open Balances and switch to the Manage tab.
  2. Click + Whitelist wallet.
  3. Give it a name, choose the network, and paste the address.
  4. Submit. The wallet shows as In review until Stables approves it.

Editing the address of an approved wallet sends it back to review. Name changes do not.

Whitelisting is a dashboard action. There is no API endpoint to add a wallet.

Wallet statuses

StatusMeaning
pending_reviewSubmitted and waiting for Stables to approve it.
activeApproved. Deposits from it credit, and withdrawals to it are allowed.
rejectedStables declined it. The reason is shown in the dashboard and in the API.
deactivatedSwitched off. If you deactivated it you can reactivate it from the dashboard. If Stables did, contact your representative.
archivedRemoved. Archived wallets are hidden by default.

Only active wallets count.

List your whitelisted wallets via the API

GET /api/v1/prefund/whitelisted-wallets
{
  "data": [
    {
      "id": "2697eff1-ac30-41db-94b7-d615133a5c9e",
      "name": "Treasury",
      "network": "polygon",
      "address": "0x2205844f0b80798F0e187c260753191eb668a495",
      "status": "active",
      "rejection_reason": null,
      "created_at": "2026-09-20T11:51:11.604Z",
      "updated_at": "2026-09-21T09:12:08.299Z"
    }
  ],
  "has_more": false
}

Results are newest-first and cursor-paginated. Pass next_page_token from one response as page_token on the next request. Narrow with status, network or page_size (1 to 100, default 20):

GET /api/v1/prefund/whitelisted-wallets?status=active&network=polygon

Archived wallets are left out unless you ask for them with status=archived. See List Whitelisted Wallets and Pagination.

Deposits from a wallet that is not whitelisted

The deposit is not lost. Stables holds it instead of crediting it. Whitelist the sending wallet and, once it is approved, the held deposit credits your balance on its own. Held deposits show as On hold on the Balances page, and via the API:

GET /api/v1/prefund/deposits/pending
{
  "data": [
    {
      "id": "8f1c9b2e-4d3a-4f6b-9c1d-2e3f4a5b6c7d",
      "network": "polygon",
      "currency": "usdt",
      "amount": "250.000000",
      "from_address": "0x9a1b2c3d4e5f60718293a4b5c6d7e8f901234567",
      "tx_hash": "0x5e0b...c21a",
      "reason": "sender_not_whitelisted",
      "whitelist_account": null,
      "created_at": "2026-09-22T08:30:00.000Z"
    }
  ]
}

reason is sender_not_whitelisted or compliance_review (held for a compliance check). whitelist_account is filled in once you have submitted the sender, so you can see whether it is still in review.

Addresses are matched exactly on Solana and Tron. On Ethereum and Polygon the match ignores letter case.


Top Up

Each network has a dedicated deposit address that belongs to your organisation and stays the same between deposits. One address per network accepts every asset listed for that network.

Get your deposit address

GET /api/v1/prefund/wallet?network=tron

network is one of ethereum, polygon, solana or tron, and defaults to polygon if omitted.

{
  "status": "active",
  "wallet": {
    "address": "TS3LXBdvh3qLnYourDepositAddressHere",
    "network": "tron",
    "currencies": ["usdt"]
  },
  "min_deposit": { "amount": "5", "currency": "usdt" }
}

status is one of not_created, creating, active or failed. The wallet object is present only when status is active. Treat it as absent in every other state.

wallet.currencies lists the assets credited when sent to that address.

If no address exists yet, create one with:

POST /api/v1/prefund/wallet
{ "network": "tron" }

Creation is asynchronous. The first call returns status: "creating"; poll GET /api/v1/prefund/wallet until it becomes active, then read the address. Calling POST again while creation is in flight is safe. It returns the current state rather than creating a second wallet.

You can also create a wallet and see your wallets in the Stables Dashboard.

Send a supported asset on the matching network to that address. The deposit credits your balance once it confirms on chain.

Send from a wallet you have already whitelisted. Deposits from any other wallet are held until you whitelist the sender and Stables approves it.

min_deposit is a display hint for your own UI, not a floor enforced by the API. Deposits below it are still credited.

Send only an asset listed for that network, and only on the network the address was issued for. Funds sent on another network, or in another asset, cannot be credited or recovered.


Checking your balance

GET /api/v1/prefund/balance
{
  "balances": [
    {
      "currency": "usdc",
      "amount": "1250.500000",
      "amount_minor": "1250500000",
      "available": "1250.500000",
      "available_minor": "1250500000",
      "pending": "0.000000",
      "pending_minor": "0",
      "network": "polygon"
    },
    {
      "currency": "usdt",
      "amount": "300.000000",
      "amount_minor": "300000000",
      "available": "200.000000",
      "available_minor": "200000000",
      "pending": "100.000000",
      "pending_minor": "100000000",
      "network": "tron"
    }
  ],
  "fee_network": "tron",
  "fee_currency": "usdt",
  "withdrawal_fee_minor": "0",
  "transfers_enabled": true,
  "withdrawals_enabled": true
}
FieldMeaning
balancesOne entry per asset and network held. Empty until your first deposit credits; an asset you have never funded is absent rather than reported as zero.
available, available_minorSpendable balance: amount minus funds reserved by withdrawal requests awaiting review. Transfers, withdrawals and fees draw from this.
pending, pending_minorFunds reserved by withdrawal requests awaiting review. Returned to available if the request is cancelled or rejected.
transfers_enabledWhether you may pay for transfers from your balance. See Transfer from balance.
withdrawals_enabledWhether you may withdraw from your balance. See Withdraw.
fee_network, fee_currencyThe asset Stables debits platform fees from, if you are billed from your balance.
withdrawal_fee_minorFlat fee taken out of every withdrawal, in minor units. "0" when there is no fee.

Amounts are given both in major units (amount) and minor units (amount_minor). Every supported asset has 6 decimal places. Use amount_minor for arithmetic, as it avoids the rounding errors that decimal strings invite.


Activity

GET /api/v1/prefund/activity

Deposits that have credited your balance, with the amount, currency, network, transaction hash, sending address, and when it landed.

Results are newest-first and cursor-paginated. Pass next_page_token from one response as page_token on the next request, and optionally narrow with page_size (1–100, default 20) or network:

GET /api/v1/prefund/activity?network=polygon&page_size=50

See Pagination.


Withdraw

You can send funds from your balance to any of your active whitelisted wallets. Withdrawals are made in the dashboard. There is no API endpoint for them yet.

  1. Open Balances and click Withdraw.
  2. Choose the wallet to send to. Wallets still in review are greyed out.
  3. Choose the asset and enter the amount.
  4. Click Review withdrawal, check the details, then Confirm withdrawal.

Stables reviews every withdrawal before it is sent. The wallet receives the amount minus withdrawal_fee_minor. You can cancel a withdrawal from the History tab while it is still waiting for review.

A withdrawal moves through pending_approval, approved, processing and then completed or failed. Stables can also mark it rejected, and you can mark it cancelled while it is pending.

On this page