Live source of truth: always call GET /meta/tokens for the supported tokens/addresses in your current environment (Sandbox vs Production). The list below is a snapshot for reference.
Supported tokens (snapshot)
| Symbol label | Contract address | Notes |
|---|---|---|
| BASE_USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | Base mainnet |
| BASE_USDC(Testnet) | 0x036CbD53842c5426634e7929541eC2318f3dCF7e | Sandbox only |
| USDT | 0xdAC17F958D2ee523a2206206994597C13D831ec7 | Ethereum mainnet |
| LISK_USDT | 0x05D032ac25d322df992303dCa074EE7392C117b9 | Lisk |
| SCROLL_USDC | 0x06efdbff2a14a7c8e15944d1f4a48f9f95f663a4 | Scroll |
| SCROLL_USDT | 0xF55BEC9cAfDBE8730F096AA55Dad6D22D44099df | Scroll |
| ARBITRUM_WXM | 0xb6093B61544572ab42A0E43af08abAFD41Bf25a6 | Arbitrum |
Note: addresses can differ by environment. Always use /meta/tokens in the target environment to get the canonical list (and decimals).
Environment & token mismatch
- Testnet tokens will not work in Production. Use testnet tokens strictly in Sandbox.
- If a token isn’t configured for the current environment, the server should return a 400 explaining the mismatch instead of failing later.
No Web3 instance found for token) to a 400 with a clear message.
Preview a quote (no auth)
UseGET /quote to preview pricing without creating an order.
Parameters
amount_fiat(KES): positive numbertoken:USDC | USDT | WXMorder_type:OnRamp|OffRampor0|1(defaults toOnRamp)
rate: KES per token after markuptoken_amount: tokens the user would receive (OnRamp) or must send (OffRamp)fiat_paid: echo of inputsymbol,decimals: metadata
400 bad_order_type→order_type must be 0|1 or OnRamp|OffRamp400 unknown_token/token_env_mismatch429rate limited; respectRetry-After502upstream price provider error
Units & decimals
- Fields like
token_amountandamount_sentare human units (e.g.,12.34USDC). - ERC-20 approvals must be in base units (integers), using the token’s decimals.
Off-ramp approvals (ERC-20)
Before creating an OffRamp order, approve the Element Pay spender/contract for the token. If allowance is too low,POST /orders/create responds with:
- Approve just-enough (or a reasonable buffer), not unlimited.
- Reuse allowance across multiple off-ramp orders until depleted.
- Handle
insufficient_balancesimilarly (you’ll getrequiredvscurrentindata).
Putting it together
- Call
/meta/tokensto get supported tokens, addresses, and decimals (for your environment). - Call
/quoteto previewrateandtoken_amountbefore creating an order. - For OffRamp, ensure allowance ≥ required amount (approve if needed).
- Create the order via
POST /orders/createand track via webhooks orGET /orders/tx/{tx_hash}.
- API Reference → Quote
- API Reference → Create Order
- API Reference → Webhooks

