Onramp intent
Move BRL into BRS tokens minted to a Solana wallet. Your backend creates the intent, Nora returns PIX deposit info, your user pays by PIX, and the tokens land.
An onramp intent is a single BRL → BRS mint. Your backend posts
the amount, the destination Solana wallet, and the chain; Nora returns
PIX deposit info you surface to your user. Once the PIX lands, Nora
mints BRS to the wallet and the intent reaches completed.
Flow
Create the intent
POST /v2/intents/onramp
| Field | Type | Required | Notes |
|---|---|---|---|
amountCents | integer | Yes | BRL amount in cents, not decimals. 100.00 BRL → 10000. Must be at least 500 (R$5.00 = 5 BRS minimum). |
destinationWallet | string | Yes | Solana address that will receive the minted BRS. 1–255 chars. |
chainId | string | Yes | "solana" or "polygon" is accepted on request, but today responses only emit "solana" — Polygon is not yet live on the response side. |
clientReference | string | No | Your own correlation ID, up to 255 chars. Echoed on the intent. |
Headers:
| Header | Value |
|---|---|
X-API-Key | Your API key. See Authentication. |
idempotency-key | Recommended. A UUID you pick (format-validated). Reuse on retries, regenerate on new user intents. See Idempotency. |
Example:
curl -X POST https://sandbox.api.nora.finance/v2/intents/onramp \
-H "X-API-Key: $NORA_API_KEY" \
-H "Content-Type: application/json" \
-H "idempotency-key: $(uuidgen)" \
-d '{
"amountCents": 10000,
"destinationWallet": "So11111111111111111111111111111111111111112",
"chainId": "solana",
"clientReference": "ord_123"
}'Response:
{
"id": "8f2a...",
"instanceId": "4e0b...",
"intentType": "onramp",
"flowVersion": 1,
"status": "awaiting_fiat_payment",
"statusReason": null,
"clientReference": "ord_123",
"metadata": null,
"expiresAt": "2026-04-22T12:30:00Z",
"createdAt": "2026-04-22T12:00:00Z",
"updatedAt": "2026-04-22T12:00:00Z",
"pixInfo": {
"brcode": "00020101021126580014BR.GOV.BCB.PIX...",
"txid": "abc123",
"amountCents": 10000,
"expiresAt": "2026-04-22T12:30:00Z"
},
"depositInstructions": null,
"chainId": "solana"
}Notable response fields:
intentType—"onramp"here.flowVersion— integer; pin on at least the version your code was written against.status— see the lifecycle table below for the full enum.
Render the PIX instructions
Surface pixInfo to the user: render brcode as a scannable QR code and
a copy-and-paste field. amountCents and expiresAt provide the payment
amount and deadline. PIX deposits expire — if the user hasn't paid by
expiresAt, the intent transitions to expired and you need a new intent
(with a fresh idempotency-key) to retry.
Track completion
Poll GET /v2/intents/:id or subscribe to webhooks. The full intent
status enum:
| Status | Terminal? | Notes |
|---|---|---|
created | no | Accepted server-side, not yet routed. |
requires_compliance | no | Held for compliance review. |
awaiting_fiat_payment | no | Waiting for the user's PIX. |
fiat_received | no | PIX confirmed by the rail. |
minting | no | BRS being minted on-chain. |
awaiting_onchain_transfer | no | |
awaiting_burn_approval | no | (offramp) — not seen on onramp. |
burn_approved | no | (offramp). |
onchain_received | no | |
burning | no | (offramp). |
paying_out | no | (offramp). |
completed | yes | Terminal success. |
expired | yes | PIX window closed before payment. |
canceled | yes | |
failed | yes | |
refunded | yes |
Gotchas
amountCents, notamount. Integer cents, not decimal BRL.- Minimum R$5.00 (5 BRS).
amountCentsbelow500is rejected at creation with a400— the floor mirrors the on-chainMintConfig.min_amount.
- Idempotency keys scope to "this user intent," not "this retry." Regenerate on a new form submission, reuse across network-level retries. See Idempotency.
- Response
chainIdis"solana"today. Even though the request accepts"polygon", the response-side chain enum is Solana-only for now.
See also
- Offramp intent — the reverse direction (BRS → BRL)
- Idempotency — key lifecycle
- API Reference: Intents — full endpoint spec
- Intents in the dashboard — operator-side view
Wallet whitelisting
Register a minter wallet via /v2/wallets, sign the grant with your whitelister wallet, and activate it. Two paths - prepared or self-built.
Offramp intent
Redeem BRS tokens for a BRL payout via PIX. Your backend creates the intent, your user signs the staged burn transaction on Solana, and the payout settles.