A counter or phone-order till has no cart integration and often no email — just a customer standing there with a phone number. This recipe needs a key with the read and act scopes.
1. Look the customer up
Any member id in the API accepts phone:<number>, so a till never needs to store our ids (URL-encode the + as %2B; the number is matched in E.164 form):
curl https://stickytier.com/v1/members/phone:%2B919876543210 \
-H "Authorization: Bearer $KEY"Show balances.spendable_cents (the amount usable now) and tier.name. A 404 means they are not a member yet — offer to enrol them:
curl -X POST https://stickytier.com/v1/members \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: till-7-enrol-919876543210" \
-d '{ "phone": "+919876543210", "email": "asked@example.com", "accepted_terms_version": "2026-01" }'If you cannot collect an email, use POST /v1/members/resolve with just the phone: it creates a prospect who accrues points and can complete registration later on the rewards page.
2. Redeem: issue a voucher
The voucher flow fits a till because the debit happens immediately and the code can be printed or read aloud:
curl -X POST https://stickytier.com/v1/members/phone:%2B919876543210/redemptions \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: till-7-sale-88213" \
-d '{ "amount_cents": 20000 }'{ "data": { "id": "RD-…", "code": "RWD-7K2M-Q9XA", "amount_cents": 20000, "status": "created", "mode": "voucher", "expires_at": "…" } }Apply ₹200 to the sale. If the API answers 422 balance-insufficient or 422 rule-ineligible, ask for a quote first — POST /v1/redemption-quotes returns the allowed range for that customer and cart.
3. Confirm when the sale completes — or void
curl -X POST https://stickytier.com/v1/redemptions/RD-…/confirm \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{ "order_ref": "TILL7-88213" }'If the customer walks away, POST /v1/redemptions/RD-…/void returns the points. An issued voucher you never confirm returns its points itself when it expires, so a crashed till costs the customer nothing.
4. Earn on the sale
Send the sale as an order so the customer earns on it, identified by phone:
curl -X POST https://stickytier.com/v1/events \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{ "type": "order.paid", "order_ref": "TILL7-88213", "gross_cents": 149900,
"customer": { "phone": "+919876543210" }, "occurred_at": "2026-09-22T10:31:00Z" }'Send gross_cents as the amount the customer actually paid after the voucher; earning is computed from it by the programme's rules, not by the till.
A printed voucher from somewhere else
A code on paper, issued by the web store, presented at the counter: GET /v1/redemptions?code=RWD-7K2M-Q9XA tells you whether it is valid, for how much and for whom. Confirm it the same way.