Response envelope
Every Payments API response wraps its payload the same way:{ "status": "ok", "data": { } } envelope
with no request_id.
Errors
Both APIs return errors asapplication/problem+json bodies
(RFC 9457):
On the Payments API, a suggested wait time comes back as the
Retry-After
HTTP response header (seconds) — not as a retry_after member of the
problem body.
See Problem format and retries
for the response shape and status guide, and
Decline codes for acquirer response codes.
If a request comes back as a 5xx you should retry, see Retry when the
service is unavailable.
Money amounts
Amounts are always integers in the currency’s minor unit. For example,
5000 for SGD means SGD 50.00.{ "currency": "SGD", "value": "5000" }, where
value is a minor-units numeric string (zero-padding optional, up to 12
digits, non-zero). Session and transaction-response amounts remain plain
integers.
Idempotency and retries
The two APIs use different idempotency keys, at different levels. Payments API —request_id (purchase, authorize, refunds) or
operation_id (capture, void), set per transaction/operation:
On the Checkout API,
order_reference is the idempotency key for
session creation — there’s no separate request_id/operation_id concept.
A create replayed with the same order_reference, amount, and currency,
within the session’s TTL, returns the original session as long as it’s still
payable (other fields are ignored); the same reference with a different
amount or currency on a still-payable session, or a genuinely concurrent
replay, both return 409 session:idempotency_conflict (with different
detail text). See Prevent duplicate sessions
and double payments
for the full replay table and Session
lifecycle for the
TTL/state model behind it.
For the full picture — replay vs. conflict, PENDING recovery, and what to
do after a timeout — see the visual guide.
Prevent duplicate payments
How RadiumOne deduplicates requests, and what your integration needs to do on its side.
Metadata
Most create operations accept an optionalmetadata object for your own
key/value data (typical limits: 10 KB, 5 levels deep for Payments API
operations; for Checkout API sessions, a JSON object of at most 4096 UTF-16
code units serialized as compact JSON, limit included — most characters,
including Chinese and Thai, count as 1 unit and emoji as 2). It’s stored
and returned on lookups, never interpreted by RadiumOne.
Channels
Payments API only — the Checkout API has nochannel field or concept.
channel on a payment operation is one of CARD_PRESENT, ECOMMERCE,
MOTO, PAYMENT_LINK, IN_APP, or RECURRING. It shapes which acquirer
routing candidates and operations (e.g. standalone refund) are available —
pick the one that matches how the transaction was actually initiated.
Rate limits
RadiumOne doesn’t publish specific rate-limit numbers. If you’re consistently hitting429 responses, contact support
to discuss your integration’s traffic pattern. Both APIs send the
Retry-After HTTP header (seconds); the Checkout API additionally carries
the same value as details.retry_after in the problem body — see
Checkout API errors.