503 with no clear outcome. The charge may or may not have reached the card network — resolve it before you do anything else.
TL;DR — No response, or
503? Resend the identical request with the same request_id/operation_id first — that’s how you recover the transaction id and current status. Then let the confirming webhook tell you the final outcome (recommended); call status inquiry instead if you don’t use webhooks or need an answer right now. Never mint a new key for the same attempt.When this happens
- Your HTTP client times out waiting for a response — the request may have already reached RadiumOne and the acquirer. You don’t have a transaction
idyet in this case — the response that would have carried it never arrived. - RadiumOne’s own upstream connection to the payment switch times out, returned as
503 urn:radiumone:gateway:switch-timeoutwithretry_allowed: false. The outcome is genuinely indeterminate: the charge may have been forwarded to the acquirer host before the timeout.
What you see
Recovery path
- A create-type request gets no response, or a
5xx. - Resend the identical body with the same
request_id/operation_id, with backoff. This is what recovers the transactionid— the replay returns the stored result whatever it is, includingPENDING. - If the replay itself comes back
409 idempotency-body-mismatch, the resend didn’t match the original attempt byte-for-byte — resend the stored original body instead. - Any other
4xxon the replay means something else is wrong with the request — fix it before you retry again. - If the replayed response is
2xxwithCAPTURED,AUTHORIZED, orDECLINED, that’s final — branch on status and stop. - If it’s
2xxwithPENDING, keep theidfrom that response and wait for the confirming webhook (recommended — it pushes the outcome to you); call status inquiry instead if you don’t have webhooks set up or need an answer right now. - If it’s
2xxwithFAILED, that means the transaction didn’t complete — it’s not a guarantee that no funds moved (onlyVOIDED/REVERSEDassert that). If the outcome was genuinely unknown after an upstream timeout, RadiumOne arms an automatic reversal instead of leaving itFAILED(REVERSAL_PENDING→REVERSED— see Understand automatic reversals). Confirm with a statusGETbefore you consider any new attempt with a newrequest_id. - If you still get no response after a few tries, or you can’t reproduce the exact original body, don’t guess — wait for the confirming webhook instead, or contact support with your
order_referenceand approximate timestamp if you need it sooner. - Never send a new
request_idto “retry faster” — that’s the path that risks a duplicate charge.
What to do
1
Don't create a new request
Never mint a new
request_id (or operation_id) just because the first attempt was slow or came back as 503. Reuse the same key for whatever you do next.2
Replay the identical request to recover the transaction id
If you don’t have a transaction The response is the stored transaction, whatever its status, including its
id yet — the usual case after a client-side timeout — resend the exact same body with the exact same key first (API reference):id — this is always safe to do, any number of times.3
Once you have the id, let the webhook confirm the outcome — or check now with status inquiry
If you have a webhook endpoint registered, the confirming event (
payment.*, authorization.*, refund.*) arrives without you polling anything — this is the recommended path, and it’s what Webhooks overview assumes. If you don’t use webhooks, or you need an answer right now rather than waiting, call the status-inquiry endpoint instead — it never writes a new row, so it’s always safe to call on demand (API reference):4
No id and the replay didn't resolve it? Wait for the webhook or contact support
If you can’t reproduce the exact original body (for example, you lost the
amount from a form submission), a replay isn’t possible. RadiumOne doesn’t expose a list-by-order_reference lookup, so wait for the confirming webhook (payment.*, authorization.*, refund.*), or contact support with your order_reference and approximate timestamp.5
Branch on the final status
Any 2xx response is a result you must branch on
status — never on response_code (that’s the verbatim host/acquirer code; useful for support tickets, not for your app logic).6
Reconcile via webhook if you still can't resolve it
If every synchronous option above is exhausted, wait for the confirming webhook (
payment.*, authorization.*, refund.*) instead of guessing — see Webhooks overview.Prevent it
- Set a client-side HTTP timeout longer than a few seconds — a request that’s merely slow at the switch shouldn’t look identical to a dropped connection on your side.
- Build the retry-with-same-key path into your integration before you go live, not during your first production incident.
Test it
See Test your integration for simulated timeout scenarios.Related
Prevent duplicate payments
The cross-product guide to avoiding duplicate charges.
Check a transaction's status
Status inquiry and timeout recovery, in depth.
Problem format and retries
The full retry-rules reference.
Understand automatic reversals
What happens if the switch timeout turns into a reversal.