---
url: /docs/stablecoin.md
description: >-
  Hold, receive, send, and transfer USDC and USDT across EVM chains, Stellar,
  and Solana with the BlindPay API.
---

BlindPay's stablecoin APIs connect your product to multiple blockchains and fiat payment rails from a single REST API. Hold USDC and USDT in a wallet, accept fiat and deliver stablecoins on-ramp, pull stablecoins and pay out fiat off-ramp, or move stablecoins cross-chain.

## What's available

| Capability | Description |
| --- | --- |
| Managed wallets | BlindPay-custodied wallets that hold USDC/USDT per customer (beta, Arbitrum + Polygon) |
| External blockchain wallets | Customer-controlled wallets you register to receive or authorize stablecoin movement |
| Receive (on-ramp) | Accept a fiat deposit and deliver stablecoins to any wallet |
| Send (off-ramp) | Pull stablecoins from a wallet and pay out fiat to a bank account |
| Transfer | Move stablecoins cross-chain between wallets (beta, same token/same network) |
| Webhooks | Real-time events for every wallet deposit, payout, and transfer |

## Managed wallets vs external blockchain wallets

BlindPay supports two ways to hold the stablecoin side of a customer's funds. Pick one per customer, or use both.

| | Managed wallet (`bl_...`) | External blockchain wallet (`bw_...`) |
| --- | --- | --- |
| Custody | BlindPay-custodied | Customer-controlled (EOA or account abstraction) |
| Created via | `POST /customers/{re}/wallets` | `POST /customers/{re}/blockchain-wallets` |
| Networks | Arbitrum, Polygon (beta) | Any supported chain |
| Signing required | None, BlindPay moves funds on your behalf | ERC-20 `approve`, Stellar signed XDR, or Solana token delegation depending on chain |
| Typical use | Hold a balance inside BlindPay between on-ramp and off-ramp | Receive funds into a wallet you already control, or fund a payout from your own wallet |
| Add securely | n/a | Sign a message (no manual address entry) |
| Add non-secure | n/a | Paste the address directly (funds are lost if the address is wrong) |

A customer must exist and complete KYC before you can create either kind of wallet. See [On-ramp](/stablecoin/receive) and [Off-ramp](/stablecoin/send) for how each wallet type plugs into a payin or payout.

## Supported chains and tokens

| Chain | Mainnet | Testnet | Tokens |
| --- | --- | --- | --- |
| Ethereum | `ethereum` | `sepolia` | USDC, USDT |
| Base | `base` | `base_sepolia` | USDC, USDT |
| Polygon | `polygon` | `polygon_amoy` | USDC, USDT |
| Arbitrum | `arbitrum` | `arbitrum_sepolia` | USDC, USDT |
| Stellar | `stellar` | `stellar` (testnet) | USDC |
| Solana | `solana` | `solana_devnet` | USDC, USDT |
| Tron (beta) | `tron` | n/a | USDT only |

On development instances, every chain above also accepts **USDB**: a BlindPay test ERC-20/asset used to simulate transactions without real funds. Mint it from the dashboard (EVM) or via the create-asset-trustline and mint endpoints (Stellar, Solana). See [Payouts](/stablecoin/payouts#mint-usdb) for the full minting steps.

Authorization mechanics differ per network when moving stablecoins out of an external wallet:

| Network type | Authorization |
| --- | --- |
| EVM (Ethereum, Base, Polygon, Arbitrum) | Standard ERC-20 `approve` |
| Stellar | Authorize endpoint, then a signed XDR transaction |
| Solana | Token delegation: prepare, sign, submit |

## The verbs, in crypto terms

| Verb | What happens | Docs |
| --- | --- | --- |
| Store | Hold USDC/USDT in a managed wallet or register an external blockchain wallet | [Managed wallet](/stablecoin/store) |
| Receive | On-ramp: a fiat deposit is converted and the stablecoin is delivered to a wallet | [On-ramp](/stablecoin/receive) |
| Send | Off-ramp: stablecoins are pulled from a wallet and paid out as fiat to a bank account | [Off-ramp](/stablecoin/send) |
| Transfer | Cross-chain stablecoin transfer between wallets | [Cross-chain transfer](/stablecoin/transfer) |

## Non-custodial flow of funds

BlindPay never takes custody of your stablecoins beyond the single transaction it is asked to execute. Off-ramp (send) and on-ramp (receive) each move through three steps.

### Off-ramp: stablecoin to fiat

1. **Token authorization**: your wallet authorizes BlindPay to move the exact stablecoin amount needed (ERC-20 `approve` on EVM, a signed XDR on Stellar, or token delegation on Solana).
2. **Token collection and fiat conversion**: BlindPay collects the authorized stablecoins and initiates the matching fiat transfer over the local banking rail (ACH/wire in the US, Pix in Brazil, and other region-specific rails).
3. **Settlement confirmation**: once the receiving bank confirms the fiat transfer, the payout is finalized and the recipient receives funds in their local currency.

### On-ramp: fiat to stablecoin

1. **Fiat deposit**: funds move from a sender's bank account to a BlindPay bank account or a dedicated virtual account.
2. **Stablecoin delivery**: once the deposit is confirmed, BlindPay mints or transfers the equivalent stablecoin amount to the destination wallet, a managed wallet (`wallet_id`) or an external blockchain wallet (`blockchain_wallet_id`), at the rate locked in the quote.

## Get started

* [Send your first payment](/stablecoin/quickstart): step-by-step quickstart (off-ramp)
* [Managed wallet](/stablecoin/store): hold stablecoins per customer, or register an external wallet
* [On-ramp](/stablecoin/receive): accept fiat deposits and deliver stablecoins
* [Off-ramp](/stablecoin/send): pull stablecoins and pay out fiat
* [Cross-chain transfer](/stablecoin/transfer): move stablecoins between chains

## Related

* [Introduction](/introduction)
* [Supported chains](/kb/supported-chains)
* [Sandbox vs production](/learn/sandbox-vs-production)
* [Webhooks](/learn/webhooks)
