Documentation Index
Fetch the complete documentation index at: https://developers.circle.com/llms.txt
Use this file to discover all available pages before exploring further.
Receive USDC or EURC by generating deposit addresses for external wallets to
send to, or send USDC or EURC to allowlisted recipient addresses on supported
blockchains. Transfers of $3,000 or more require Travel Rule compliance data for
third-party payouts.
Prerequisites
Before you begin:
- Complete the
account and API key setup.
- Review
supported chains and currencies
for available blockchains.
- (For sending) Have a funded Circle Mint account.
- (For sending) All recipient addresses must be approved by an account
administrator through the Mint Console before
you can create transfers. If your account is domiciled in France or Singapore,
addresses require additional verification through the Mint Console.
Step 1. Receive USDC via deposit address
Step 1.1. Create a deposit address
Use the create deposit address endpoint to generate an address for receiving
USDC or EURC on a specific blockchain.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/deposit \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"idempotencyKey": "ba943ff1-ca16-49b2-ba55-1057e70ca5c7", "currency": "USD", "chain": "ARC"}'
Expected response:
{
"data": {
"id": "d51d72d2-9955-4340-b3fd-2f07a82a1e6c",
"address": "0xbd01242af414961c25aa72dcae06646fc52e9b92",
"currency": "USD",
"chain": "ARC"
}
}
You can create one deposit address per blockchain. Use the same address for
all deposits on that blockchain.
Step 1.2. Send funds to your deposit address
This step happens outside the Circle Mint API. The sender transfers USDC or EURC
from their external wallet to your deposit address on the matching blockchain.
Sending funds on the wrong blockchain results in permanent loss. Always
confirm the blockchain network matches between the sender’s wallet and your
deposit address.
Step 1.3. Verify the deposit
Use the
list transfers
endpoint to confirm the incoming transfer has settled.
curl https://api-sandbox.circle.com/v1/businessAccount/transfers \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Expected response:
{
"data": [
{
"id": "a6a1b575-13d5-4e73-9da7-73e2a3e4418a",
"source": {
"type": "blockchain",
"chain": "ARC"
},
"destination": {
"type": "wallet",
"id": "1000066041"
},
"amount": {
"amount": "100.00",
"currency": "USD"
},
"transactionHash": "0x4cfd25b5ab46e9fe25e845e7a7e0ea2f1f7e4bba3c6e0f1db0b846e4a1bc5fd2",
"status": "complete",
"createDate": "2024-01-01T12:00:00.000Z"
}
]
}
The transfer reaches complete status after the required number of
blockchain confirmations for
the deposit’s blockchain.
Step 2. Send USDC to an external address
Step 2.1. Add a recipient address
Use the create recipient address endpoint to allowlist an external blockchain
address for outbound transfers.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/recipient \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"idempotencyKey": "2a308497-e66e-4c42-ac1e-7bedab86d958", "address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1", "chain": "ARC", "currency": "USD", "description": "Treasury wallet"}'
Expected response:
{
"data": {
"id": "cfa01bb0-d166-5506-a48a-56f2beab559f",
"address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
"chain": "ARC",
"currency": "USD",
"description": "Treasury wallet"
}
}
Adding a recipient address through the API creates a pending request. An account
administrator must approve the address through the
Mint Console before you can send transfers to
it. A confirmation notification is sent to all administrators.
Step 2.2. Create a transfer
Use the create transfer endpoint to send funds to the approved recipient
address.
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/transfers \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"idempotencyKey": "6ec3827d-15bb-442e-9d4c-32e73e61cbf4", "destination": {"type": "verified_blockchain", "addressId": "cfa01bb0-d166-5506-a48a-56f2beab559f"}, "amount": {"currency": "USD", "amount": "25.00"}}'
Expected response:
{
"data": {
"id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea",
"source": {
"type": "wallet",
"id": "1016875042"
},
"destination": {
"type": "blockchain",
"address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
"chain": "ARC"
},
"amount": {
"amount": "25.00",
"currency": "USD"
},
"status": "pending",
"createDate": "2024-07-15T16:41:12.395Z"
}
}
Step 2.3. Check the transfer status
Use the get transfer endpoint to monitor the status of your transfer.
curl -X GET https://api-sandbox.circle.com/v1/businessAccount/transfers/21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea \
-H "Authorization: Bearer ${YOUR_API_KEY}"
The transfer progresses through these statuses:
pending: Circle received the request.
running: The transaction is broadcast onchain. The response includes a
transactionHash.
complete: Blockchain finality reached — the required number of
confirmations passed.
Expected response for a running transfer:
{
"data": {
"id": "21fd4ec4-bad1-4eb2-9fc5-60320dedc7ea",
"source": {
"type": "wallet",
"id": "1016875042"
},
"destination": {
"type": "blockchain",
"address": "0x493a9869e3b5f846f72267ab19b76e9bf99d51b1",
"chain": "ARC"
},
"amount": {
"amount": "25.00",
"currency": "USD"
},
"transactionHash": "0x0654eee4f609f9c35e376cef9455dd9fc1546c482c5c32c8f8d434ead14fcf97",
"status": "running",
"createDate": "2024-07-15T16:41:12.395Z"
}
}
Travel Rule compliance
The Financial Crimes Enforcement Network (FinCEN) Travel Rule requires financial
institutions to share originator and beneficiary information for transfers of
$3,000 or more.
When it applies
Travel Rule applies to onchain transfers of $3,000 or more on these blockchains:
- Algorand (ALGO)
- Aptos (APTOS)
- Arbitrum (ARB)
- Avalanche (AVAX)
- Base (BASE)
- Celo (CELO)
- Ethereum (ETH)
- NEAR (NEAR)
- Optimism (OP)
- Polygon PoS (POLY)
- Ripple (XRPL)
- Solana (SOL)
- Stellar (XLM)
Business account transfers
For transfers from your Circle Mint account using
POST /v1/businessAccount/transfers, Circle uses your company identity on file.
No additional data is required in the API request.
Third-party payouts
For payouts to third parties using the
Crypto Payouts API (POST /v1/payouts),
you must include the originator’s identity in the source.identities array.
The following table describes the identities schema:
| Field | Type | Required | Description |
|---|
type | string | Yes | individual or business |
name | string | Yes | Full legal name |
addresses | array | No | Array of address objects |
addresses[].line1 | string | Yes (if addresses provided) | Street address |
addresses[].city | string | Yes (if addresses provided) | City |
addresses[].district | string | No | State/province (2-letter code for US) |
addresses[].country | string | Yes (if addresses provided) | ISO 3166-1 alpha-2 country code |
addresses[].postalCode | string | No | Postal code |
The following example shows a payout request with originator identity data:
curl -X POST https://api-sandbox.circle.com/v1/payouts \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"idempotencyKey": "ba943ff1-ca16-49b2-ba55-1057e70ca5c7", "source": {"type": "wallet", "id": "12345", "identities": [{"type": "individual", "name": "Satoshi Nakamoto", "addresses": [{"line1": "100 Money Street", "city": "Boston", "district": "MA", "country": "US", "postalCode": "01234"}]}]}, "destination": {"type": "blockchain", "address": "0x8381470ED67C3802402dbbFa0058E8871F017A6F", "chain": "ETH"}, "amount": {"amount": "3000.00", "currency": "USD"}}'
Expected response:
{
"data": {
"id": "b36cbf12-6ed1-47ed-9eb9-5874f8991ca8",
"source": {
"type": "wallet",
"id": "12345",
"identities": [
{
"type": "individual",
"name": "Satoshi Nakamoto",
"addresses": [
{
"line1": "100 Money Street",
"city": "Boston",
"district": "MA",
"country": "US",
"postalCode": "01234"
}
]
}
]
},
"destination": {
"type": "blockchain",
"address": "0x8381470ED67C3802402dbbFa0058E8871F017A6F",
"chain": "ETH"
},
"amount": {
"amount": "3000.00",
"currency": "USD"
},
"status": "pending",
"createDate": "2024-07-10T02:13:30.000Z"
}
}
Receiving transfers
If you are a regulated financial institution, Circle provides originator
identity data on inbound transfers of $3,000 or more. Use
returnIdentities=true as a query parameter on GET endpoints:
curl -X GET "https://api-sandbox.circle.com/v1/payouts/{id}?returnIdentities=true" \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Failure behavior
If a transfer requires identity data and it is omitted, the transfer fails with:
riskEvaluation.decision: denied
riskEvaluation.reason: 3220
See also