Prerequisite: You need a KYC-approved wallet and an active bank account on your organization.
See Onboarding Customers for the full onboarding flow.
Onramp Flow
Discover Assets
Show Details
Show Details
Either of these endpoints will give you the asset identifiers needed for quotes:
- GET /ramp/assets — Requires auth. Returns only assets available for your specific blockchain, currency, and wallet. Best for building integrations where you already know the customer’s wallet.
- GET /lookup/stablebonds — Public, no auth. Returns all stablebonds across all chains with pricing and supply data. Best for exploring what’s available before onboarding a customer.
identifier from either response as the asset value in your quote.Asset identifier format differs by chain:
- Solana — Base58 mint address (e.g.
AvvetPGuuB5FD5m86fpw3LtDKyQoUFT1mG9WarNQLW4q) - Stellar —
CODE:ISSUERformat (e.g.CETES:GC3CW7...) - EVM (Base, Polygon) — Raw contract address only (e.g.
0xcC77c598d42f2f78Beb42C91d12B9d4041a5cE29)
SYMBOL:0x... on EVM chains will return UnsupportedBlockchain.Create a Quote — POST /ramp/quote
Show Details
Show Details
All orders require a quote. Quotes expire after 2 minutes. For onramps, set
type: "onramp" with the fiat currency as sourceAsset and the token identifier as targetAsset. See POST /ramp/quote for the full schema.Copy
Ask AI
curl -X POST https://api.sand.etherfuse.com/ramp/quote \
-H "Authorization: <api_key>" \
-H "Content-Type: application/json" \
-d '{
"quoteId": "<uuid>", # You generate this UUID
"customerId": "<org_uuid>", # From onboarding
"blockchain": "base",
"quoteAssets": {
"type": "onramp",
"sourceAsset": "MXN",
"targetAsset": "0xcC77c598d42f2f78Beb42C91d12B9d4041a5cE29"
},
"sourceAmount": "100"
}'
Create an Order — POST /ramp/order
Show Details
Show Details
The
quoteId carries the direction, blockchain, and amounts from your quote — no need to repeat them. The response includes orderId and depositClabe (the CLABE the customer wires MXN to in production). See POST /ramp/order for the full schema.Copy
Ask AI
curl -X POST https://api.sand.etherfuse.com/ramp/order \
-H "Authorization: <api_key>" \
-H "Content-Type: application/json" \
-d '{
"orderId": "<uuid>", # You generate this UUID
"bankAccountId": "<bank_account_uuid>", # From onboarding
"cryptoWalletId": "<wallet_uuid>", # From onboarding
"quoteId": "<quote_id_from_step_1>" # From Step 2
}'
One open order per bank account + amount. If a customer already has an open order for the same amount on the same bank account, creating a second order will be rejected. The first order must be cancelled before a new one with the same amount and bank account can be created.
The response includes a
statusPage URL — e.g. https://devnet.etherfuse.com/ramp/order/<order_uuid>. Open it in a browser to track progress, sign transactions, or debug without polling the API.Simulate the Fiat Deposit — POST /ramp/order/fiat_received
Show Details
Show Details
In production, the customer sends MXN to the deposit CLABE. In sandbox, simulate the deposit using the Simulate Fiat Received endpoint with the
orderId from the previous step.This endpoint is sandbox-only. In production, fiat deposits are detected automatically via STP.
The deposit amount must match the order amount. In production, if a customer sends an amount that does not match the open order, the funds will be returned to the sender. Make sure the customer transfers the exact amount specified in the order.
Verify Completion — GET /ramp/order/{order_uuid}
Show Details
Show Details
Poll the order status or listen for webhooks. Status progression:
created → funded → completed. See GET /ramp/order for the full response schema.Copy
Ask AI
curl -H "Authorization: <api_key>" \
https://api.sand.etherfuse.com/ramp/order/<order_uuid>
Show Chain-specific quote examples
Show Chain-specific quote examples
Solana — Use the Base58 mint address as Stellar — Use Base / Polygon — Use the raw contract address:
targetAsset:Copy
Ask AI
{
"blockchain": "solana",
"quoteAssets": {
"type": "onramp",
"sourceAsset": "MXN",
"targetAsset": "AvvetPGuuB5FD5m86fpw3LtDKyQoUFT1mG9WarNQLW4q"
}
}
CODE:ISSUER format:Copy
Ask AI
{
"blockchain": "stellar",
"quoteAssets": {
"type": "onramp",
"sourceAsset": "MXN",
"targetAsset": "CETES:GC3CW7..."
}
}
Copy
Ask AI
{
"blockchain": "base",
"quoteAssets": {
"type": "onramp",
"sourceAsset": "MXN",
"targetAsset": "0xcC77c598d42f2f78Beb42C91d12B9d4041a5cE29"
}
}
Show Common errors
Show Common errors
| Error | Cause | Fix |
|---|---|---|
UnsupportedBlockchain | Using SYMBOL:0x... format on an EVM chain | Use the raw contract address only |
Terms and conditions have not been completed | Wallet not KYC-approved | Complete the onboarding flow |
Quote not found or expired | Quote TTL is 2 minutes | Create a fresh quote |
Bank account not found | Bank account not owned by the requesting org | Verify the bank account belongs to your organization |
quote_id is required | Missing quote — the quoteless path is deprecated | Create a quote via POST /ramp/quote first |
| Duplicate order rejected | An open order already exists for the same amount on the same bank account | Cancel the existing order first, or use a different amount/bank account |
| Deposit returned | Customer sent an amount that doesn’t match the open order | Ensure the customer sends the exact amount from the order |