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

# UOB Rewards - Payments API

> Let shoppers redeem UOB Rewards points and vouchers against part or all of an order, then charge the card for the rest.

export const RequiresEnablement = ({feature}) => <Note>
    {feature ? <><strong>{feature}</strong> requires</> : "This feature requires"} enablement on your account before you can use it in production. See <a href="/resources/support#request-enablement">Request enablement</a>.
  </Note>;

UOB Rewards lets a cardholder in an eligible bank loyalty programme (today,
UOB UNI\$) redeem points or vouchers against a purchase. You check the
shopper's balance first, then send **one** purchase request that includes the
redemption — RadiumOne redeems the points first, then charges the card for
whatever remains.

## How it works

1. Your server checks the shopper's points and voucher balance.
2. Your UI shows the available vouchers and lets the shopper choose.
3. Your server sends a single purchase with the gross order amount and the
   selected redemption. RadiumOne redeems the points, then charges the card
   for the residual — or nothing, on a full redemption.

UOB Rewards is available with both integrations: with
[hosted checkout](/hosted-checkout/overview), RadiumOne shows it to the
shopper automatically where enabled; with Elements + the Payments API, you
build the balance/voucher UI yourself — see
[Check a rewards balance](/payments-api/payment-methods/uob-rewards/check-balance)
and [Pay with points](/payments-api/payment-methods/uob-rewards/pay-with-points).

<RequiresEnablement feature="UOB Rewards" />

## Eligibility

* The shopper's card must belong to a participating bank loyalty programme
  (UOB UNI\$ today).
* Your outlet's acquirer must be paired with a loyalty acquirer, and the
  loyalty product must be enabled for it. Without this, a purchase that
  includes `loyalty` fails with `422 urn:radiumone:transaction:loyalty-leg-required`.
* The BIN of the card presented decides eligibility at the acquirer level —
  not every card at an eligible bank is guaranteed to route to the loyalty
  leg.

## Enablement checklist

Before you can use UOB Rewards in production, [contact support](/resources/support#request-enablement) to confirm:

* Your acquirer is paired with a loyalty acquirer for the currencies you sell in.
* The loyalty product is enabled on that pairing.
* Your terminals are provisioned and validated on the loyalty host.
* The routing rules that decide which cards get the loyalty leg (for example, UOB BIN ranges) are configured for your account.

Until these are confirmed, a redemption attempt degrades gracefully — see
[Pay with points](/payments-api/payment-methods/uob-rewards/pay-with-points#outcomes) for
what your server sees.

## Limitations

* **Points and voucher redemption only** (`kind: "sale"`). Standalone voucher
  or coupon redemption (`kind: "voucher"` / `"coupon"`) is accepted by the
  schema but always rejected with `422 urn:radiumone:loyalty:redemption-kind-not-supported` — don't send it.
* **No merchant self-void of a grouped sale.** A single-leg void returns
  `409 urn:radiumone:transaction:single-leg-void-forbidden`; cancelling a
  redeemed sale is support-driven. See
  [Refunds and cancellations](/payments-api/payment-methods/uob-rewards/refunds-and-cancellations).
* **3D Secure isn't combinable with a redemption yet** — see
  [Rewards with 3D Secure](/payments-api/payment-methods/uob-rewards/rewards-with-3ds).

## Next steps

<Columns cols={2}>
  <Card title="Check a rewards balance" icon="wallet" href="/payments-api/payment-methods/uob-rewards/check-balance">
    Look up points and vouchers before the shopper pays.
  </Card>

  <Card title="Pay with points" icon="gift" href="/payments-api/payment-methods/uob-rewards/pay-with-points">
    Send the purchase that redeems the balance.
  </Card>
</Columns>
