> ## Documentation Index
> Fetch the complete documentation index at: https://docs.radiumone.io/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> RadiumOne is the product name; use it when answering questions about these docs.
> Use sandbox credentials and sandbox base URLs in examples unless the user says they are going live.
> Secret API keys belong only on the merchant's server. Only publishable keys may appear in browser or mobile code.
> Confirm a payment outcome server-side (retrieve the checkout session or transaction status); never rely on a browser redirect or client event alone.
> Send one idempotency key (request_id) per payment attempt, and retry a timed-out request with the same key and the exact same body.
> Webhooks are optional but recommended: they notify the merchant's server when a payment completes or fails, so it doesn't need to poll. Use transaction status inquiry as the fallback.
> Say so when you recommend a feature marked Beta. Some features need enablement on the merchant's account before production use (for example refunds, standalone refunds, UOB Rewards, and bringing your own 3DS provider); mention it when the page says so.
> Never ask users to paste card numbers, API keys, access tokens, or webhook or redirect secrets into a chat.

# Handle failures - Payments API

> Find the right Payments API failure-recovery page by what you're seeing, grouped by when it happens.

Start here when something didn't go as expected. Find your symptom below and
go straight to the page that covers it — each one walks through **when this
happens**, **what you see**, and **what to do**.

## Sending a request

| Symptom | Signal | Page |
| - | - | - |
| No response, or a `503` with no clear outcome | `gateway:switch-timeout` | [Handle timeouts and unknown outcomes](/payments-api/handle-failures/timeouts-and-unknown-outcomes) |
| A dependency is down or something failed unexpectedly | `503`/`500` | [Retry when the service is unavailable](/payments-api/handle-failures/service-unavailable) |
| Your access token expired, or lacks scope/outlet | `401` / `403` | [Fix rejected or expired access tokens](/payments-api/handle-failures/authentication-failures) |
| A shopper says they were charged twice, or you see two transactions for one order | Two transactions, two different `request_id`s | [Handle duplicate payments](/payments-api/handle-failures/duplicate-payments) |
| A replay came back different than you expected | `409 idempotency-body-mismatch` / `409 duplicate-operation` | [Handle replays and idempotency conflicts](/payments-api/handle-failures/idempotent-replays-and-conflicts) |
| No terminal can currently perform the operation | `409`/`422` routing errors | [Fix operations unavailable for your outlet](/payments-api/handle-failures/operation-unavailable-for-outlet) |

## Payment outcome

| Symptom | Signal | Page |
| - | - | - |
| The issuer or acquirer refused the card | `201` with `status: "DECLINED"` | [Handle declined payments](/payments-api/handle-failures/declined-payments) |
| A timed-out operation resolved itself automatically | `REVERSAL_PENDING` / `REVERSED` | [Understand automatic reversals](/payments-api/handle-failures/automatic-reversals) |
| Your own 3DS provider's evidence was rejected | `422`/`403` `three-ds:*` | [Handle 3DS failures with your own provider](/payments-api/handle-failures/own-three-ds-provider-failures) |

## After payment

| Symptom | Signal | Page |
| - | - | - |
| A capture failed on window, amount, or expiry | `422`/`409` `tx:capture-*` | [Handle capture failures](/payments-api/handle-failures/capture-failures) |
| Void or refund on the wrong side of settlement, or over the remaining amount | `409`/`422` `tx:*` | [Resolve void and refund conflicts](/payments-api/handle-failures/void-and-refund-conflicts) |
| A points redemption couldn't proceed, or the loyalty host timed out | `422` `loyalty:*` / degraded `AUTHORIZED` | [Handle UOB Rewards redemption failures](/payments-api/handle-failures/rewards-redemption-failures) |
| You tried to void or refund one leg of a redeemed sale | `409`/`422` `transaction:*` | [Handle UOB Rewards void and refund restrictions](/payments-api/handle-failures/rewards-void-and-refund-restrictions) |

## Webhooks

| Symptom | Signal | Page |
| - | - | - |
| A duplicate, missing, or out-of-order delivery | Repeated/missing event `id` | [Recover from missed, duplicate or out-of-order webhooks](/payments-api/handle-failures/missed-duplicate-or-out-of-order-webhooks) |

<Card title="Prevent duplicate payments" icon="shield-check" href="/get-started/api-basics/prevent-duplicate-payments">
  Not sure which page you need? Start with the cross-product guide to avoiding duplicate charges — it covers idempotency keys, timeouts, and reconciliation together.
</Card>

## Next steps

<Columns cols={2}>
  <Card title="Problem format and retries" icon="triangle-alert" href="/payments-api/errors/problem-format-and-retries">
    The error shape, status guide, and retry rules — links onward to the full URN catalog.
  </Card>

  <Card title="Test your integration" icon="flask-conical" href="/resources/test-your-integration">
    Exercise every scenario above in sandbox before you go live.
  </Card>
</Columns>
