Panera API endpoint
Returns one cafe's full category tree (with subcategories) and its complete item catalog, priced for that specific cafe -- Panera's prices are genuinely per-cafe, not a national list (the same salad has been confirmed live at different prices in Chicago and New York). Each item carries its price, product type, whether it is customizable, its published nutrients (only Calories and Caffeine are published -- a fuller macro/micronutrient breakdown is not available), its allergen statement (contains / may-contain, each with an id and display name), Panera's own wellness/dietary labels (for example Vegan, Vegetarian, Gluten Conscious), and a live in_stock flag reflecting this cafe's current stockouts. Cafe ids come from GET /panera/locations. An unknown cafe id returns a 404.
/panera/menuPrices are genuinely per-cafe — Panera does not publish a single national price list. The same item has been confirmed live at different prices in different cities (a salad priced $6.19 in a Chicago-suburb cafe vs. $6.89 in a Manhattan cafe, same day).
Query parameters:
cafe_id (required) — Panera cafe id, from /panera/locations, e.g. 601447.Response shape:
categories[] — the category tree in display order. Each node has cat_id, name, sort_weight, image_key, item_ids[] (items directly under this category — look them up in the top-level items[]), and subcategories[] (recursively the same shape).items[] — every resolved item at this cafe, each with:
item_id, name, description, price, product_type (Panera's own upstream label, e.g. SANDWICH, SALAD, SOUP, BEVERAGE, BAKED_GOOD, BOWL, PASTA, PARFAIT, OATMEAL, SPREAD, COMBO, SIDE), customizable, image_key.nutrients[] — limited to Calories and Caffeine on this surface. A fuller macro/micronutrient breakdown (protein, fat, sodium, etc.) is not available. Each entry has name, value, unit.allergens — contains[] and may_contain[], each entry an {id, name} pair (e.g. {"id":"TREENUTS","name":"Tree Nuts"}). Omitted when Panera publishes no allergen statement for the item.wellness[] — Panera's own dietary labels, e.g. Vegan, Vegetarian, Gluten Conscious.tags[] — Panera's own merchandising badges for this item, e.g. NEW_PRODUCT, LIMITED_TIME, IN_SEASON, ITS_BACK, MY_PANERA_EXCLUSIVE. Best-effort: fetched from a separate feed keyed to a different id space than the rest of this catalog, so not every item resolves one.in_stock — reflects this cafe's live stockout feed. false means Panera currently has this item unavailable to order at this specific cafe (a temporary 86, not a permanently retired item).Example response (trimmed):
{"code":200,"msg":"OK","data":{"cafe_id":601447,"categories":[{"cat_id":22,"name":"Salads","sort_weight":9,"image_key":"salads","item_ids":[1805]}],"items":[{"item_id":1805,"name":"Half Strawberry Poppyseed Salad","description":"Crisp romaine topped with mandarin oranges, fresh strawberries, blueberries, pineapple, and toasted pecan pieces with poppyseed dressing on the side.","price":6.19,"product_type":"SALAD","customizable":true,"image_key":"strawberry-poppyseed-salad-pantry-reno-half","nutrients":[{"name":"Calories","value":130,"unit":"Cal"},{"name":"Caffeine","value":0,"unit":"mg"}],"allergens":{"contains":[{"id":"TREENUTS","name":"Tree Nuts"}]},"wellness":["Gluten Conscious","Vegan","Vegetarian"],"in_stock":true}],"count":343,"source_url":"https://www-api.panerabread.com/www-api/public/menu/placards/601447/version/109407/109408/en-US","fetched_at":"2026-09-01T12:00:00Z"}}
| Field | Filled in, of 346 checked | Values in the sample |
|---|---|---|
| item_id | 346 | |
| name | 346 | “Tropical Mango Pineapple Energy Refresher - Naturally Flavo…” and 282 other values |
| description | 346 | median 121 characters |
| price | 346 | 0.99 to 46, median 6.89 |
| product_type | 346 | “BEVERAGE” and 11 other values |
| customizable | 346 | true in 262 of 346 |
| image_key | 346 | |
| nutrients | 334 | median 2 entries |
| wellness | 276 | median 2 entries |
| in_stock | 346 | true in 334 of 346 |
| allergens | 267 | |
| tags | 209 | median 5 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| cafe_id | integer | Yes | Panera cafe id, from /panera/locations | 601447 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/panera/menu?cafe_id=601447" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"cafe_id": 601447,
"categories": [
{
"cat_id": 22,
"name": "Salads",
"sort_weight": 9,
"image_key": "salads",
"item_ids": [
1805
]
}
],
"items": [
{
"item_id": 1805,
"name": "Half Strawberry Poppyseed Salad",
"description": "Crisp romaine topped with mandarin oranges, fresh strawberries, blueberries, pineapple, and toasted pecan pieces with poppyseed dressing on the side.",
"price": 6.19,
"product_type": "SALAD",
"customizable": true,
"image_key": "strawberry-poppyseed-salad-pantry-reno-half",
"nutrients": [
{
"name": "Calories",
"value": 130,
"unit": "Cal"
},
{
"name": "Caffeine",
"value": 0,
"unit": "mg"
}
],
"allergens": {
"contains": [
{
"id": "TREENUTS",
"name": "Tree Nuts"
}
]
},
"wellness": [
"Gluten Conscious",
"Vegan",
"Vegetarian"
],
"in_stock": true
}
],
"count": 343,
"source_url": "https://www-api.panerabread.com/www-api/public/menu/placards/601447/version/109407/109408/en-US",
"fetched_at": "2026-09-01T12:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/panera.menuResponseDoc
| 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 | panera.MenuResponse | No | ||||
| data.cafe_id | integer | No | 601447 | |||
| data.categories | array | No | ||||
| data.categories[].cat_id | integer | No | 20 | |||
| data.categories[].image_key | string | No | panini-and-sandwiches | |||
| data.categories[].item_ids | array | No | ItemIDs are the items directly under this category. Look them up in the response's top-level Items list. | |||
| data.categories[].name | string | No | Sandwiches | |||
| data.categories[].sort_weight | integer | No | 6 | |||
| data.categories[].subcategories | array | No | ||||
| data.count | integer | No | 343 | |||
| data.fetched_at | string | No | ||||
| data.items | array | No | ||||
| data.items[].allergens | panera.MenuAllergens | No | MenuAllergens record, 6 fields: contains, may_contain. Described under Panera Bread Item Detail API. | |||
| data.items[].customizable | boolean | No | true | |||
| data.items[].description | string | No | ||||
| data.items[].image_key | string | No | strawberry-poppyseed-salad-pantry-reno-half | |||
| data.items[].in_stock | boolean | No | true | InStock reflects this cafe's live stockout feed. false means Panera currently has this item unavailable to order at this specific cafe. | ||
| data.items[].item_id | integer | No | 1805 | |||
| data.items[].name | string | No | Half Strawberry Poppyseed Salad | |||
| data.items[].nutrients | array | No | ||||
| data.items[].nutrients[].name | string | No | Calories | |||
| data.items[].nutrients[].unit | string | No | Cal | |||
| data.items[].nutrients[].value | number | No | 580 | |||
| data.items[].price | number | No | 6.19 | |||
| data.items[].product_type | string | No | SALAD | |||
| data.items[].tags | array | No | Tags are Panera's own merchandising badges for this item (e.g. NEW_PRODUCT, LIMITED_TIME, IN_SEASON, ITS_BACK, MY_PANERA_EXCLUSIVE). Best-effort: badges are fetched from a separate feed keyed to a different id space than the rest of this catalog, so not every item resolves one -- see common.go's package doc. | |||
| data.items[].wellness | array | No | Wellness are Panera's own dietary labels (e.g. Vegan, Vegetarian, Gluten Conscious). | |||
| 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 |
| 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/panera/menu?cafe_id=601447" \
-H "x-api-key: $CRAWLORA_API_KEY"