Balances
Stables can hold a balance that you can use to initiate transfers for your customers.
Balances can be held in the following assets:
| Network | Assets |
|---|---|
| Ethereum | USDC, USDT |
| Polygon | USDC, USDT |
| Solana | USDC, USDT |
| Tron | USDT |
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
- Open Balances and switch to the Manage tab.
- Click + Whitelist wallet.
- Give it a name, choose the network, and paste the address.
- 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
| Status | Meaning |
|---|---|
pending_review | Submitted and waiting for Stables to approve it. |
active | Approved. Deposits from it credit, and withdrawals to it are allowed. |
rejected | Stables declined it. The reason is shown in the dashboard and in the API. |
deactivated | Switched off. If you deactivated it you can reactivate it from the dashboard. If Stables did, contact your representative. |
archived | Removed. 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=polygonArchived 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=tronnetwork 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
}| Field | Meaning |
|---|---|
balances | One 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_minor | Spendable balance: amount minus funds reserved by withdrawal requests awaiting review. Transfers, withdrawals and fees draw from this. |
pending, pending_minor | Funds reserved by withdrawal requests awaiting review. Returned to available if the request is cancelled or rejected. |
transfers_enabled | Whether you may pay for transfers from your balance. See Transfer from balance. |
withdrawals_enabled | Whether you may withdraw from your balance. See Withdraw. |
fee_network, fee_currency | The asset Stables debits platform fees from, if you are billed from your balance. |
withdrawal_fee_minor | Flat 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/activityDeposits 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=50See 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.
- Open Balances and click Withdraw.
- Choose the wallet to send to. Wallets still in review are greyed out.
- Choose the asset and enter the amount.
- 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.