> ## 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.

# Payment method errors - Payments API

> Loyalty (UOB Rewards), payment-method discovery, routing/capability, and token errors for the Payments API.

You'll hit these on payment-method discovery, UOB Rewards loyalty
redemption and balance calls, and any operation a terminal can't currently
route or a token can't support. Branch on the problem+json `type` URN and
HTTP status returned in the body — never on `title`. See [Problem format
and retries](/payments-api/errors/problem-format-and-retries) for the
response shape, the full HTTP status guide, and retry rules; the
**Retry?** column below is that same per-status rule applied to each error.

## Loyalty (UOB Rewards)

See [Handle UOB Rewards void and refund restrictions](/payments-api/handle-failures/rewards-void-and-refund-restrictions),
[Handle UOB Rewards redemption failures](/payments-api/handle-failures/rewards-redemption-failures),
and [Balance inquiry](/payments-api/payment-methods/uob-rewards/check-balance)
for where these surface.

| URN | HTTP | Meaning | What to do | Retry? |
| - | - | - | - | - |
| <a id="transaction-single-leg-void-forbidden" />`urn:radiumone:transaction:single-leg-void-forbidden` | 409 | Can't void one leg of a loyalty-grouped sale on its own | [Handle UOB Rewards void and refund restrictions](/payments-api/handle-failures/rewards-void-and-refund-restrictions) | Depends — see [Retry rules](/payments-api/errors/problem-format-and-retries#retry-rules) |
| <a id="transaction-product-not-supported" />`urn:radiumone:transaction:product-not-supported` | 422 | e.g. refunding a loyalty leg directly | [Handle UOB Rewards void and refund restrictions](/payments-api/handle-failures/rewards-void-and-refund-restrictions) | No |
| <a id="transaction-loyalty-leg-required" />`urn:radiumone:transaction:loyalty-leg-required` | 422 | Purchase sent `loyalty`, but the routed acquirer has no loyalty leg | [Handle UOB Rewards redemption failures](/payments-api/handle-failures/rewards-redemption-failures) | No |
| <a id="loyalty-redemption-kind-not-supported" />`urn:radiumone:loyalty:redemption-kind-not-supported` | 422 | `kind: voucher\|coupon` is schema-accepted but not dispatchable | [Handle UOB Rewards redemption failures](/payments-api/handle-failures/rewards-redemption-failures) | No |
| <a id="loyalty-validation-disabled" />`urn:radiumone:loyalty:validation-disabled` | 403 | Programme validation is off for your outlet | [Contact support](/resources/support) | No |
| <a id="loyalty-terminal-unknown" />`urn:radiumone:loyalty:terminal-unknown` | 404 | Terminal not provisioned on the loyalty host | [Contact support](/resources/support) | No |
| <a id="loyalty-device-not-validated" />`urn:radiumone:loyalty:device-not-validated` | 409 | The device is set up but hasn't been validated as configured and ready to accept loyalty transactions | [Contact support](/resources/support) to validate the device | No — not until support has validated the device |
| <a id="loyalty-param-download-failed" />`urn:radiumone:loyalty:param-download-failed` | 503 | Loyalty host transport failure | Retry later | Yes — after a delay |

## Discovery

`GET /v1/payment-methods` and `GET /v1/payment-brands` — see [Show payment
methods at checkout](/payments-api/payment-methods/payment-method-discovery).

| URN | HTTP | Meaning | Retry? |
| - | - | - | - |
| <a id="checkout-origin-not-allowed" />`urn:radiumone:checkout:origin-not-allowed` | 403 | A publishable-key caller's `Origin` header isn't on your allow-list | No |
| <a id="checkout-outlet-not-found" />`urn:radiumone:checkout:outlet-not-found` | 404 | Unknown `outlet_id` | No |
| <a id="checkout-currency-not-supported" />`urn:radiumone:checkout:currency-not-supported` | 422 | No candidate acquirer for that currency | No |
| <a id="checkout-no-candidates" />`urn:radiumone:checkout:no-candidates` | 404 | No payment methods configured for this combination | No |

## Routing and capability

These occur when no acquirer terminal can currently handle the operation you
requested — distinct from a card decline, which always requires a live
terminal to have been reached. See [Fix operations unavailable for your
outlet](/payments-api/handle-failures/operation-unavailable-for-outlet) for
the full walkthrough.

| URN | HTTP | Resolution | Meaning | What to do |
| - | - | - | - | - |
| <a id="routing-operation-disabled" />`urn:radiumone:routing:operation-disabled` | 409 | `operator` | Every candidate terminal has this operation toggled off | [Contact support](/resources/support) to enable it, or don't attempt the operation for this outlet |
| <a id="routing-no-device-available" />`urn:radiumone:routing:no-device-available` / <a id="routing-terminal-inactive" />`urn:radiumone:routing:terminal-inactive` | 409 | varies | No usable terminal could be routed for this request | Retry later if `resolution` is `transient`; contact support if it's `operator` |
| <a id="device-operation-not-supported" />`urn:radiumone:device:operation-not-supported` | 422 | — | The terminal that *was* routed has this specific operation toggled off | Same as above |
| <a id="routing-capability-not-supported" />`urn:radiumone:routing:capability-not-supported` | 422 | — | The acquirer channel a follow-up operation (capture/void/refund) inherits from its original doesn't have that operation enabled — most often seen on [refunds](/payments-api/refund#refunds-require-enablement), which are disabled by default | [Contact support](/resources/support#request-enablement) to enable the operation for that acquirer channel |

## Tokens

See [Elements: expired sessions and tokens](/elements/handle-failures/expired-sessions-and-tokens).

| URN | HTTP | Meaning | What to do | Retry? |
| - | - | - | - | - |
| <a id="token-transient-expired" />`urn:radiumone:token:transient-expired` / <a id="token-data-purged" />`urn:radiumone:token:data-purged` | 410 | The bind token lapsed (about 30 minutes) before you charged it | Re-tokenize the card. See [Elements: expired sessions and tokens](/elements/handle-failures/expired-sessions-and-tokens) | No |

## Next steps

<Columns cols={2}>
  <Card title="Problem format and retries" icon="triangle-alert" href="/payments-api/errors/problem-format-and-retries">
    The problem+json shape, HTTP status guide, and retry rules.
  </Card>

  <Card title="Payment operation errors" icon="triangle-alert" href="/payments-api/errors/payment-operation-errors">
    Auth, validation, idempotency, transaction-state, and reversal errors.
  </Card>

  <Card title="Decline codes" icon="credit-card" href="/payments-api/errors/decline-codes">
    How a declined payment appears — that's not an error.
  </Card>

  <Card title="Handle failures" icon="life-buoy" href="/payments-api/handle-failures/overview">
    Find the right recovery page by symptom.
  </Card>
</Columns>
