> ## Documentation Index
> Fetch the complete documentation index at: https://docs.paj.cash/llms.txt
> Use this file to discover all available pages before exploring further.

# Onramp

> Taking fiat from a user and delivering tokens to their wallet.

Onramp is money moving into crypto: your user pays naira, a token lands in a
wallet. Unlike [offramp](/concepts/offramp), there is only one route — you
[create an order](/api-reference/create-onramp-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

<Steps>
  <Step title="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`.
  </Step>

  <Step title="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.
  </Step>

  <Step title="Paj delivers the token">
    Once the transfer is confirmed, the token is sent to `recipient`. Nothing
    further is required from your integration.
  </Step>
</Steps>

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](/concepts/chains): 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](/concepts/rates) covers
this). `businessUSDCFee` is for charging *beyond* that, and it is added on top
rather than skimmed off: a user buying $10 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.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.