Overview
Create an offramp that generates a crypto deposit address for receiving stablecoin deposits. Offramps can be temporary (short-lived, locked rate) or permanent (long-lived, floating rate). Deposits are settled to an internal balance or paid out as NGN.
Authentication
Unique idempotency key to prevent duplicate offramp creation
Request Body
Offramp type Allowed values: TEMPORARY, PERMANENT
TEMPORARY: Short-lived deposit address, locked to rate_id
PERMANENT: Long-lived deposit address, uses current rate at settlement
Customer information. Either customer_id or email must be provided. UUID of an existing customer. Either this or customer.email is required. Example: 650e8400-e29b-41d4-a716-446655440000
Email for auto-creating a customer. Either this or customer.customer_id is required. Example: user@example.com
Blockchain network for the deposit address Allowed values: APTOS, BASE, CELO, ETHEREUM, POLYGON, SOLANA, TRONSee Supported Chains for details on which assets are available on each chain.
Stablecoin asset to receive Allowed values: USDC, USDT
Settlement configuration Show settlement properties
Settlement mode Allowed values:
INTERNAL_BALANCE - Credit merchant USD balance
NGN_PAYOUT - Settle as NGN to a bank account
Rate identifier from GET /v1/rates Example: rate_8x7k2mq9pRequired for NGN_PAYOUT mode. Not used for INTERNAL_BALANCE.
settlement.destination_bank
Bank account for NGN payout. Required for NGN_PAYOUT mode. Show destination_bank properties
settlement.destination_bank.account_name
Bank account holder name Example: John Doe
settlement.destination_bank.account_number
Bank account number (6-32 characters) Example: 0123456789
settlement.destination_bank.bank_code
Bank code (3-16 characters) Example: 058
Request Examples
Temporary - Internal Balance
Temporary - NGN Payout
Permanent - Internal Balance
Permanent - NGN Payout
cURL - Temporary
cURL - Permanent with NGN Payout
JavaScript
{
"type" : "TEMPORARY" ,
"customer" : {
"email" : "user@example.com"
},
"chain" : "ETHEREUM" ,
"asset" : "USDC" ,
"settlement" : {
"mode" : "INTERNAL_BALANCE"
}
}
Response
Unique offramp identifier (UUID)
Offramp type: TEMPORARY or PERMANENT
Associated customer ID (UUID)
Generated crypto deposit address
Blockchain network: APTOS, BASE, CELO, ETHEREUM, POLYGON, SOLANA, or TRON
Stablecoin asset: USDC or USDT
Current offramp status. New offramps start as ACTIVE.
Settlement configuration Show settlement properties
Settlement mode: INTERNAL_BALANCE or NGN_PAYOUT
Associated rate identifier (nullable, present for NGN_PAYOUT)
settlement.destination_bank
Bank account details (present for NGN_PAYOUT) Show destination_bank properties
settlement.destination_bank.account_name
Bank account holder name
settlement.destination_bank.account_number
Bank account number
settlement.destination_bank.bank_code
Bank code
When the offramp was created (ISO 8601 timestamp)
When the offramp was last updated (ISO 8601 timestamp)
Success Responses
201 Created - Internal Balance
201 Created - NGN Payout
{
"id" : "a50e8400-e29b-41d4-a716-446655440000" ,
"type" : "TEMPORARY" ,
"customer_id" : "650e8400-e29b-41d4-a716-446655440000" ,
"address" : "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12" ,
"chain" : "ETHEREUM" ,
"asset" : "USDC" ,
"status" : "ACTIVE" ,
"settlement" : {
"mode" : "INTERNAL_BALANCE" ,
"rate_id" : null ,
"destination_bank" : null
},
"created_at" : "2026-01-05T15:04:05Z" ,
"updated_at" : "2026-01-05T15:04:05Z"
}
Error Responses
400 Bad Request - Missing customer
400 Bad Request - Invalid chain
400 Bad Request - Missing rate for NGN payout
400 Bad Request - Rate expired
400 Bad Request - Invalid bank details
400 Bad Request - Invalid account number
401 Unauthorized
429 Too Many Requests
{
"error" : {
"code" : "validation_error" ,
"message" : "either customer.customer_id or customer.email is required"
}
}
Validation Rules
Either customer.customer_id or customer.email must be provided (not both optional, at least one required).
Generates a short-lived crypto deposit address
For NGN_PAYOUT: settlement.rate_id and settlement.destination_bank are required
For INTERNAL_BALANCE: settlement.rate_id and settlement.destination_bank must NOT be set
Generates a long-lived crypto deposit address
Uses the current rate at the time of deposit settlement
For NGN_PAYOUT: settlement.rate_id and settlement.destination_bank are required
For INTERNAL_BALANCE: settlement.rate_id and settlement.destination_bank must NOT be set
When settlement.mode is NGN_PAYOUT:
destination_bank.account_name is required
destination_bank.account_number must be 6-32 characters
destination_bank.bank_code must be 3-16 characters
Always resolve the bank account first using POST /v1/banks/resolve before creating the offramp. Invalid bank accounts will be rejected.
Best Practices
Resolve bank account before creation (NGN payout)
Always call POST /v1/banks/resolve to verify the account number and get the account holder’s name before creating an offramp with NGN_PAYOUT. Invalid accounts will be rejected.
Get fresh rate before creation (NGN payout)
Call GET /v1/rates?side=SELL immediately before creating an offramp with NGN_PAYOUT to ensure maximum validity window.
Use customer_id for returning customers
Create customers once via POST /v1/customers, then reference them by customer_id in subsequent offramp requests.
Use idempotency keys
Always include a unique X-Idempotency-Key header to prevent duplicate offramp creation on retries.
Choose the right chain
Consider transaction fees and confirmation times when selecting a chain. See Supported Chains for details.
Next Steps
List Offramps Query offramps with filters
Get Rates Fetch current exchange rates before creating an offramp
Customer API Pre-create customers before offramp requests
Webhooks Listen for deposit and settlement events