Use the sandbox for development. All examples in the guides work with the sandbox environment at
https://api.sand.etherfuse.com. If you haven’t set up your sandbox account, see Initial Setup.Integration Flow
The typical integration follows this pattern:Onboard Customer
Generate a presigned URL and have your customer complete KYC verification, bank account linking, and agreement signing. You generate the
customerId and bankAccountId UUIDs — store them, as they’re permanently bound after onboarding.Two approaches: Hosted UI (fastest) or Programmatic (white-label). See Onboarding Customers for details.Get Available Assets
Discover which assets your customer can buy, sell, or swap. Use GET /ramp/assets (auth required, scoped to wallet/chain/currency) or GET /lookup/stablebonds (public, all assets). Use the
identifier field from the response when creating quotes.Create Quote
Get pricing via POST /ramp/quote. Quotes expire after 2 minutes. The response includes
exchangeRate, feeBps, feeAmount, and destinationAmount.See the detailed guides for quote examples: Onramps, Offramps, Swaps.Create Order or Swap
Execute using the quote. For on/off-ramps, call POST /ramp/order — the order inherits direction and amounts from the quote. For swaps, call POST /ramp/swap.See Testing Onramps, Testing Offramps, or Testing Swaps for the full flow.
Monitor via Webhooks
Subscribe to webhooks via POST /ramp/webhook to receive real-time updates. See Webhooks below for event types and status flows.
Quote Types
| Type | Source | Target | Use Case |
|---|---|---|---|
onramp | Fiat (MXN) | Crypto (USDC, CETES, etc.) | Customer buys crypto |
offramp | Crypto (USDC, CETES, etc.) | Fiat (MXN) | Customer sells crypto |
swap | Crypto | Crypto | Customer exchanges one crypto for another |
Fees
Fees are based on your rolling 30-day transaction volume. Higher volume means lower fees.| 30-Day Volume (USD) | Fee |
|---|---|
| 0 - 5 million | 20 bps (0.20%) |
| 5 - 10 million | 15 bps (0.15%) |
| 10 - 50 million | 10 bps (0.10%) |
| 50 - 100 million | 8 bps (0.08%) |
| 100 million+ | 5 bps (0.05%) |
feeBps, feeAmount). Your current fee tier is applied automatically.
Webhooks
Webhook payloads are signed with HMAC-SHA256. Every delivery includes anX-Signature header for verification. See Verifying Webhooks for setup instructions and code examples.
Event Types
| Event Type | Description |
|---|---|
customer_updated | KYC verification status changed |
bank_account_updated | Bank account verification status changed |
order_updated | Order status changed |
swap_updated | Swap transaction status changed |
kyc_updated | KYC submission status changed (for programmatic KYC) |
Order Status Flow
Onramp (customer buys crypto with MXN):created— Waiting for customer to deposit MXN to thedepositClabefunded— MXN deposit received and confirmedcompleted— Crypto sent to customer’s wallet (confirmedTxSignaturecontains the tx hash)
created—burnTransactionready for customer to signfunded— Customer’s crypto transaction confirmed on-chaincompleted— MXN sent to customer’s bank account
created—sendTransactionready for customer to signfunded— Customer’s crypto transaction confirmed on-chaincompleted— Target crypto sent to customer’s wallet
failed (timeout/error), refunded (onramp only — e.g. if the deposited amount doesn’t match the order, the funds are returned), canceled (before funding).
Other Webhook Statuses
If a transaction expires before submission, use POST /ramp/order//regenerate_tx or POST /ramp/swap//regenerate_tx to get a new transaction.Use webhooks for order tracking. Webhooks deliver updates as soon as they happen. If you poll the list orders endpoint instead, there may be a brief indexing delay before newly created orders appear.
Resources
The API manages these resources, all scoped to your organization:- Organizations (
organizationId) — Your organization and any child organizations you create. Child orgs can be created programmatically via POST /ramp/organization and renamed via PUT /ramp/organization//name. - Customers (
customerId) — Your end users who complete KYC. You generate this UUID during onboarding. - Bank Accounts (
bankAccountId) — Mexican bank accounts linked to a customer. You generate this UUID during onboarding. - Wallets (
publicKey) — Crypto wallet addresses registered during onboarding. Can also be registered programmatically via POST /ramp/wallet or scoped to a child org customer via POST /ramp/customer//wallet. - Orders (
orderId) — Onramp and offramp transactions. You generate this UUID. - Webhooks — Event notification subscriptions.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
Proxy account not found | customerId or publicKey doesn’t match onboarding | Use the exact same IDs from the onboarding call |
Bank account not found | bankAccountId doesn’t match onboarding or belongs to a different customer | Verify the bank account was linked to this customer |
401 Unauthorized | Invalid API key or incorrect auth header | Use Authorization: <api_key> with no Bearer prefix |
Quote expired | Order created more than 2 minutes after the quote | Create a fresh quote |
Common Pitfalls
- IDs are permanently bound after onboarding. The
customerId,bankAccountId, andpublicKeyare linked during onboarding. You cannot mix and match IDs across different customers. - Stellar: add trust lines before ramping. On Stellar, the customer’s wallet must have trust lines for the target assets (e.g., CETES, USDC) before tokens can be received. Use GET /ramp/assets to discover asset identifiers in
CODE:ISSUERformat for setting up trust lines.