curl --request POST \
--url https://api.sand.etherfuse.com/ramp/order \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"bankAccountId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"orderId": "7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e",
"quoteId": "3f2a1b0c-9d8e-7f6a-5b4c-3d2e1f0a9b8c",
"cryptoWalletId": "1b6e98a2-7c3d-4e5f-9a0b-1c2d3e4f5a6b"
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
bankAccountId: 'b2c3d4e5-f6a7-8901-bcde-f12345678901',
orderId: '7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e',
quoteId: '3f2a1b0c-9d8e-7f6a-5b4c-3d2e1f0a9b8c',
cryptoWalletId: '1b6e98a2-7c3d-4e5f-9a0b-1c2d3e4f5a6b'
})
};
fetch('https://api.sand.etherfuse.com/ramp/order', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sand.etherfuse.com/ramp/order"
payload = {
"bankAccountId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"orderId": "7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e",
"quoteId": "3f2a1b0c-9d8e-7f6a-5b4c-3d2e1f0a9b8c",
"cryptoWalletId": "1b6e98a2-7c3d-4e5f-9a0b-1c2d3e4f5a6b"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"offramp": {
"orderId": "7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e",
"withdrawAnchorAccount": "GANCHOR7XYZQ635VDIGY6S4ZUF5L6TQ7AA4MWS7LEQDBLUSZXV7UPS4",
"withdrawMemo": "3f2a1b0c9d8e",
"withdrawMemoType": "hash"
}
}Create order
Creates a new order for crypto/fiat conversion using a previously created quote.
Flow:
- First, call
POST /ramp/quoteto get pricing and create a quote. - Then, call this endpoint with the
quoteIdto execute the order.
The order inherits the blockchain, direction (onramp/offramp), and amounts from the quote. Quotes expire after 2 minutes, so create the order promptly after getting the quote.
Wallet resolution: provide either publicKey or cryptoWalletId (or both). When
cryptoWalletId is provided (typical for embedded wallets), publicKey, blockchain,
direction, and amount fields are optional — they are derived from the quote and wallet record.
For onramps, the bank account must belong to your organization or a child organization.
curl --request POST \
--url https://api.sand.etherfuse.com/ramp/order \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"bankAccountId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"orderId": "7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e",
"quoteId": "3f2a1b0c-9d8e-7f6a-5b4c-3d2e1f0a9b8c",
"cryptoWalletId": "1b6e98a2-7c3d-4e5f-9a0b-1c2d3e4f5a6b"
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
bankAccountId: 'b2c3d4e5-f6a7-8901-bcde-f12345678901',
orderId: '7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e',
quoteId: '3f2a1b0c-9d8e-7f6a-5b4c-3d2e1f0a9b8c',
cryptoWalletId: '1b6e98a2-7c3d-4e5f-9a0b-1c2d3e4f5a6b'
})
};
fetch('https://api.sand.etherfuse.com/ramp/order', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sand.etherfuse.com/ramp/order"
payload = {
"bankAccountId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"orderId": "7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e",
"quoteId": "3f2a1b0c-9d8e-7f6a-5b4c-3d2e1f0a9b8c",
"cryptoWalletId": "1b6e98a2-7c3d-4e5f-9a0b-1c2d3e4f5a6b"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"offramp": {
"orderId": "7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e",
"withdrawAnchorAccount": "GANCHOR7XYZQ635VDIGY6S4ZUF5L6TQ7AA4MWS7LEQDBLUSZXV7UPS4",
"withdrawMemo": "3f2a1b0c9d8e",
"withdrawMemoType": "hash"
}
}Authorizations
API key sent in the Authorization header.
Body
Optional when quote_id is provided - will be derived from quote
stellar, solana, base, polygon, monad Optional wallet UUID — when provided, resolves the wallet by ID instead of public_key lookup
Optional when quote_id is provided - will be derived from quote
onramp, offramp Fee payer G-wallet for C-wallet Stellar offramps. Contract wallets can't be tx source.
Optional when crypto_wallet_id is provided — will be derived from the wallet record
When true, returns anchor address + memo instead of pre-signed TX (SEP-24 anchor mode). Only valid for Stellar offramps.
Response
The created order
- Offramp Response
- Onramp Response
Show child attributes
Show child attributes
{
"orderId": "7b9c1e2d-3f4a-5b6c-7d8e-9f0a1b2c3d4e",
"withdrawAnchorAccount": "GANCHOR7XYZQ635VDIGY6S4ZUF5L6TQ7AA4MWS7LEQDBLUSZXV7UPS4",
"withdrawMemo": "3f2a1b0c9d8e",
"withdrawMemoType": "hash"
}