Legacy: Create an onramp
Onramps
Legacy: Create an onramp
Legacy route for creating an NGN receive flow
POST
Legacy: Create an onramp
Overview
Create an onramp through the legacy compatibility route. New integrations should usePOST /v1/funding-accounts with rail: NGN_VIRTUAL_ACCOUNT.
Authentication
string
required
Your merchant API key
string
required
Unique idempotency key to prevent duplicate onramp creation
Request Body
string
required
Onramp typeAllowed values:
TEMPORARY, PERMANENTTEMPORARY: Short-lived VA (25 minutes), locked torate_idPERMANENT: Long-lived VA, uses current rate at settlement
object
required
Customer information. Either
customer_id or email must be provided.string
Rate identifier from
GET /v1/ratesExample: rate_8x7k2mq9pRequired for temporary onramps. Not allowed for permanent onramps.
integer
Principal amount in NGN before any payment-provider collection charge. The exact amount the customer must transfer is returned as
amount in the create response.Example: 50000Required for temporary onramps. Ignored for permanent onramps.
object
Optional fee that your merchant account keeps from each onramp deposit. Omit to use
0%.object
required
Settlement configuration
Request Examples
Response
Temporary Onramp Response
string
required
Unique identifier for this onramp
string
required
TEMPORARYstring
required
Current onramp status. New onramps start as
ACTIVE.string
required
Exact amount the customer must transfer in NGN. The payment provider may add a collection charge, so this can differ from the
amount submitted in the request. Required and always returned for temporary onramps as a decimal string. Display and transfer this value exactly; do not recalculate or round it.Example: "50000.50"string
required
Associated rate identifier
string
required
Unique payment reference for the transfer
object
required
Developer fee percentage used for deposits received through this onramp.
object
required
NGN bank account details for receiving deposits
string
required
When onramp expires (~25 minutes from creation)
object
required
Settlement configuration (same as request)
string
required
When onramp was created (ISO 8601 timestamp)
Permanent Onramp Response
string
required
PERMANENTstring
required
Unique identifier for the permanent onramp configuration
string
required
Identifier of the currently active settlement configuration
string
required
The customer this permanent onramp belongs to
object
required
Active settlement configuration
object
required
Permanent NGN bank account details
Success Responses
Error Responses
Validation Rules
Customer identification
Customer identification
Either
customer.customer_id or customer.email must be provided (not both optional, at least one required).Temporary onramp rules
Temporary onramp rules
rate_idis required and must be a valid, non-expired rate snapshotamountis required- Settlement modes:
ONCHAINorINTERNAL_BALANCE customer.verificationis not required- For
ONCHAIN:chainanddestination_addressare required - For
INTERNAL_BALANCE:chainanddestination_addressmust NOT be set
Permanent onramp rules
Permanent onramp rules
rate_idmust not be providedamountis silently ignored- Settlement modes:
ONCHAINorINTERNAL_BALANCE - For
ONCHAIN:chainanddestination_addressare required - For
INTERNAL_BALANCE:chainanddestination_addressmust NOT be set - If
customer.customer_idis not provided,customer.verificationwithbvn,phone_number, andimage_urlis required - If
customer.customer_idis provided, the customer must either be already verified orcustomer.verificationmust be included
Verification (permanent onramps)
Verification (permanent onramps)
Verification uses BVN + phone number + face matching via an identity provider.Two paths:New customer (
customer.email provided, no customer_id):customer.verificationis required withbvn,phone_number, andimage_url- The system creates or finds the customer by email, runs verification, then provisions the virtual account
customer.customer_id provided):- If already verified: proceeds directly
- If not verified +
customer.verificationprovided: runs verification first - If not verified + no verification data: returns error
Permanent Onramp Behavior
Settlement updates: If a permanent onramp already exists for a customer, calling this endpoint again updates the settlement configuration (chain, address) without creating a new virtual account. The previous settlement is deactivated and the new one becomes active.
Virtual accounts for permanent onramps do not expire. The same account number is reused across settlement updates.
Best Practices
1
Get fresh rate before creation (temporary)
Always call
GET /v1/rates immediately before creating a temporary onramp to ensure maximum validity window.2
Validate destination address
Use a blockchain library to validate addresses before submitting:
3
Use customer_id for returning customers
Create customers once via
POST /v1/customers, then reference them by customer_id in subsequent onramp requests.4
Handle verification errors gracefully
For permanent onramps, verification may fail due to invalid BVN, face mismatch, or provider issues. Handle
400 VALIDATION_FAILED and 502 INTEGRATION_FAILED separately.5
Use idempotency keys
Always include a unique
X-Idempotency-Key header to prevent duplicate onramp creation on retries.Rate Limits
- 1,000 onramp creations per day per merchant
- 100 API requests per minute per key
Next Steps
List Deposits
Query deposits for an onramp
Customer API
Pre-create customers before onramp requests