Wendys API endpoint
Returns one restaurant's own priced, offered item list -- real local pricing (including full combo bundle prices, which GET /wendys/item deliberately does not compute, since a combo's own price varies by what's chosen in each slot) and any store-specific promotional items, rather than Wendy's own generic/average national-menu listing (GET /wendys/menu, /wendys/item). A request with just a store id returns real data, no session or account required.
/wendys/store-menuThe national menu (what /wendys/menu and /wendys/item return) is restaurant-agnostic — the same catalog every visitor sees before picking a location, with Wendy's own average/listed prices. This endpoint instead returns what one specific store actually charges — including full combo bundle prices, which /wendys/item deliberately does not compute at all (a combo's own price varies by what's chosen in each slot; see that endpoint's own docs).
Query parameters:
store_id (required) — numeric store id, e.g. from /wendys/nearby's stores[].store_id or /wendys/restaurant's store_id.Response includes store_id, items[], count, source_url, and fetched_at. Each items[] entry carries menu_item_id, name (the clean customer-facing name — an item can also carry an internal test/campaign-labeled variant, which this endpoint resolves down to its plain name), description (omitted for combo/bundle entries — call /wendys/item on the constituent item's own slug for that), calories, price (this store's own displayed price string), and day_part (e.g. BREAKFAST, LUNCH — an item on the menu in more than one day-part appears once per day-part it serves in).
A store id Wendy's own service does not recognize is a 404.
Example response (trimmed):
{"code":200,"msg":"OK","data":{"store_id":"12921","items":[{"menu_item_id":30013,"name":"Spicy Chicken Sandwich","description":"A juicy chicken breast marinated in a fiery blend of peppers and spices...","calories":"560 Cal","price":"$7.85","day_part":"LUNCH"},{"menu_item_id":40000,"name":"Dave's Single® Combo","price":"$11.94","day_part":"LUNCH"}],"count":170,"source_url":"https://api.app.prd.wendys.digital/mobile-client-gateway/menu/getSiteMenu?...","fetched_at":"2026-09-04T00:00:00Z"}}
| Field | Filled in, of 159 checked | Values in the sample |
|---|---|---|
| menu_item_id | 159 | |
| name | 159 | “Asiago Ranch Club Sandwich, Spicy” and 153 other values |
| description | 158 | median 159 characters |
| calories | 108 | “680 Cal” and 72 other values |
| price | 158 | “$9.89” and 89 other values |
| day_part | 139 | LUNCH (81), ALLDAY (31), BREAKFAST (27) |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| store_id | string | Yes | Numeric store id, e.g. from /wendys/nearby's stores[].store_id or /wendys/restaurant's store_id | 12921 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/wendys/store-menu?store_id=12921" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"store_id": "12921",
"items": [
{
"menu_item_id": 30013,
"name": "Spicy Chicken Sandwich",
"description": "A juicy chicken breast marinated in a fiery blend of peppers and spices...",
"calories": "560 Cal",
"price": "$7.85",
"day_part": "LUNCH"
},
{
"menu_item_id": 40000,
"name": "Dave's Single® Combo",
"price": "$11.94",
"day_part": "LUNCH"
}
],
"count": 170,
"source_url": "https://api.app.prd.wendys.digital/mobile-client-gateway/menu/getSiteMenu?...",
"fetched_at": "2026-09-04T00:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/wendys.storeMenuResponseDoc
| 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 | wendys.StoreMenuResponse | No | ||||
| data.count | integer | No | 170 | |||
| data.fetched_at | string | No | ||||
| data.items | array | No | ||||
| data.items[].calories | string | No | 560 Cal | |||
| data.items[].day_part | string | No | LUNCH | DayPart is when this item is on the menu (e.g. "BREAKFAST", "LUNCH") -- an item can appear more than once, once per day-part it serves in, each as its own entry. | ||
| data.items[].description | string | No | Description is omitted for combo/bundle entries, which the upstream does not publish one for (see /wendys/item's combo_slots for a combo's own constituent-item descriptions instead). | |||
| data.items[].menu_item_id | integer | No | 30013 | |||
| data.items[].name | string | No | Spicy Chicken Sandwich | |||
| data.items[].price | string | No | $7.85 | Price is this store's own displayed price string -- for a combo/ bundle entry, this is the real bundle price, which /wendys/item does not compute at all (a combo's own price varies by what's chosen in each slot; see item.go). | ||
| data.source_url | string | No | ||||
| data.store_id | string | No | 12921 | |||
| 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 |
| 404 | Not Found | #/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/wendys/store-menu?store_id=12921" \
-H "x-api-key: $CRAWLORA_API_KEY"