Read this before integrating. These concepts appear throughout the API.
A payment intent is the central object. It represents "I expect a payment to
this address." When you create one (POST /intents), we:
derivation_index you use to track it.An intent records:
| Field | Meaning |
|---|---|
derivation_index | The stable integer id. Use this to poll status and reference the payment. |
address | The Solana deposit address to show the payer. |
mint | The asset accepted: null = native SOL, else an SPL mint address. |
mint_decimals | Decimals of the token (null for SOL). |
expected_lamports | Expected amount in base units (see below). null = accept any amount. |
received_lamports | Amount received so far, in base units. |
status | Lifecycle state (see below). |
reference | Your own id (order id, user id, memo). Optional, opaque to us. |
expires_at | When the payment window closes. Optional. |
Naming note: the fields are called
expected_lamports/received_lamportsfor historical reasons, but they hold base units of the intent's asset — lamports for SOL, token base units for an SPL token. Treat them as generic integer amounts.
Each intent accepts exactly one asset, chosen at creation:
mint → native SOL. Amounts are in lamports (1 SOL = 1,000,000,000
lamports).mint set → that SPL token. We fetch the mint's decimals on-chain
(which also validates it exists), and amounts are in the token's base units.Base units = the smallest indivisible unit. To convert:
base_units = ui_amount × 10^decimals
ui_amount = base_units ÷ 10^decimals
Examples:
500000000 lamports.100000000 base units.100000000000 base units.Both classic SPL Token and Token-2022 mints are supported automatically.
Once a payment arrives, we settle it automatically: sweep the funds to your
sweep destination, refund any excess, and so on. You don't trigger this — you
just observe the status.
status (and the derived action in /status, which is a friendlier alias):
| status | action | Meaning |
|---|---|---|
pending | waiting | Created, no payment detected yet. |
underpaid | underpaid | Received less than expected. Waiting for the rest. |
paid | paid | Received the expected amount (or any, for open-ended intents). About to sweep. |
overpaid | overpaid | Received more than expected. Will sweep expected + refund excess. |
sweeping / settling | paid | Settlement transaction in progress. |
swept | swept | Terminal success. Funds are in your destination wallet. |
refunding | refunding | Being refunded (expired with a partial balance). |
refunded | refunded | Terminal. Funds returned to the sender. |
expired | expired | Terminal. Window closed with nothing received. |
refund_failed / settle_failed | refund_failed | Terminal-ish. Automatic settlement/refund exhausted retries; contact support. |
The status you care about most is swept — that means the money is yours and
settlement tells you exactly how much.
pending → paid → sweeping → swept
pending → overpaid → settling → swept
(expected amount → your wallet; excess → back to sender)
pending → underpaid → (sender sends the rest) → paid → swept
pending → underpaid → (expires) → refunding → refunded
(the partial amount is returned to the sender)
settlement objectWhen an intent reaches swept, /status includes a settlement object — the
exact on-chain amounts that were delivered. This is your source of truth for
accounting:
"settlement": {
"asset": "SOL",
"decimals": 9,
"destination_amount": 499995000,
"destination_ui": 0.499995,
"platform_fee_amount": 0,
"platform_fee_ui": 0.0,
"signatures": ["4bd..."]
}
destination_amount — base units that reached your destination wallet
(net of platform fee, and for overpayments net of the refunded excess).platform_fee_amount — base units sent to your platform-fee wallet (0 if off).asset / decimals — so you can format correctly ("SOL" or the mint).signatures — the on-chain sweep transaction signature(s) for verification.
destination_amountcan be less thanreceived_lamports— that's expected.received_lamportsis the gross amount the payer sent;destination_amountis what you actually net after fees/refunds. Usesettlementfor accounting.
We handle these automatically:
token_refunds). SOL sent to a token intent is held for manual review.*_failed status for attention — never silently lost.Next: API reference →