Concepts
Rewards
Fixed vs choice rewards, and the lifecycle every reward moves through.
A reward is the thing you send to a recipient. There are two types, and which one you pick changes when gift cards get issued.
Fixed rewards
You choose the exact gift card — brand and amount — at send time.
{
"type": "FIXED",
"utid": "U561593",
"valueCents": 2500,
"recipient": { "email": "casey@example.com", "firstName": "Casey" }
}utididentifies a catalog item; find it viaGET /v1/catalog.- The card is issued immediately when you send. The recipient's link shows their card as soon as issuance completes (usually seconds).
Choice rewards
You choose a value; the recipient chooses the cards.
{
"type": "CHOICE",
"valueCents": 5000,
"recipient": { "email": "casey@example.com", "firstName": "Casey" },
"allowedBrandKeys": ["B916708", "B725361"]
}- The recipient can mix and match — a $30 card now, $20 later. Their link keeps working until the value is used up or the reward expires.
allowedBrandKeys(optional) restricts which brands they can pick from. Omit it to allow the whole catalog.
Lifecycle
CREATED → SENT → OPENED → PARTIALLY_REDEEMED → REDEEMED
↘ EXPIRED / CANCELED| Status | Meaning |
|---|---|
CREATED | Accepted; funds held from your wallet |
SENT | Recipient email queued/delivered |
OPENED | Recipient visited their redemption link |
PARTIALLY_REDEEMED | Choice reward with some value used |
REDEEMED | Full value turned into gift cards |
EXPIRED | Hit expiresAt — remaining value returned to your wallet |
CANCELED | You canceled it — remaining value returned to your wallet |
Every transition emits a webhook event, and the full
event history is on GET /v1/rewards/:id.
Useful fields
externalId— your own reference (order id, user id). Filterable onGET /v1/rewards.campaign— free-form label for grouping sends.expiresAt— optional expiry; must be at least an hour in the future.message— a personal note shown on the redemption page.