GetAllScratchCardsByUserId
Returns every scratch card for a user: unscratched cards first, then revealed rewards. This is what powers a "My Rewards" screen, and it is also how you recover a reward whose reveal response you lost.
AvailableGET /api/GetAllScratchCardsByUserId?page=1&limit=20
| Environment | URL |
|---|---|
| Production | https://rewardscenter.cheggout.com/api/GetAllScratchCardsByUserId |
| UAT | https://rewardscenter-uat.cheggout.com/api/GetAllScratchCardsByUserId |
Authentication — Authorization: Bearer <token> from GetAuthToken
The user is identified by the token, so no user parameter is sent.
Request
| Parameter | In | Type | Description |
|---|---|---|---|
page | query | integer | Page number. 1-based. |
limit | query | integer | Items per page |
TBD Default and maximum limit are not documented. Always send both
parameters explicitly rather than relying on defaults, and keep limit modest — 20 is a reasonable
page size for a rewards list.
curl -X GET "https://rewardscenter-uat.cheggout.com/api/GetAllScratchCardsByUserId?page=1&limit=20" \
-H "Authorization: Bearer REPLACE_WITH_USER_TOKEN"
Response
Unlike every other Rewards Center endpoint, this returns a plain JSON array — no status, no
message, no total count. Your parser must expect an array at the top level.
[
{
"scratchcardId": 45150,
"rewardId": 45150,
"campaignId": "YOURCHANNEL_CAMPAIGN",
"isSeen": false,
"trackLink": ["https://tracking.cheggout.com/Tracker/Impression?REPLACE"]
},
{
"scratchcardId": 45144,
"rewardId": 45144,
"campaignId": "YOURCHANNEL_CAMPAIGN",
"isSeen": true,
"offerTitle": "Flat 20% off your next order",
"couponCode": "REPLACE-COUPON-CODE",
"couponType": "Brand",
"endDate": "2026-12-31 23:59:59.000",
"siteId": 1217,
"siteName": "Example Merchant",
"promoLink": "https://click.cheggout.com/REPLACE",
"copyClick": ["https://tracking.cheggout.com/Tracker/clicks?REPLACE"],
"redeemClick": ["https://tracking.cheggout.com/Tracker/clicks?REPLACE"]
}
]
Element types
The array contains two structurally different element types. Branch on isSeen.
Unscratched card — isSeen: false
| Field | Type | Description |
|---|---|---|
scratchcardId | number | Card identifier |
rewardId | number | Card identifier — pass to FetchRewardInfo |
campaignId | TBD | The campaign this card belongs to. The field's type is not documented — examples show it as a string, but do not assume it. Read it defensively. |
isSeen | boolean | false |
trackLink | array | Impression URLs — fire when the card becomes visible |
Revealed reward — isSeen: true
A superset of the above, adding the reward detail:
| Field | Type | Description |
|---|---|---|
offerTitle | string | Headline |
offerId | number | Offer identifier |
description | string | Offer description |
shortDescription | string | Condensed description |
terms | string | Terms, HTML list markup |
entryPoint | string | Where the reveal happened |
couponCode | string | The redemption code |
endDate | string | Validity end |
couponType | string | "Brand" or "points" |
couponImage | string | Coupon artwork URL |
redeemSteps | string | HTML list markup |
bannerDisplayUrl | string | Banner artwork URL |
points | number | Points awarded |
siteId | number | Merchant identifier |
siteName | string | Merchant name |
coverImage | string | Cover artwork URL |
iconImage | string | Icon URL |
details | string | HTML list markup |
createdDateTime | string | When the card was created |
promoLink | string | Redeem destination |
copyClick | array | Fire on code copy |
redeemClick | array | Fire on redeem tap |
scratchcardId and rewardId both appear. Use rewardId when calling
FetchRewardInfo so your code stays consistent with GetReward.
Pagination
- 1-based. The first page is
page=1, notpage=0. - Paginated across both sets — unscratched cards come first, and a later page may contain the boundary between unscratched and revealed items.
- No total count and no
hasMoreflag. Detect the end by receiving fewer items thanlimit.
TBD No total-count metadata is available, so you cannot render "page 3 of 12". Infinite scroll or a "load more" control fits the contract better than numbered pages. A pagination envelope is tracked in Open Items.
Uses
A "My Rewards" screen. Render unscratched cards as scratchable, revealed ones as reward tiles.
Fire each unscratched card's trackLink as it scrolls into view.
Recovering a lost reveal. If a FetchRewardInfo call timed out and
you don't know whether it succeeded, list the user's cards. If the card now shows isSeen: true,
the reveal happened and the reward is right there — do not retry the reveal.
Reconciliation, backfill and recovery — not your primary read path. Your own store is the primary read path for a rewards list: you persist every reward at the moment you receive it, and you render from that. Use this endpoint to reconcile against the platform, to backfill state you never recorded, and to recover after a failure. Building your "My Rewards" screen directly on it makes every page view depend on a Cheggout round trip and on a token being valid. See Headless integration.
Errors
| Response | Meaning |
|---|---|
HTTP 401 | Token missing, malformed, expired, or the wrong token type |
| Empty array | The user has no cards — a normal outcome |
TBD No further error catalogue is published for this endpoint.
Next
FetchRewardInfo- Scratch card lifecycle
- Hosted rewards experience — skip building the screen.