Skip to main content
Onramp is money moving into crypto: your user pays naira, a token lands in a wallet. Unlike offramp, there is only one route — you create an order for each purchase. There is no standing equivalent of a bank account address here, because fiat has to arrive somewhere Paj can attribute it, and that means an account opened for the occasion.

The shape of it

1

Open the order

Say how much, in either direction — fiatAmount if your user is spending a set amount of naira, amount if they want a set quantity of token. Name the recipient wallet, the mint, and the chain.
2

Show the account

The response carries a virtual bank account: accountNumber, bank, and the exact fiatAmount to transfer. Your user pays it from their own bank.
3

Paj delivers the token

Once the transfer is confirmed, the token is sent to recipient. Nothing further is required from your integration.
The virtual account belongs to that one order and expects that one amount. It is not a standing account to reuse for a user’s next purchase — open a fresh order each time.

Where the token lands

Onramp delivers on every supported chain: Solana, TON, Ethereum, Base, BNB Smart Chain, Monad and Arc. recipient is a wallet on the chain you name, and mint is the token to deliver there. Buying the chain’s settlement stablecoin — USDC, or USDT on TON — is a plain transfer. Any other token is bought as that stablecoin and swapped on-chain, with the swap’s output delivered straight to recipient, so what arrives can differ slightly from the quote by the swap’s slippage. On TON, set mint to "TON" to deliver Toncoin, or to a jetton master address for anything else.

The amount in the account name

accountName comes back looking like Paj Inc.(Pay NGN 1,500.00). The figure is embedded deliberately: it shows up inside your user’s own banking app while they are entering the transfer, where a mistyped amount is otherwise easy to miss. Show it as-is, but drive your own interface from fiatAmount — reading the number back out of the name is fragile.

Charging for it

The rate already includes the spread configured for your business, so you are earning on every order without doing anything (Rates covers this). businessUSDCFee is for charging beyond that, and it is added on top rather than skimmed off: a user buying 10witha‘0.5‘feepaysthenairaequivalentof10 with a `0.5` fee pays the naira equivalent of 10.50 and still receives the full $10 of token. It is denominated in the chain’s settlement stablecoin, so on TON a fee of 0.5 means 0.5 USDT.

First purchases cost slightly more on Solana

A wallet that has never held a given token on Solana needs an account created for it before the token can arrive, and that costs rent. Paj charges it to the order. You do nothing differently — but a user’s first purchase of a token can come out marginally more expensive than their second, which is the sort of thing that generates a support ticket if nobody expects it.

Following the order

An order opens at INIT and waits for the transfer. It moves to PROCESSING when the payment is confirmed and finishes at COMPLETED once the token has reached recipient — including any swap, which happens as part of delivery. ERROR is the other terminal state. Each transition is posted to a webhook as it happens, in the same shape as the response that created the order. Name one per order with webhookURL, or leave it out and the rampWebhookURL configured on your API key is used. With neither, you are polling. Unpaid orders are deleted 72 hours after creation. Treat the quote as good for that window and open a new order rather than sending a user back to a stale account.