Skip to main content
Your request to create, capture, void, or refund a transaction gets no response, or a 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 id yet 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-timeout with retry_allowed: false. The outcome is genuinely indeterminate: the charge may have been forwarded to the acquirer host before the timeout.

What you see

retry_allowed: false here doesn’t mean “give up” — it means don’t blindly retry as if this were a fresh attempt. A blind retry with a new idempotency key risks a duplicate charge if the original request actually landed.

Recovery path

  1. A create-type request gets no response, or a 5xx.
  2. Resend the identical body with the same request_id/operation_id, with backoff. This is what recovers the transaction id — the replay returns the stored result whatever it is, including PENDING.
  3. 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.
  4. Any other 4xx on the replay means something else is wrong with the request — fix it before you retry again.
  5. If the replayed response is 2xx with CAPTURED, AUTHORIZED, or DECLINED, that’s final — branch on status and stop.
  6. If it’s 2xx with PENDING, keep the id from 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.
  7. If it’s 2xx with FAILED, that means the transaction didn’t complete — it’s not a guarantee that no funds moved (only VOIDED/REVERSED assert that). If the outcome was genuinely unknown after an upstream timeout, RadiumOne arms an automatic reversal instead of leaving it FAILED (REVERSAL_PENDING → REVERSED — see Understand automatic reversals). Confirm with a status GET before you consider any new attempt with a new request_id.
  8. 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_reference and approximate timestamp if you need it sooner.
  9. Never send a new request_id to “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 id yet — the usual case after a client-side timeout — resend the exact same body with the exact same key first (API reference):
The response is the stored transaction, whatever its status, including its 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.

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.
Last modified on September 15, 2026