getUserCoupons
Returns the coupons a user has already received, together with the offer detail needed to render a "My Coupons" entry.
AvailablePOST /api/getUserCoupons
| Environment | URL |
|---|---|
| Production | https://hotdeals.cheggout.com/api/getUserCoupons |
| UAT | https://onerupee-store-api-stage.azurewebsites.net/api/getUserCoupons |
Authentication — API key
You already persist every coupon at delivery time. Use this endpoint for reconciliation and recovery rather than as the backing store for your "My Coupons" screen — it is scoped to a single offer, so building a full list from it means one call per offer.
Request
Headers
| Header | Required | Value |
|---|---|---|
Content-Type | Yes | application/json |
X-CHANNELID | Yes | Your channel identifier |
Authorization | Yes | CheggoutAppKey <APP_KEY>:<SEC_KEY> |
Body
| Field | Type | Required | Description |
|---|---|---|---|
offerId | string | Yes | The offer to query |
virtualId | string | Yes | The user |
channelName | string | Yes | Your channel name |
curl -X POST https://hotdeals.cheggout.com/api/getUserCoupons \
-H "Content-Type: application/json" \
-H "X-CHANNELID: YOURCHANNEL" \
-H "Authorization: CheggoutAppKey REPLACE_APP_KEY:REPLACE_SEC_KEY" \
-d '{
"offerId": "517",
"virtualId": "pub_8f14e45fceea167a",
"channelName": "YOURCHANNEL"
}'
TBD offerId appears to be required, which means there is no documented way
to list all of a user's coupons in one call. If you need a complete list without iterating your
catalogue, ask Cheggout — an all-offers variant is not published.
Response
| Field | Type | Description |
|---|---|---|
status | number | 200 on success |
message | string | "Fetched Successfully" |
data | object | Offer detail plus the user's coupons |
data
| Field | Type | Description |
|---|---|---|
id | string | Offer identifier |
brand_name | string | Brand name |
brand_description | string | Brand description |
product_name | string | Product or offer name |
offer_validity | string | Offer validity end date |
tnc | string | Terms and conditions |
how_to_redeem | string | Redemption instructions |
url | string | Cheggout redirect URL for the offer |
coupons | array | The user's delivered coupons for this offer |
coupons[]
| Field | Type | Description |
|---|---|---|
coupon_code | string | The redemption code |
extTransactionId | string | Your reference from the delivery call |
purchase_time | string | When it was delivered, ISO 8601 |
{
"status": 200,
"message": "Fetched Successfully",
"data": {
"id": "517",
"brand_name": "Example Brand",
"brand_description": "A description of the brand.",
"product_name": "Sample Product Voucher",
"offer_validity": "2026-12-31T16:34:00.000Z",
"tnc": "One redemption per customer.",
"how_to_redeem": "Present the code at checkout.",
"url": "https://click.cheggout.com/REPLACE",
"coupons": [
{
"coupon_code": "REPLACE-COUPON-CODE",
"extTransactionId": "PUB_OFFERBUY_20260731_000045",
"purchase_time": "2026-07-31T14:15:31.000Z"
}
]
}
}
coupons[] carries no statusEach entry has a code, your reference and a timestamp — but no per-coupon expiry, no used/unused
flag, and no invalidation state. Coupon-level validity comes from the offer's offer_validity, and
invalidations arrive through the
coupon status webhook. Track redemption state yourself if you need
it. TBD
Errors
status | errorCode | Cause |
|---|---|---|
400 | INVALID_REQUEST | Malformed request |
401 | UNAUTHORIZED | Missing or wrong Authorization header |
500 | INTERNAL_ERROR | Platform-side failure |
Status codes arrive in the body — see API conventions.
Reconciliation
The most valuable use of this endpoint is settling uncertainty after a failed delivery.
Because extTransactionId is echoed on each coupon, you can match a delivery attempt to its outcome
exactly. Run this as a periodic reconciliation job over any deliveries your ledger recorded as
uncertain.