Response Codes
Every API response includes aresponse_code field. The six possible values are:
Transaction Status Lifecycles
User Onramp Statuses
User Onramp Statuses
Onramp requests go through the following statuses as a user funds their cNGN wallet via bank transfer:Virtual account sub-statuses:
Lifecycle flow:
User Offramp Statuses
User Offramp Statuses
Offramp requests burn cNGN on-chain and pay out Naira to a Nigerian bank account:
Lifecycle flow:
FX Trade Statuses
FX Trade Statuses
FX trades execute against the Strails orderbook and have a strict 5-minute lock window:
Lifecycle flow:
A trade can only expire from
locked or signing states. Once the transaction reaches settling, it either completes or fails - it cannot expire.Swap Statuses
Swap Statuses
Auto-swaps are triggered after a successful onramp when
autoSwap is enabled:Fee Withdrawal Statuses
Fee Withdrawal Statuses
Fee withdrawals convert accumulated platform fees to Naira and send them to your registered bank account:
Common Error Codes
These error code strings appear in theerror field of a failed response and indicate the specific reason for the failure:
Common Issues
429 Too Many Requests
429 Too Many Requests
You have exceeded the rate limit for the endpoint.
- Implement exponential backoff: wait 1 s, then 2 s, then 4 s, etc., before retrying.
- Queue non-urgent requests client-side and dispatch them at a steady rate rather than in bursts.
- Cache responses where the underlying data does not change frequently (e.g. supported bank lists).
- See Rate Limits for per-endpoint limits. A
429response carries adata.retry_aftervalue in seconds - wait at least that long before retrying.
BVN Verification Fails
BVN Verification Fails
BVN verification will fail if any of the following are true:
- The BVN is not exactly 11 numeric digits. Whitespace, hyphens, or other characters cause an immediate
VALIDATION_ERROR. - The BVN is already registered to another Strails user.
- The identity provider could not resolve the BVN, or is temporarily unreachable (
response_code: "05").
/onboarduser request. You cannot retry the same onboarding record after a failed status - create a new one.Transaction Stuck in Pending
Transaction Stuck in Pending
A transaction that stays in
pending or processing for more than a few minutes may need intervention:- Call the relevant status endpoint (e.g.
/cngnofframpstatus,/onboardstatus) with therequestIdto get the latest status and any error detail. - If the status has not changed after 10 minutes, call
POST /manualstatusrecoverywith therequestId. This endpoint triggers a manual reconciliation check on the backend. - If the transaction is still stuck after a manual recovery attempt, contact support@strails.co with the
requestIdand timestamp.
Webhook Not Receiving Events
Webhook Not Receiving Events
Check the following if your webhook endpoint is not receiving events:
- Your webhook URL must use HTTPS. Plain HTTP endpoints are rejected.
- Verify the URL you registered via
/setwebhookis publicly reachable from the internet. Test it with webhook.site orngrok http 3000during local development. - Confirm your endpoint returns HTTP 200 within 10 seconds. Slow responses or non-200 status codes cause Strails to retry delivery with backoff.
- Re-check your webhook signature verification logic. A bug that raises an unhandled exception before the
200response is sent will cause the delivery to be marked as failed. - Inspect your server logs for any incoming POST requests that may have been silently rejected by a firewall or middleware.
Virtual Account Expired
Virtual Account Expired
Virtual accounts generated by
/cngnonramp are valid for 30 minutes only.- If a user does not complete the bank transfer before the expiry time, the virtual account status moves to
expiredand the onramp status moves tofailed. - You must create a new onramp request via
POST /cngnonrampto generate a fresh virtual account. You cannot reactivate an expired one. - Display the
expiresAttimestamp from/getvirtualaccountin your UI so users know how long they have.
Filter Values Reference
Use these values when querying list endpoints with thetype, status, side, and pair filters.
Deposits
Payouts
Transactions
FX Orders
FX Trades
Asset Withdrawals
Amount Format Reminders
Full per-endpoint breakdown: Amount Formatting.
If you cannot resolve an issue using this guide, email the Strails support team at support@strails.co with your
requestId, the full request payload (redact your API key), and the timestamp of the failed call.