NATIO developer documentation
One REST API for payments, refunds, payouts, transactions and settlements across multiple providers. Connect once, route by rule, and read a single object model no matter which provider processed the money.
What NATIO is
NATIO is a payment orchestration technology layer. It sits between your platform and the licensed payment providers you work with: acquirers, banks, PSPs and local payment methods. Your systems speak one contract to NATIO; NATIO speaks each provider dialect, decides where every payment goes, retries safely when a provider fails, and reports what happened attempt by attempt.
Three boundaries define the platform and they shape the whole API:
- Funds move between the merchant and licensed providers. NATIO never holds funds. Balances and settlements in the API describe what providers hold and settle, not a NATIO account.
GET /v1/balancesreturnscustodian: falsefor exactly this reason. - Card data never reaches NATIO. You send a payment method type, or a token reference issued by a PCI-compliant provider. Sensitive entry happens on provider-hosted pages.
POST /v1/payment-methodsrejects anything that looks like a card number. - Every decision is recorded. Risk evaluation, routing, each provider attempt and each failover are written to the payment timeline, so support and finance can answer “why did this go there” without a provider ticket.
What the API does
One request creates a payment. Inside that request NATIO evaluates risk rules, resolves a routing decision into an ordered list of eligible provider accounts, calls the first one, and — if the failure is retryable — calls the next. The response carries the final status for synchronous rails, or processing with a next_action for rails that need the customer (redirect or QR).
curl https://api.natio.me/v1/payments \
-H "Authorization: Bearer natio_sk_test_..." \
-H "Idempotency-Key: order-1001" \
-H "Content-Type: application/json" \
-d '{
"amount": 10000,
"currency": "USD",
"payment_method": "card",
"country": "US",
"reference": "ORD-1001"
}'The rest of the API is the same object read back in different shapes: the payment and its attempts, its timeline, its refunds, the ledger transactions it produced, the balances and settlements the providers report, and the webhook events that tell you about all of it without polling.
| Resource | What you do with it |
|---|---|
/v1/payments | Create, read, list, capture, cancel, refund. The core of the integration. |
/v1/payments/{id}/timeline | Every decision and provider interaction for one payment, in order. |
/v1/refunds/{id} | Read a refund created against a payment. |
/v1/payouts | Create, read, list and cancel payouts to beneficiaries. |
/v1/transactions | The ledger: one line per movement, with the provider reference used for reconciliation. |
/v1/balances | What the connected providers hold for the merchant, per currency and provider account. |
/v1/settlements | Provider settlement records and their line items. |
/v1/payment-methods | Store a provider token reference so it can be reused on later payments. |
/v1/webhooks/test | Send a test event to your configured endpoints while you build the receiver. |
/v1/test/scenarios | List the sandbox test scenarios, test keys only. |
The object model
A payment is the unit you create; everything else hangs off it. The relationship that matters most is payment → attempts → transactions: one payment can have several attempts across several providers, but only the attempts that actually moved money produce transactions.
| Object | Id prefix | What it is |
|---|---|---|
| payment | pay_… | The money movement you asked for: amount, currency, payment method, customer and the status of the whole operation. One payment can be tried at several providers. |
| attempt | att_… | One call to one provider account for one payment. Carries the provider, the normalised outcome, the provider code and message, the fee and the latency. Returned inline on the payment as attempts[]. |
| transaction | txn_… | The ledger line produced when money actually moved: a capture, a refund, a payout, a fee. Transactions are what reconciliation matches against the provider report. |
| refund | rf_… | A return of part or all of a captured payment, processed through the provider that took the payment. |
| payout | po_… | A payment out to a beneficiary, orchestrated through a provider that supports the destination rail. |
| settlement | stl_… | A provider settlement record: what a licensed provider settled to the merchant, for which period, with which fees. |
| webhook event | evt_… | An immutable record of something that happened, delivered to your endpoints and replayable from the dashboard. |
Payouts are the mirror image: they are created directly rather than derived from a payment, they are routed to a provider that supports the destination rail, and they produce their own transactions and settlement lines.
Base URLs and conventions
- Production
https://api.natio.me— requires a live key (natio_sk_live_…), which is issued after KYB approval.- Local development
http://localhost:4000— the server list in the API reference is read from the live OpenAPI document.- Versioning
- Every resource lives under the
/v1prefix. Breaking changes ship as a new prefix, not as a change to an existing one. - Authentication
Authorization: Bearer natio_sk_test_…ornatio_sk_live_…. The key determines merchant, project and mode.- Mode
- A key is either test or live. Test keys reach the demo providers only; live keys never accept
test_scenario. - Content type
application/jsonon every request with a body. Responses are JSON with ax-request-idheader.- Amounts
- Integers in the minor unit of the currency.
10000withUSDis 100.00 USD. - Idempotency
- Send
Idempotency-Keyon every mutating request; replays return the stored response. - Pagination
- Cursor based:
limit(1–200, default 50) andcursor, withnext_cursorandhas_moreon the list. - Spec
- OpenAPI 3.1 document, rendered in the API reference.
Supported payment method types: card, bank_transfer, qr, open_banking, wallet, instant, local. Supported currencies: USD, EUR, GBP, CHF, PLN, CZK, SEK, NOK, DKK, AED, SGD, HKD, JPY, AUD, CAD, BRL, MXN, INR, IDR, VND, THB, PHP, MYR, TRY, ZAR, NGN, KES, SAR, KZT.
Where to start
Sandbox account, first test key, first payment with a forced failover, the timeline and a verified webhook — in five steps.
Bearer keys, test versus live, rotation and revocation, IP allow-lists, rate-limit headers and request ids.
The demo providers, every test scenario with its exact behaviour, the hosted-page simulation and the provider report CSV.
Lifecycle and statuses, capture and cancel and refund, next_action, the route and attempts objects, the timeline and idempotency.
Event types, the payload envelope, signature verification in Node and Python, the retry schedule and delivery history.
The error envelope, error types and HTTP statuses, and the full failure dictionary grouped by retry category.
Every path and method rendered from the published OpenAPI 3.1 document, with parameters, bodies and responses.
No official SDKs yet: generate a client from the spec, or copy the typed TypeScript fetch wrapper.