Skip to main content
POST
Legacy: Create an offramp

Overview

Create an offramp through the legacy compatibility route. New integrations should use POST /v1/funding-accounts with rail: CRYPTO_ADDRESS, asset, and chain.

Authentication

X-Api-Key
string
required
Your merchant API key
X-Idempotency-Key
string
required
Unique idempotency key to prevent duplicate offramp creation

Request Body

type
string
required
Offramp typeAllowed values: TEMPORARY, PERMANENT
  • TEMPORARY: Short-lived deposit address, locked to rate_id. Must use NGN_PAYOUT settlement.
  • PERMANENT: Long-lived deposit address, uses current rate at settlement. Supports both INTERNAL_BALANCE and NGN_PAYOUT settlement.
customer
object
required
Customer information. Either customer_id or email must be provided.
chain
string
required
Blockchain network for the deposit addressAllowed values: APTOS, BASE, CELO, ETHEREUM, POLYGON, SOLANA, TRONSee Supported Chains for details on which assets are available on each chain.
asset
string
required
Stablecoin asset to receiveAllowed values: USDC, USDT
developer_fee
object
Optional fee that your merchant account keeps from each offramp deposit. Omit to use 0%.
settlement
object
required
Settlement configuration

Request Examples

Response

id
string
required
Unique offramp identifier (UUID)
type
string
required
Offramp type: TEMPORARY or PERMANENT
customer_id
string
required
Associated customer ID (UUID)
address
string
required
Generated crypto deposit address
chain
string
required
Blockchain network: APTOS, BASE, CELO, ETHEREUM, POLYGON, SOLANA, or TRON
asset
string
required
Stablecoin asset: USDC or USDT
status
string
required
Current offramp status. New offramps start as ACTIVE.
developer_fee
object
required
Developer fee percentage used for deposits received through this offramp.
settlement
object
required
Settlement configuration
created_at
string
required
When the offramp was created (ISO 8601 timestamp)
updated_at
string
required
When the offramp was last updated (ISO 8601 timestamp)

Success Responses

Error Responses

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
  • Settlement mode must be NGN_PAYOUTINTERNAL_BALANCE is not supported on temporary offramps
  • settlement.rate_id and settlement.destination_bank are required
  • Generates a long-lived crypto deposit address
  • Uses the current rate at the time of deposit settlement
  • Supports both INTERNAL_BALANCE and NGN_PAYOUT settlement modes
  • 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

1

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.
2

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.
3

Use customer_id for returning customers

Create customers once via POST /v1/customers, then reference them by customer_id in subsequent offramp requests.
4

Use idempotency keys

Always include a unique X-Idempotency-Key header to prevent duplicate offramp creation on retries.
5

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