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, returns all rampable stablecoins and stablebonds for the chain, sorted by currency priority) 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.
Partner Fees
Organizations can configure an additional partner fee (up to 500 bps / 5.00%) that layers on top of the platform fee. This is useful for revenue sharing when you operate child organizations on behalf of partners.- Set a default via PUT /ramp/organization/{org_id}/partner-fee or when creating a child org
- Override per-quote by passing
partnerFeeBpsin the quote request - Resolution order: per-quote override > org default > 0
- Check your current default via GET /ramp/me (
partnerFeeDefaultBps)
partnerFeeBps, partnerFeeAmountFiat, partnerFeeStatus) and settled offline via finance — no on-chain component.
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 accountfinalized— Reversal window has passed, funds cannot be returned
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/{id}/regenerate_tx or POST /ramp/swap/{id}/regenerate_tx to get a new transaction. For Stellar onramp orders with claimable balances, the same regenerate endpoint returns a fresh unsigned claim transaction if the sequence number has gone stale.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/{org_id}/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/{customer_id}/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: trust lines are handled automatically for onramps. Pass
walletAddressin your quote request to enable automatic wallet setup. If the wallet lacks a trustline or doesn’t exist on-chain yet, the quote fee will include a one-time onboarding cost. After the order completes, the order response includes astellarClaimTransaction— an unsigned XDR that the user signs to add the trustline and claim their tokens. See Stellar: First-Time Wallet Onramp for the full flow. For offramps and swaps, the wallet must still have trust lines set up beforehand.