Reference

API reference

One integration for payments, payouts, transactions and settlements across multiple providers. NATIO is a payment orchestration layer: funds move between the merchant and licensed payment providers. All amounts are integers in the currency's minor unit (e.g. 1000 = 10.00 USD).

Rendered from the live specification
This page is generated at request time from the OpenAPI 3.1.0 document served by the API — 23 operations across 9 tag groups. The raw document is at /openapi.json.

Servers

URLEnvironment
https://api.natio.meProduction
http://localhost:4000Local development

Authentication

SchemeTypeHow it is sentNotes
apiKeyhttp · bearerAuthorization: Bearer <key>API key: sk_test_... (sandbox) or sk_live_... (production)

Every operation requires apiKey unless it says otherwise. See Authentication for key modes, rotation and IP allow-lists.

Index

Payments

POST/v1/checkout-sessions

Create a hosted checkout session

Server-to-server only. Accepts an API or restricted redirect key. Requires an HTTPS return_url. Raw card details, saved tokens and crypto are not supported by this endpoint. Verify signed webhooks or API status after returning. A null url means no customer redirect is available.

Parameters
NameInRequiredTypeDescription
Idempotency-Keyheaderoptionalstring(max length 255)Unique key per logical request. Replays return the original response; reuse with a different body returns 422.
Request bodyrequired·CreatePaymentRequest
FieldTypeNotes
traffic_typeTrafficType
amountrequiredintegerMinor unitsmin 1
currencyrequiredstringmax length 3
payment_methodrequiredPaymentMethodType | object
capture_methodstringautomatic · manual
countrystringmax length 2
customerCustomerInput
descriptionstringmax length 500
referencestringYour order idmax length 128
return_urlstring <uri>
metadataobject
test_scenariostringSandbox only. See GET /v1/test/scenarios.
deviceobject
└ipstring
└user_agentstring
└fingerprintstring
Example request
{
  "amount": 10000,
  "currency": "USD",
  "payment_method": "card",
  "country": "US",
  "reference": "ORD-1001",
  "customer": {
    "external_id": "cust_42",
    "email": "buyer@example.com"
  },
  "test_scenario": "failover"
}
Responses
StatusDescriptionBody
201Checkout created or idempotently replayed—
403Key scope, merchant eligibility or environment does not permit this request—
422Invalid checkout request—
GET/v1/payments

List payments

Parameters
NameInRequiredTypeDescription
statusqueryoptionalstringComma-separated statuses
currencyqueryoptionalstring
countryqueryoptionalstring
payment_methodqueryoptionalstring
referencequeryoptionalstring
searchqueryoptionalstring
fromqueryoptionalstring <date-time>
toqueryoptionalstring <date-time>
limitqueryoptionalinteger(default 50 · min 1 · max 200)
cursorqueryoptionalstringnext_cursor from the previous page
Responses
StatusDescriptionBody
200Paginated listPaymentList
POST/v1/payments

Create a payment

Creates a payment and runs it through risk evaluation, routing and provider orchestration synchronously. The response contains the final status for synchronous methods, or processing with next_action for asynchronous methods (redirect, QR). Send an Idempotency-Key header to make retries safe.

Parameters
NameInRequiredTypeDescription
Idempotency-Keyheaderoptionalstring(max length 255)Unique key per logical request. Replays return the original response; reuse with a different body returns 422.
Request bodyrequired·CreatePaymentRequest
FieldTypeNotes
traffic_typeTrafficType
amountrequiredintegerMinor unitsmin 1
currencyrequiredstringmax length 3
payment_methodrequiredPaymentMethodType | object
capture_methodstringautomatic · manual
countrystringmax length 2
customerCustomerInput
descriptionstringmax length 500
referencestringYour order idmax length 128
return_urlstring <uri>
metadataobject
test_scenariostringSandbox only. See GET /v1/test/scenarios.
deviceobject
└ipstring
└user_agentstring
└fingerprintstring
Example request
{
  "amount": 10000,
  "currency": "USD",
  "payment_method": "card",
  "country": "US",
  "reference": "ORD-1001",
  "customer": {
    "external_id": "cust_42",
    "email": "buyer@example.com"
  },
  "test_scenario": "failover"
}
Responses
StatusDescriptionBody
201Payment created and processedPayment
401Missing or invalid API keyError
409Invalid state transition or idempotency conflictError
422Validation failedError
429Too many requestsError
GET/v1/payments/{id}

Retrieve a payment

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200PaymentPayment
404Resource not foundError
GET/v1/payments/{id}/timeline

Payment timeline

Ordered narrative of everything NATIO did for the payment: risk, routing, provider attempts, failover, webhooks.

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200Timeline—
POST/v1/payments/{id}/capture

Capture an authorized payment

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Idempotency-Keyheaderoptionalstring(max length 255)Unique key per logical request. Replays return the original response; reuse with a different body returns 422.
Request body
FieldTypeNotes
amountintegerMinor units; defaults to the full authorized amount
Responses
StatusDescriptionBody
200CapturedPayment
409Invalid state transition or idempotency conflictError
POST/v1/payments/{id}/cancel

Cancel a payment

Cancels a created, pending, authorized or customer-action payment. Payments that are being sent to a provider cannot be cancelled.

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Idempotency-Keyheaderoptionalstring(max length 255)Unique key per logical request. Replays return the original response; reuse with a different body returns 422.
Request body
FieldTypeNotes
reasonstring
Responses
StatusDescriptionBody
200CancelledPayment
409Invalid state transition or idempotency conflictError

Refunds

POST/v1/payments/{id}/refund

Refund a payment

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Idempotency-Keyheaderoptionalstring(max length 255)Unique key per logical request. Replays return the original response; reuse with a different body returns 422.
Request body
FieldTypeNotes
amountintegerMinor units; defaults to the remaining refundable amount
reasonstring
metadataobject
Responses
StatusDescriptionBody
201RefundRefund
409Invalid state transition or idempotency conflictError
GET/v1/payments/{id}/refunds

List refunds of a payment

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200Refunds—
GET/v1/refunds/{id}

Retrieve a refund

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200RefundRefund

Payouts

GET/v1/payouts

List payouts

Parameters
NameInRequiredTypeDescription
statusqueryoptionalstring
limitqueryoptionalinteger(default 50 · min 1 · max 200)
cursorqueryoptionalstringnext_cursor from the previous page
Responses
StatusDescriptionBody
200Payouts—
POST/v1/payouts

Create a payout

Sends funds to a beneficiary through a licensed provider selected by the payout routing rules. Destinations are tokenised references; raw account numbers are never accepted.

Parameters
NameInRequiredTypeDescription
Idempotency-Keyheaderoptionalstring(max length 255)Unique key per logical request. Replays return the original response; reuse with a different body returns 422.
Request bodyrequired·CreatePayoutRequest
FieldTypeNotes
amountrequiredintegermin 1
currencyrequiredstring
destinationrequiredobject
└typerequiredstringbank_account · wallet · card_token
└tokenstringProvider beneficiary token
└displayrequiredstringMasked display value
└holder_namestring
└countrystring
descriptionstring
referencestring
metadataobject
test_scenariostringsuccess · technical_error · hard_decline · unavailable · timeout
Example request
{
  "amount": 250000,
  "currency": "EUR",
  "destination": {
    "type": "bank_account",
    "token": "benef_tok_8f3a",
    "display": "IBAN ****4321",
    "holder_name": "Acme GmbH",
    "country": "DE"
  },
  "reference": "PAYOUT-2026-09-001"
}
Responses
StatusDescriptionBody
201PayoutPayout
422Validation failedError
GET/v1/payouts/{id}

Retrieve a payout

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200PayoutPayout
POST/v1/payouts/{id}/cancel

Cancel a payout

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200CancelledPayout
409Invalid state transition or idempotency conflictError

Transactions

GET/v1/transactions

List transactions

Ledger-style records of every financial movement (payments, refunds, payouts), including failed ones for monitoring.

Parameters
NameInRequiredTypeDescription
typequeryoptionalstringpayment · refund · payout · fee · adjustment
statusqueryoptionalstring
currencyqueryoptionalstring
provider_account_idqueryoptionalstring
fromqueryoptionalstring <date-time>
toqueryoptionalstring <date-time>
limitqueryoptionalinteger(default 50 · min 1 · max 200)
cursorqueryoptionalstringnext_cursor from the previous page
Responses
StatusDescriptionBody
200Transactions—

Balances

GET/v1/balances

Processed and settled amounts per currency

NATIO is not a custodian. Figures are derived from processed transactions and settlement data reported by providers.

Responses
StatusDescriptionBody
200Balances—

Settlements

GET/v1/settlements

List provider settlements

Parameters
NameInRequiredTypeDescription
statusqueryoptionalstring
provider_account_idqueryoptionalstring
Responses
StatusDescriptionBody
200Settlements—
GET/v1/settlements/{id}

Retrieve a settlement with its items

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200SettlementSettlement

Payment methods

POST/v1/payment-methods

Store a tokenised payment method reference

Stores a reference to a token issued by a PCI-compliant provider. NATIO never accepts card numbers or CVV.

Request bodyrequired
FieldTypeNotes
typerequiredPaymentMethodType
provider_tokenrequiredstring
provider_codestring
customerCustomerInput
displayobject
Responses
StatusDescriptionBody
201StoredPaymentMethod
GET/v1/payment-methods/{id}

Retrieve a payment method

Parameters
NameInRequiredTypeDescription
idpathrequiredstring
Responses
StatusDescriptionBody
200Payment methodPaymentMethod

Webhooks

POST/v1/webhooks/test

Send a test event to your webhook endpoints

Request body
FieldTypeNotes
event_typestringdefault "payment.successful"
Responses
StatusDescriptionBody
200Queued—

Sandbox

GET/v1/test/scenarios

List sandbox test scenarios

Responses
StatusDescriptionBody
200Scenarios—
GET/v1/me

Identify the API key's merchant, project and mode

Responses
StatusDescriptionBody
200Identity—

Schemas

The component schemas referenced above. Every $ref in the document points into this section.

Error

FieldTypeNotes
errorobject
└typestringinvalid_request_error · authentication_error · permission_error · not_found_error · idempotency_error · rate_limit_error · state_error · provider_error · risk_error · internal_error
└codestring
└messagestring
└paramstring
└detailsany
request_idstring

PaymentMethodType

string·card · bank_transfer · qr · open_banking · wallet · instant · local

TrafficType

Merchant-declared first or returning deposit cohort; never inferred from local history.

string·ftd · std · unknown

PaymentStatus

string·created · pending · processing · authorized · captured · successful · failed · cancelled · refunded · partially_refunded

CustomerInput

FieldTypeNotes
idstring
external_idstring
emailstring <email>
namestring
countrystringmax length 2

CreatePaymentRequest

FieldTypeNotes
traffic_typeTrafficType
amountrequiredintegerMinor unitsmin 1
currencyrequiredstringmax length 3
payment_methodrequiredPaymentMethodType | object
capture_methodstringautomatic · manual
countrystringmax length 2
customerCustomerInput
descriptionstringmax length 500
referencestringYour order idmax length 128
return_urlstring <uri>
metadataobject
test_scenariostringSandbox only. See GET /v1/test/scenarios.
deviceobject
└ipstring
└user_agentstring
└fingerprintstring

Payment

FieldTypeNotes
idstring
traffic_typeTrafficType
objectconst "payment"
modestringtest · live
statusPaymentStatus
amountinteger
currencystring
captured_amountinteger
refunded_amountinteger
capture_methodstring
payment_methodobject
└typePaymentMethodType
└idstring | null
countrystring | null
descriptionstring | null
referencestring | null
customerobject | null
metadataobject
routeobject
└providerobject | null
└provider_account_idstring | null
└provider_payment_idstring | null
└attemptsinteger
└routing_decision_idstring | null
└rulestring | null
riskobject
└decision_idstring | null
└scoreinteger | null
failureobject | null
└codestring
└categorystringsoft · hard · technical · policy
└messagestring
next_actionobject | null
└typestringredirect · qr_code · display_details
└urlstring
└qrPayloadstring
└expiresAtstring
feeobject
└amountinteger
└currencystring
processing_time_msinteger | null
attemptsarray of Attempt
created_atstring <date-time>
updated_atstring <date-time>
processed_atstring | null <date-time>

PaymentList

FieldTypeNotes
dataarray of Payment
has_moreboolean
next_cursorstring | null

Attempt

FieldTypeNotes
idstring
attempt_numberinteger
statusstringcreated · processing · unknown · authorized · succeeded · failed · cancelled
outcomestring | nullsuccess · requires_action · soft_decline · hard_decline · technical_error · timeout · provider_unavailable · unknown · null
provider_idstring
provider_namestring | null
provider_account_idstring
provider_payment_idstring | null
provider_codestring | null
provider_messagestring | null
failureobject | null
fee_amountinteger
latency_msinteger | null
created_atstring <date-time>

TimelineEvent

FieldTypeNotes
idstring
typestring
titlestring
descriptionstring | null
attempt_idstring | null
dataobject
created_atstring <date-time>

Refund

FieldTypeNotes
idstring
objectconst "refund"
payment_idstring
amountinteger
currencystring
statusstringcreated · processing · successful · failed
reasonstring | null
provider_refund_idstring | null
failureobject | null
created_atstring <date-time>

CreatePayoutRequest

FieldTypeNotes
amountrequiredintegermin 1
currencyrequiredstring
destinationrequiredobject
└typerequiredstringbank_account · wallet · card_token
└tokenstringProvider beneficiary token
└displayrequiredstringMasked display value
└holder_namestring
└countrystring
descriptionstring
referencestring
metadataobject
test_scenariostringsuccess · technical_error · hard_decline · unavailable · timeout

Payout

FieldTypeNotes
idstring
objectconst "payout"
modestring
statusstringcreated · pending · processing · successful · failed · cancelled
amountinteger
currencystring
destinationobject
routeobject
feeobject
failureobject | null
created_atstring <date-time>

Transaction

FieldTypeNotes
traffic_typeTrafficType
conversionobject | nullRouting and PSP outcome evidence. Technical uncertainty is null, not an approval decline. Synthetic evidence is explicitly labelled by source.
idstring
typestring
statusstring
entity_typestring
entity_idstring
payment_idstring | null
amountintegerSigned; negative for refunds and payouts
currencystring
fee_amountinteger
net_amountinteger
provider_namestring | null
provider_referencestring | null
payment_methodstring | null
countrystring | null
processing_time_msinteger | null
failure_codestring | null
settlement_idstring | null
occurred_atstring <date-time>

Balance

FieldTypeNotes
currencystring
processed_grossinteger
feesinteger
processed_netinteger
settled_by_providersinteger
awaiting_provider_settlementinteger
payouts_sentinteger
notestring

Settlement

FieldTypeNotes
idstring
provider_namestring | null
settlement_entitystring | null
settlement_referencestring | null
currencystring
gross_amountinteger
fee_amountinteger
net_amountinteger
transaction_countinteger
period_startstring <date-time>
period_endstring <date-time>
statusstringpending · settled · failed
settled_atstring | null <date-time>
itemsarray of object

PaymentMethod

FieldTypeNotes
idstring
objectconst "payment_method"
typePaymentMethodType
customer_idstring | null
displayobject
statusstring
created_atstring <date-time>

WebhookEvent

FieldTypeNotes
idstring
typestring
modestringtest · live
created_atstring <date-time>
dataobject
└objectobjectThe payment, refund, payout or settlement object