Payments

# Payments and USDC checkout

All payment is in USDC. Credits are prepaid, denominated in US dollars (1 USDC buys US$1 of credit) and usable only for the service.

**On this page**

- [Choose a rail](https://inference.dagon.so/docs/payments#choose-a-rail)
- [Hosted USDC checkout](https://inference.dagon.so/docs/payments#hosted-usdc-checkout)
- [Refusals](https://inference.dagon.so/docs/payments#refusals)
- [Pay with any coin (NEAR Intents)](https://inference.dagon.so/docs/payments#pay-with-any-coin-near-intents)
- [Credits](https://inference.dagon.so/docs/payments#credits)

## Choose a rail

| Rail | Best for | Bounds |
| --- | --- | --- |
| [Hosted checkout](https://inference.dagon.so/docs/payments#hosted-usdc-checkout) | People with a browser wallet; USDC on Solana or other chains via Circle CCTP | $5 to $1,000 per top-up |
| [Wallet purchase](https://inference.dagon.so/docs/wallet-purchase) | Agents with a Solana wallet, no browser | $5 to $1,000 per purchase |
| [x402](https://inference.dagon.so/docs/x402) | Agents paying per request, no key | From $0.5 (top-ups from $1), at most $1,000 a payment |
| [Any coin (NEAR Intents)](https://inference.dagon.so/docs/payments#pay-with-any-coin-near-intents) | Paying in another asset or chain, swapped to USDC on Solana; when the operator enables it | Per the deposit bounds in `GET /v1/payment-methods`, and 1Click's chain minimums |

Across checkout, wallet purchases and x402, one account (a root and all its children) receives at most $2,000 of paid credit in any 24 hours: `402 paid_daily_cap_exceeded` past it. `GET /v1/payment-methods` reports what is enabled.

## Hosted USDC checkout

POST `/v1/credits/checkout`

Body `{"amount_usd": 20}`, whole cents, $5 to $1,000. Returns `201 {"session_id", "url"}`. Open `url` and pay; email is optional, because credits belong to the key. The page also offers **Pay from another chain**: USDC from an EVM chain Circle CCTP V2 supports, minted on Solana and forwarded to the treasury. Such a payment is credited net of the relayer's refuel fee, which `GET /v1/payment-methods` reports as `credits.zoneless.cross_chain_fee_micros`, capped at `cross_chain_fee_max_bps` of the amount.

- The credit posts once the payment is final. `POST /v1/credits/reconcile` asks for any paid checkouts of the key and posts them, if a credit seems late (30 per hour).
- Each key may open 10 checkouts an hour and hold 5 unpaid at once (`429 too_many_open_checkouts`).

Check before you approve

Our checkout runs only at `https://pay.dagon.so` and you reach it only from a top-up you start. Before approving, check the amount and that the destination matches, in full, the address on [official domains and payment addresses](https://inference.dagon.so/official).

## Refusals

| Answer | Meaning |
| --- | --- |
| `400 invalid_amount`, `amount_out_of_range` | Not whole cents, or outside the bounds. |
| `402 paid_daily_cap_exceeded` | The account received $2,000 of paid credit in the last 24 hours. |
| `403 payment_refused` | The paying wallet is on the OFAC sanctions list. |
| `451 location_blocked` | The service is not offered where the request comes from. |
| `503 geo_unavailable`, `payments_unavailable`, `checkout_unavailable` | Temporarily unavailable; retry after `Retry-After`. |

## Pay with any coin (NEAR Intents)

When the operator enables it (`NEAR_INTENTS=on`; `GET /v1/payment-methods` reports `credits.near_intents.enabled` with `min_micros`, `max_micros`, `fee_micros` and `deadline_minutes`), a key can pay in an asset and chain that [NEAR Intents](https://docs.near-intents.org/) 1Click, a third party, swaps into USDC on Solana. Dagon's minimum is $5; 1Click's per-chain minimums also apply. The gateway never holds the origin coin. Otherwise these routes answer `404 near_intents_disabled`. Not for lease keys (`400 not_topup_key`).

1. `GET /v1/credits/near-intents/assets` lists `asset_id`, `symbol`, `blockchain`, `decimals`, `price_usd` and `contract_address`.
2. POST `/v1/credits/near-intents`

   with `{"amount_usd": 20, "origin_asset": "<asset_id>", "refund_address": "<your address on the origin chain>"}`. The answer (`201`) is the deposit: `deposit_address`, `deposit_memo`, `amount_in` and `amount_in_formatted` (what to send, including 1Click's fees and slippage buffer), `min_amount_in`, `amount_micros` (the immutable USDC quote), `fee_snapshot_micros` (the immutable Dagon rail fee), `deadline` and a `qr_svg` of the address.
3. Send `amount_in` of the origin asset to `deposit_address`, with `deposit_memo` when set, before `deadline`.
4. A poller follows every deposit, including terminal deposits on a six-hour backfill; `POST /v1/credits/near-intents/:deposit_address/check` asks 1Click at once (120 an hour). `GET /v1/credits/near-intents` lists the key's newest 20, `GET /v1/credits/near-intents/:deposit_address` reads one.

| Status | Meaning |
| --- | --- |
| `open` | Waiting for the deposit. |
| `pending` | Deposit seen and swapping, or an incomplete deposit that NEAR Intents may return through its own mechanism at the deadline. |
| `credited` | Verified on Solana and posted: `credited_micros` from `received_micros` received after `fee_micros` in rail fees. |
| `returned_by_near_intents` | NEAR Intents returned the funds to `refund_address` through its own mechanism. |
| `failed` | 1Click failed the swap. |
| `expired` | The deadline passed with no deposit. |
| `held` | 1Click reported success, but the USDC could not be verified on chain (or a sanctions match). Nothing credited; the operator is alerted. |

- Credit posts only after the gateway checks every Solana destination transaction 1Click reports. A receipt must contain exactly one parsed USDC transfer whose amount equals the treasury account's complete transaction delta. Batched, unparsed, reused or otherwise ambiguous transfers are held and never credited as a whole transaction. Each unambiguous finalized transfer posts exactly once, including late and additional receipts. The current Dagon rail fee is 0%; settlement uses `fee_snapshot_micros` from the quote, never a later setting. The response keeps `amount_micros` as the quote and exposes aggregate `received_micros`, `fee_micros` and `credited_micros`.
- For a deposit below `min_amount_in`, one after the deadline, or a failed swap, NEAR Intents may return the origin asset to `refund_address` through its own mechanism, less its network fee. Dagon neither performs nor guarantees that return. Make sure the address is yours and can receive the asset.
- Dagon's minimum is $5. 1Click's larger chain minimums apply and are returned as `400 quote_rejected` with 1Click's message.
- The return address is screened against the OFAC SDN list at quote time and before credit. For USDC on Solana, the visible origin token-account owner and transfer authority are also screened; an exchange withdrawal exposes the exchange hot wallet, not its customer. Destination source evidence is screened too. A list or RPC outage, missing finality, or unresolved visible source fails closed until evidence is available. Other origin chains do not expose a reliable sender through 1Click.
- Each account may hold 3 unpaid deposits (`429 too_many_open_deposits`) and open 10 an hour. Open deposits count toward the daily cap.
- Other answers: `400 invalid_asset`, `invalid_refund_address`, `invalid_amount`, `amount_out_of_range`, `502 near_intents_unavailable`, `404 deposit_not_found`.

## Credits

- Credits are not money and have no cash value. They move only between keys under the same account.
- Credits are non-refundable except where the law requires otherwise; see the [terms of service](https://inference.dagon.so/terms).
- From 2026-11-27, credits still unused 365 days after the top-up that bought them may expire, except where the law requires otherwise.

Last updated 2026-11-10

[Previous **Endpoint reference**](https://inference.dagon.so/docs/endpoints) [Next **Wallet purchase**](https://inference.dagon.so/docs/wallet-purchase)
