getCatalogue
Returns the deals catalogue — every offer available to your channel. The response is not user-specific, which makes it aggressively cacheable.
AvailableGET /api/getCatalogue
| Environment | URL |
|---|---|
| Production | https://hotdeals.cheggout.com/api/getCatalogue |
| UAT | https://onerupee-store-api-stage.azurewebsites.net/api/getCatalogue |
Authentication — API key, server-to-server from whitelisted IPs
The catalogue is the same for every user. Refresh it into your own store on a schedule and serve your storefront from that cache. Only inventory needs to be fresh.
Request
Headers
| Header | Required | Value |
|---|---|---|
Authorization | Yes | CheggoutAppKey <APP_KEY>:<SEC_KEY> |
X-CHANNELID | Yes | Your channel identifier |
TBD No request parameters are documented for this endpoint — no filters, no pagination. Assume the full catalogue is returned in one response, and confirm with Cheggout if your catalogue is large.
curl -X GET https://hotdeals.cheggout.com/api/getCatalogue \
-H "X-CHANNELID: YOURCHANNEL" \
-H "Authorization: CheggoutAppKey REPLACE_APP_KEY:REPLACE_SEC_KEY"
Response
| Field | Type | Description |
|---|---|---|
status | number | 200 on success |
message | string | "Fetched Successfully" |
data | array | Offer objects |
Offer fields
| Field | Type | Description |
|---|---|---|
id | string | Unique offer identifier. Use as offerId elsewhere. |
brand_name | string | Brand name |
brand_description | string | Brand description |
product_name | string | Product or offer name |
brand_logo | string | Brand logo URL |
grey_brand_logo | string | Greyscale logo URL, for disabled or sold-out states |
product_min_pic | string | Small product image URL |
product_pic_large | string | Large product image URL |
offer_category | number | Category identifier |
offer_category_name | string | Category display name |
purchase_limit | number | How many times one user may claim this offer |
amount | number | Coin cost. 0 means free. |
is_free | — | Free-offer indicator |
dealRank | number | Suggested display ordering |
stock | number | Approximate remaining stock — see the caution below |
strip_note | string | Short promotional strip text |
offer_format | number | Offer format identifier |
tnc | string | Terms and conditions |
how_to_redeem | string | Redemption instructions |
offer_validity | string | Validity end date |
tags | array | Targeting tags — see below |
CPE | — | Cost per engagement |
{
"status": 200,
"message": "Fetched Successfully",
"data": [
{
"id": "517",
"brand_name": "Example Brand",
"brand_description": "A description of the brand.",
"product_name": "Sample Product Voucher",
"brand_logo": "https://assets.example.com/logo.png",
"grey_brand_logo": "https://assets.example.com/logo-grey.png",
"product_min_pic": "https://assets.example.com/product-small.png",
"product_pic_large": "https://assets.example.com/product-large.png",
"offer_category": 12,
"offer_category_name": "Food and Beverage",
"purchase_limit": 1,
"amount": 5,
"is_free": 0,
"dealRank": 3,
"stock": 1250,
"strip_note": "Limited period offer",
"offer_format": 1,
"tnc": "One redemption per customer.",
"how_to_redeem": "Present the code at checkout.",
"offer_validity": "2026-12-31T16:34:00.000Z",
"tags": ["EXAMPLE_SEGMENT_A", "EXAMPLE_CITY_FOOD"],
"CPE": 11.25
}
]
}
stock here is approximateThe catalogue's stock is a cached value and is not authoritative. Before showing a buy action,
check getCatalogueInventory, which carries a 180-second TTL.
Tags and targeting
tags carries targeting labels on each offer. Applying them is the publisher's responsibility —
you decide which users see which offers based on the segments you hold.
TBD No tag taxonomy is published. There is no list of valid tags, no definition of their semantics, and no documented mapping from a user to a tag set. Agree your tag vocabulary with Cheggout during campaign setup.
Note that fetchCouponCode applies its own eligibility check and can
return 403 NON_ELIGIBLE — so a user may see an offer you showed them and still be refused. Handle
that response gracefully.
Errors
status | errorCode | Message | Cause |
|---|---|---|---|
401 | UNAUTHORIZED | Invalid AppKey/SecKey. | Missing or wrong Authorization header |
403 | FORBIDDEN | Request blocked. IP not whitelisted. | Calling IP not registered |
400 | INVALID_REQUEST | — | Malformed request |
500 | INTERNAL_ERROR | Something went wrong. | Platform-side failure |
Check the body's status field, not only the HTTP status line. See
API conventions.
Caching strategy
Recommendations:
- Refresh on a schedule — hourly or nightly, depending on how often your campaigns change.
- Serve reads from your cache. Do not call Cheggout on a page view.
- Store the full offer object, including imagery URLs and terms, so your storefront needs no further calls.
- Handle disappearing offers. An offer can be deactivated between refreshes; treat a
404 INVALID_OFFERat delivery time as "no longer available" and refresh your cache.
TBD No recommended refresh cadence is published, and there is no change feed or ETag to detect updates cheaply. Agree a cadence with Cheggout based on your campaign velocity.
Next
getCatalogueInventory— live stock.fetchCouponCode— deliver a coupon.- Catalogue module guide