Popeyes API endpoint
Returns a page of Popeyes Rewards' bonus-points promotion catalog -- flat or multiplied points bonuses tied to a qualifying purchase (e.g. "Get Double Bonus Points on Your Cart, minimum $20"), distinct from /popeyes/offers (priced menu deals) and /popeyes/quests (multi-step challenges). This is public CMS content, not a signed-in member's own applied-promotions state. points_multiplier and bonus_points are mutually exclusive in practice -- a promotion is either an "Nx points" campaign or a flat bonus. start_date/end_date bound the promotion's published active window when Popeyes sets one; both empty means no published window restriction, not that the promotion is permanently active.
/popeyes/promotionsQuery parameters:
limit (optional, default 20) — maximum promotions to return, 1-100.offset (optional, default 0) — number of promotions to skip, for paging through the full catalog.market (optional, default US) — restaurant market: US or CA.Response includes promotions[], count, has_more, source_url, and fetched_at. has_more is a paging heuristic, the same as /popeyes/offers. Each promotion has id, name, message, points_multiplier, bonus_points, start_date, and end_date. points_multiplier and bonus_points are mutually exclusive in practice — a promotion is either an "Nx points" campaign or a flat bonus. start_date/end_date bound the promotion's published active window when Popeyes sets one; both empty means no published window restriction, not that the promotion is permanently active.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| name | 20 | “2x Nuggets: 4Pc Kids Meal” and 19 other values |
| message | 17 | “Earn double the points on every Nuggets purchase” and 11 other values |
| bonus_points | 17 | 68 to 600, median 150 |
| start_date | 1 | 2021-08-02 |
| end_date | 1 | 2021-08-16 |
| points_multiplier | 3 | 2 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| limit | integer | No | Maximum promotions to return, 1-100 (default 20) | 20 | |
| offset | integer | No | Number of promotions to skip, for paging (default 0) | 0 | |
| market | string | No | Restaurant market: US (default) or CA | US | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/popeyes/promotions?limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"promotions": [
{
"id": "11d41e3c-75b5-458c-8166-7cdfb20a635a",
"name": "Get Double Bonus Points on Your Cart, minimum $20",
"message": "Get Double Bonus Points on Your Cart, minimum $20",
"points_multiplier": 2
},
{
"id": "03631db2-806c-4d7e-8192-45007f234cf2",
"name": "2x Nuggets: 4Pc Kids Meal",
"message": "Earn double the points on every Nuggets purchase",
"bonus_points": 91,
"start_date": "2021-08-02T04:00:00.000Z",
"end_date": "2021-08-16T04:00:00.000Z"
}
],
"count": 2,
"has_more": true,
"source_url": "https://czqk28jt.apicdn.sanity.io/v1/graphql/prod_plk_us/default",
"fetched_at": "2026-09-04T00:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/popeyes.promotionsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | popeyes.PromotionsResponse | No | ||||
| data.count | integer | No | 20 | |||
| data.fetched_at | string | No | ||||
| data.has_more | boolean | No | true | HasMore is a paging heuristic -- see OffersResponse.HasMore. | ||
| data.promotions | array | No | ||||
| data.promotions[].bonus_points | integer | No | 300 | BonusPoints is set for a flat bonus-points promotion. | ||
| data.promotions[].end_date | string | No | 2021-08-16T04:00:00.000Z | |||
| data.promotions[].id | string | No | 11d41e3c-75b5-458c-8166-7cdfb20a635a | |||
| data.promotions[].message | string | No | Get Double Bonus Points on Your Cart, minimum $20 | Message is the promotion's own display copy, when Popeyes publishes one distinct from Name. | ||
| data.promotions[].name | string | No | Get Double Bonus Points on Your Cart, minimum $20 | Name is the promotion's own internal/public label. | ||
| data.promotions[].points_multiplier | number | No | 2 | PointsMultiplier is set for a "Nx points" style promotion (e.g. 2 for double points); mutually exclusive in practice with BonusPoints. | ||
| data.promotions[].start_date | string | No | 2021-08-02T04:00:00.000Z | StartDate/EndDate bound the promotion's active window, when Popeyes publishes one -- both empty means no published window restriction. | ||
| data.source_url | string | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/popeyes/promotions?limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"