Skip to main content
A balance inquiry or a redemption purchase doesn’t behave the way you expected — nothing is redeemable, the request itself is rejected, or the loyalty host doesn’t respond in time.
TL;DR — 422 means fix the request (loyalty pairing or kind); a host timeout during a purchase degrades to a normal card-only AUTHORIZED, not an error — retry the redemption itself with a new request_id if you want another attempt.

When this happens

  • The purchase sent a loyalty component, but the routed acquirer has no loyalty leg configured — 422 urn:radiumone:transaction:loyalty-leg-required.
  • The loyalty.kind you sent (voucher or coupon) is schema-accepted but not dispatchable — only sale (points redemption) is live — 422 urn:radiumone:loyalty:redemption-kind-not-supported.
  • A balance inquiry succeeds at the host level but nothing is redeemable for this card right now — success: true with empty pools[]/vouchers[]. This is not an error.
  • The loyalty host doesn’t respond in time during a purchase’s redemption leg — the redemption is treated as a warning, not a fatal failure: the purchase falls through to a card-only authorization. See Pay with points: outcomes for exactly what your server sees (a degraded, AUTHORIZED, no-loyalty-block result).

What you see

What to do

1

Hide redemption when there's no balance

If a balance inquiry returns empty pools[]/vouchers[], don’t show a redemption option — let the shopper pay with the card alone (API reference):
2

Only send kind: 'sale'

Don’t send loyalty.kind: "voucher" or "coupon" — they’re accepted by the schema but always rejected. Points and voucher redemption both go through kind: "sale" (API reference):
3

Confirm loyalty-leg pairing before relying on this in production

A 422 loyalty-leg-required means your acquirer/outlet isn’t paired with a loyalty leg — see the enablement checklist and contact support.
4

Monitor for degraded outcomes on a host timeout

If the response has no loyalty block, treat it exactly like a normal card purchase — the card is AUTHORIZED for the full gross amount, and you still need to capture or void it. Add monitoring so an uncaptured degraded authorization doesn’t go unnoticed. If you need to retry the redemption itself, use a new request_id per attempt.

Test it

See Test your integration for partial, full, degraded, and timeout scenarios.

Check a rewards balance

Look up what’s redeemable before the shopper pays.

Pay with points

The redemption purchase, and every outcome it can return.

UOB Rewards overview

Eligibility and the enablement checklist.

Payment method errors

The full URN catalog for loyalty errors.
Last modified on September 15, 2026