Create on-ramp order (fiat → crypto)
POST/onramp
Creates an on-ramp order: the customer pays fiat by bank transfer and receives crypto at destination_crypto_address, which is validated against the asset's network (see GET /assets).
There is no separate quote step and the exchange rate is not locked at creation. Bank transfers can take days to arrive, so the trade is priced when the payment is confirmed. Until then order.crypto_amount is null.
Show the customer bank_details. They must put transfer_code in the payment reference, or the payment cannot be matched to the order automatically, and pay before expires_at.
Orders at or above the KYC threshold (GET /limits) need a customer verified with ID-Flow under the same email.
For gift cards, use POST /gift-card/purchase instead.
Request
- application/json
Body
required
Possible values: [BTC, ARK-BTC, USDT, USDT-CX, CEXT]
Crypto asset ticker, e.g. ARK-BTC. See GET /assets.
Possible values: [EUR, CHF, USD]
Amount the customer will pay
Wallet address to receive crypto
Possible values: [api, web, app]
Default value: api
Responses
- 201
- 400
- 403
Order created
- application/json
- Schema
- Example (from schema)
Schema
order object
Short public token (shown to customer)
Human-readable order reference. Quote it when contacting support.
Possible values: [onramp, offramp]
Null for gift card purchases — no crypto asset involved
Null until settlement for off-ramp orders — see status
Null until settlement for on-ramp orders — see status
Possible values: [WAITING_FOR_DEPOSIT, DEPOSIT_RECEIVED, PROCESSING, COMPLETED, FAILED, PENDING_MANUAL, REJECTED, EXPIRED, REFUNDED]
Bank payment reference the customer must include in their transfer
Possible values: [crypto, sepa, swift, us, gift_card]
Off-ramp: the Arkade transaction credited as the deposit
bank_details object
Bank details the customer must pay into
fee object
{
"order": {
"id": "string",
"code": "string",
"email": "string",
"direction": "onramp",
"asset": "string",
"fiat_currency": "string",
"fiat_amount": "string",
"crypto_amount": "string",
"status": "WAITING_FOR_DEPOSIT",
"transfer_code": "string",
"destination_type": "crypto",
"destination_crypto_address": "string",
"deposit_txid": "string",
"deposit_iban": "string",
"deposit_bic": "string",
"deposit_beneficiary": "string",
"deposit_bank_name": "string",
"deposit_payment_type": "string",
"kyc_verified": true,
"created_at": "2026-11-09T04:34:14.495Z",
"expires_at": "2026-11-09T04:34:14.497Z",
"completed_at": "2026-11-09T04:34:14.497Z"
},
"bank_details": {
"iban": "string",
"bic": "string",
"beneficiary": "string",
"bank_name": "string",
"payment_type": "string",
"transfer_code": "string"
},
"fee": {
"feePct": "string",
"feeFlat": "string",
"feeAmount": "string",
"netAmount": "string"
}
}
Validation error
- application/json
- Schema
- Example (from schema)
Schema
{
"error": {}
}
KYC failed or below minimum order
- application/json
- Schema
- Example (from schema)
Schema
{
"error": "string"
}