Skip to main content
POST
Redeem a catalog item
Creates a redemption for a reward in the program catalog. For UNIT_BASED rewards, specify quantity (defaults to 1); for AMOUNT_BASED rewards, specify amount. Set capture: true to capture immediately, capture: false to authorize into PENDING, or omit it to use the program’s fulfillment_mode. Instant capture debits AVAILABLE and credits the redemption target. Authorization moves the calculated cost to HELD and returns reservation_id plus the effective expires_at. Use expires_at or ttl_seconds to bound a pending redemption; they are mutually exclusive. For UNIT_BASED rewards, both paths commit catalog inventory immediately, so committed_units includes units still awaiting fulfillment. Pass an idempotency_key to safely retry requests. Duplicate requests return 200 with the existing redemption instead of 201.
For deadline selection and resolution endpoints, see the Redemption lifecycle guide. For committed, pending, and delivered inventory, see Rewards Catalog.

Authorizations

X-API-Key
string
header
required

API key passed in the X-API-Key header.

Path Parameters

id
string<uuid>
required

Participant ID

Body

application/json

Catalog item redemption details

program_id
string<uuid>
required

The program this redemption belongs to

Example:

"550e8400-e29b-41d4-a716-446655440000"

reward_id
string<uuid>
required

The reward catalog item to redeem

Example:

"550e8400-e29b-41d4-a716-446655440001"

amount
string

Amount to redeem (AMOUNT_BASED rewards only, decimal string)

Example:

"50.00"

capture
boolean

Whether to capture immediately. True completes instantly, false authorizes, and omission uses the program fulfillment_mode.

Example:

false

description
string

Optional context for this redemption, used in journal entries (max 500 chars)

Example:

"Gift card redemption"

expires_at
string<date-time>

Absolute pending-redemption deadline (RFC3339); alternative to ttl_seconds and limited to one year. If no request or program deadline is set, the authorization defaults to 90 days.

Example:

"2024-01-15T11:30:00Z"

idempotency_key
string

Prevents duplicate redemptions when retrying requests

Example:

"redeem-item-12345"

quantity
integer

Number of units to redeem (UNIT_BASED rewards only, defaults to 1)

Example:

2

ttl_seconds
integer

Relative pending-redemption deadline in seconds; alternative to expires_at and limited to one year. If no request or program deadline is set, the authorization defaults to 90 days.

Example:

3600

Response

Duplicate request (idempotency key matched, returns existing record)

amount
string

Total amount debited from the participant's balance (decimal string)

Example:

"1000.00"

asset_id
string<uuid>

The asset that was debited

Example:

"550e8400-e29b-41d4-a716-446655440003"

capture_journal_entry_id
string<uuid>

Ledger entry that captured a pending redemption

Example:

"550e8400-e29b-41d4-a716-446655440007"

captured_at
string<date-time>

When the pending redemption was captured

Example:

"2024-01-15T10:45:00Z"

created_at
string<date-time>

When this redemption was created

Example:

"2024-01-15T10:30:00Z"

description
string

Context for this redemption, used in journal entries

Example:

"Redeemed: Gift Card"

expires_at
string<date-time>

Effective deadline of the backing reservation. Always present for pending redemptions; defaults to 90 days and may be configured up to one year.

Example:

"2024-01-15T11:30:00Z"

failure_reason
string

Machine-readable or operator-supplied terminal failure detail

Example:

"fulfillment_failed"

id
string<uuid>

Unique identifier for this redemption

Example:

"550e8400-e29b-41d4-a716-446655440000"

journal_entry_id
string<uuid>

Immutable ledger anchor: the hold entry for pending redemptions, otherwise the instant redemption entry

Example:

"550e8400-e29b-41d4-a716-446655440005"

participant_id
string<uuid>

The participant who redeemed

Example:

"550e8400-e29b-41d4-a716-446655440002"

program_id
string<uuid>

The program this redemption belongs to

Example:

"550e8400-e29b-41d4-a716-446655440001"

quantity
integer

Number of units redeemed (catalog redemptions only)

Example:

2

reservation_id
string<uuid>

Reservation backing a pending redemption

Example:

"550e8400-e29b-41d4-a716-446655440006"

resolved_at
string<date-time>

When the pending redemption reached a terminal state

Example:

"2024-01-15T10:45:00Z"

reversed_amount
string

Cumulative amount reversed so far (decimal string)

Example:

"0.00"

reversed_quantity
integer

Cumulative units reversed so far (UNIT_BASED catalog redemptions only)

Example:

0

reward_id
string<uuid>

The reward catalog item that was redeemed (catalog redemptions only)

Example:

"550e8400-e29b-41d4-a716-446655440004"

status
enum<string>

Current lifecycle and reversal state

Available options:
PENDING,
COMPLETED,
FAILED,
CANCELLED,
PARTIALLY_REVERSED,
FULLY_REVERSED
Example:

"COMPLETED"

unit_cost
string

Cost per unit at the time of redemption (catalog redemptions only, decimal string)

Example:

"500.00"

updated_at
string<date-time>

When this redemption was last updated (e.g., after a reversal)

Example:

"2024-01-15T10:30:00Z"