Skip to main content
The Transactions API handles every financial operation in Strails. You can fund user wallets by converting Naira to cNGN (onramp), return cNGN back to a Nigerian bank account (offramp), swap between cNGN, USDC, and USDT (swap), and withdraw assets to external wallets (transfer). Most operations are asynchronous - each call returns a requestId you can use to poll for the final status or receive a webhook notification.

Endpoints Overview


User Onramp

POST /cngnonramp Creates a temporary Smart Wallet and a bank transfer instruction so your end-user can fund their wallet by paying Naira into a virtual account. After the bank transfer is confirmed, cNGN is disbursed to the generated wallet.
Use the /getvirtualaccount endpoint to retrieve the virtual bank account details for payment. The generated account is only active for 30 minutes after creation.
Payment into the generated virtual account must originate from the verified bank account of the Strails end-user. Payments from unverified accounts will not be processed.
The amount field is denominated in Naira. For example, 500 means ₦500 - not 500 kobo or 500 token units.
string
required
Unique identifier (hash or UUID) of the end-user initiating the onramp.
number
required
Amount to fund in Naira (e.g. 500 = ₦500). Must be greater than 0.
string
The token to swap cNGN into after funding (e.g. USDC, USDT). Only used when autoSwap is true.
boolean
When true, automatically swaps the funded cNGN into assetSwap after the bank payment is confirmed.
boolean
When true, automatically routes the funded (and optionally swapped) amount to the user’s default wallet after confirmation - their Strails-managed Smart Wallet, or their external default wallet if one is registered. When set, destinationAssetSwap is ignored.
string
Destination wallet address for the swapped assets. Only used when autoSwap is true and sweepToOfframp is false.
string
Your EOA wallet address to take ownership of the generated Smart Wallet. When set, you can withdraw tokens directly using your EOA. Note that Strails cannot withdraw funds from wallets with a custom owner.

autoSwap behaviour matrix

“User’s default Smart Wallet” resolves to the user’s external default wallet when one is registered. Because Strails cannot sign for external addresses, plan subsequent swap or offramp operations against a Strails-managed wallet.
object
Response
Error responses
Validation error
User not found

User Offramp

POST /cngnofframp Converts cNGN held in a user’s Smart Wallet to Naira and initiates a bank transfer to the specified account. The call returns immediately with a requestId; the actual bank transfer completes asynchronously.
The amount field is denominated in Naira (e.g. 5000 = ₦5,000), not in token units or kobo.
string
required
Unique identifier (hash or UUID) of the user initiating the offramp.
number
required
Amount to convert and transfer in Naira (e.g. 5000 = ₦5,000). Must be greater than 0.
string
required
The destination bank account number (10 digits).
string
required
The NIBSS bank identifier code (e.g. 058 for GTBank). Use /getbankscode to get a full list.
string
required
The asset symbol being off-ramped (e.g. CNGN).
Response
Error responses
Validation error
Insufficient balance
No funded wallet
User not found

Fintech Onramp

GET /getfintechvirtualaccount Returns the persistent virtual bank account assigned to your fintech. Any Naira payment received on this account is automatically converted to cNGN and credited to your fintech Smart Wallet.
Use /getfintechwallet to find your Smart Wallet address - that is where disbursed cNGN is credited after a deposit is confirmed.
For full virtual account management (including per-user virtual accounts and fee configuration), see the Virtual Accounts API page.
Response

Fintech Offramp

POST /initiateofframp Converts cNGN from your fintech Smart Wallet to Naira and initiates a payout to a configured bank account. Returns a requestId immediately; the transfer completes asynchronously.
The amount field must be provided in the lowest token unit (cNGN has 6 decimals). For example, 1000000 represents 1.00 cNGN, not ₦1,000,000 - to off-ramp 1,000 cNGN send 1000000000. Use /listbankaccounts to find your bankAccountId.
number
required
Amount to transfer in the lowest token unit (e.g. 1000000 = 1.00 cNGN, 1000000000 = 1,000.00 cNGN). Must be greater than 0.
string
required
UUID of the destination bank account, as returned by /addbankaccount.
Response
Error responses
Validation error
Bank account not found
Insufficient balance

User Token Withdrawal

POST /withdrawasset Withdraws a token from a user’s internal Smart Wallet to an external destination wallet. Supports multi-chain transfers - set the network parameter to route the withdrawal through a bridge to a non-Base chain.
string
required
Unique identifier (hash or UUID) of the user initiating the withdrawal.
string
required
The user’s internal (source) wallet address on the platform.
string
required
The external destination address to receive the withdrawn tokens.
number
required
Amount to withdraw in human-readable token units (e.g. 100 = 100 cNGN). Must be greater than 0. Note this differs from /fintechtransfer, which takes the lowest token unit.
string
required
Asset symbol to withdraw (e.g. CNGN, USDC, USDT).
string
Target network for the withdrawal. When set, Strails routes the transfer through a bridge. Supported values: base, bsc, sol, eth, xbn, asc, arc, lisk. Defaults to base if not provided.
Response
Error responses
Validation error
User not found
Insufficient balance

Fintech Token Withdrawal

POST /fintechtransfer Transfers tokens from your fintech Smart Wallet to a registered external wallet. The destination address must already be whitelisted via /addexternalwallet before you call this endpoint.
You must whitelist the destination address before calling /fintechtransfer. Use /addexternalwallet to register the address first.
The amount field must be in the lowest currency unit. For example, 5000000 = 5.0 cNGN (cNGN uses 6 decimal places). Active orders and escrows reduce the available balance - the API will reject the transfer if the net balance after commitments is insufficient.
string
required
Ethereum address of the destination wallet. Must be a wallet already registered via /addexternalwallet.
number
required
Amount to transfer in the lowest token unit (e.g. 5000000 = 5.0 cNGN). Note this differs from /withdrawasset, which takes human-readable token units.
string
Token symbol to transfer: CNGN (default), USDC, or USDT.
string
Optional memo for internal record-keeping (max 500 characters).
Response
Error responses
Destination not registered
Insufficient balance

cNGN Onramp Status

POST /cngnonrampstatus Returns the current status of a user onramp request, including virtual account details, funding timestamps, and any active FX quote.
string
required
The Smart Wallet address returned by /cngnonramp.
Response

cNGN Offramp Status

POST /cngnofframpstatus Returns the current status of a user offramp request, including on-chain token transfer details and the fiat payout outcome.
string
required
The requestId returned by /cngnofframp.
Response

Fintech Offramp Status

GET /getofframpstatus Returns the current status of a fintech offramp request initiated via /initiateofframp.
string
required
The requestId returned by /initiateofframp.
Response

List Deposits

GET /deposits Returns a paginated list of deposit transactions. Filter by type (fintech_deposit for direct fintech deposits, user_onramp for end-user onramps), status, date range, and user.
string
Transaction type filter. One of fintech_deposit or user_onramp.
string
Filter by end-user ID. Only applicable when type is user_onramp.
string
Filter by status. One of pending, processing, completed, failed, or cancelled.
string
ISO 8601 start of the date range (e.g. 2026-01-01T00:00:00Z).
string
ISO 8601 end of the date range (e.g. 2026-01-31T23:59:59Z).
number
Maximum number of results to return. Defaults to 20, maximum 100.
number
Pagination offset. Defaults to 0.
Response

List Payouts

GET /payouts Returns a paginated list of payout transactions. Filter by type (fintech_offramp for fintech-initiated payouts, user_offramp for end-user offramps), status, date range, and user.
string
Transaction type filter. One of fintech_offramp or user_offramp.
string
Filter by end-user ID. Only applicable when type is user_offramp.
string
Filter by status. One of pending, processing, completed, failed, or cancelled.
string
ISO 8601 start of the date range.
string
ISO 8601 end of the date range.
number
Maximum number of results to return. Defaults to 20, maximum 100.
number
Pagination offset. Defaults to 0.
Response

List Transactions

GET /transactions Returns a paginated list of all transactions - both deposits and payouts - with a combined summary. Use direction to separate inbound from outbound flows.
string
Filter by flow direction. in for deposits, out for payouts.
string
Filter by type. One of fintech_deposit, user_onramp, fintech_offramp, or user_offramp.
string
Filter by end-user ID.
string
Filter by status. One of pending, processing, completed, failed, or cancelled.
string
ISO 8601 start of the date range.
string
ISO 8601 end of the date range.
number
Maximum number of results to return. Defaults to 20, maximum 100.
number
Pagination offset. Defaults to 0.
Response

Withdraw History

GET /withdrawals Returns a paginated list of token withdrawal transfers, including fintech self-transfers, fintech withdrawals on behalf of users, and direct user withdrawals. Filter by token ticker, status, transfer type, user, date range, and pagination.

Available query parameters

string
Token ticker, e.g. CNGN.
string
Filter by status. One of pending, completed, or failed.
string
Filter by transfer type. One of fintech_self_transfer, fintech_user_withdrawal, or user_withdrawal.
string
Filter by end-user hash/id. Only applicable when type includes user-related withdrawals.
string
ISO 8601 start of the date range.
string
ISO 8601 end of the date range.
number
Maximum number of results to return. Defaults to 20.
number
Pagination offset. Defaults to 0.
Response

Swap Trigger

POST /swaptrigger Queues an asynchronous token swap for a specific wallet address. The swap is processed in the background - use /swapstatus with the returned requestId to poll for completion.
string
required
The Smart Wallet address generated during a /cngnonramp request.
string
required
The token to sell. One of CNGN, USDC, or USDT.
string
The token to buy. One of CNGN, USDC, or USDT. Falls back to the wallet’s configured tokenBuy if not provided.
number
Human-readable amount of sellToken to swap. Falls back to the wallet’s funded amount if not provided.
number
Maximum acceptable slippage percentage. Defaults to 5.
Response
Error responses
Validation error
Insufficient liquidity

User Swap

POST /swap Requests a token swap on a user’s default Smart Wallet. Primarily used for USDC -> cNGN conversions. The swap is processed asynchronously - use /swapstatus with the returned requestId to track completion.
string
required
The token to sell. One of USDC, USDT, or CNGN.
string
required
The token to buy. One of USDC, USDT, or CNGN.
number
required
Human-readable amount to swap (e.g. 100.50 = 100.50 USDC).
string
required
Unique identifier (hash or UUID) of the verified end-user.
number
Maximum acceptable slippage percentage. Defaults to 2.
string
The user’s Smart Wallet address to execute the swap from. If not provided, the user’s default Smart Wallet is used.
string
Alternative destination wallet for the output tokens. If not provided, output tokens are sent to the user’s default Smart Wallet.
Response
Error responses
Validation error
User not found
Insufficient balance

Swap Status

GET /swapstatus Returns the current status of an asynchronous swap request. Use the requestId returned from either /swaptrigger or /swap.
string
required
The requestId returned by /swaptrigger or /swap.
Response
Error response
Request not found

Swap History

GET /swaphistory Returns a paginated list of historical swap requests for your fintech. Use this endpoint to reconcile completed, requested, and failed swaps without polling each requestId individually.
number
Maximum number of results to return. Defaults to 20.
number
Pagination offset. Defaults to 0.
string
Filter by swap status. One of requested, completed, or failed.
string
ISO 8601 start of the date range (e.g. 2026-01-01T00:00:00Z).
string
ISO 8601 end of the date range (e.g. 2026-01-31T23:59:59Z).
Response
array
List of swap records. Each entry contains the swap’s requestId, status, sellToken, buyToken, amountIn, amountOut, executionRate, smartWalletAddress, txHash, triggerType, and timestamps.
object
Pagination metadata including total, limit, offset, and hasMore.