Panera API endpoint
Returns one cafe's catering category list and its full catering item catalog, priced for that specific cafe -- Panera's catering ordering flow is a separate application from its retail site, with its own category structure, pricing and item availability (confirmed live: the same item priced differently between a placeholder default cafe and a real cafe). Categories are a flat list (catering does not publish a category hierarchy the way the retail menu does). Each item carries its price, product type, portion label, whether it is customizable, a full published nutrient panel (calories, calories from fat, fat, saturated fat, trans fat, cholesterol, sodium, carbohydrates, dietary fiber, total sugars, protein, caffeine -- richer than the retail menu's calories/caffeine-only surface), its allergen statement (contains / may-contain, each with an id and display name), and a live in_stock flag from this cafe's current catering stockout feed for today. Cafe ids come from GET /panera/locations.
/panera/catering-menuCatering prices are also genuinely per-cafe. Confirmed live: the same item priced differently between a placeholder default cafe (used before a real delivery address is entered) and a real cafe ($6.89 vs. $10.99 for the same sandwich).
Categories are a flat list. Unlike /panera/menu, catering does not publish an explicit category parent/child hierarchy — every category is returned at the top level with its own resolved item ids.
Nutrition on this surface is a full per-serving breakdown — calories, calories from fat, fat, saturated fat, trans fat, cholesterol, sodium, carbohydrates, dietary fiber, total sugars, protein, and caffeine — richer than /panera/menu's calories/caffeine-only surface.
Query parameters:
cafe_id (required) — Panera cafe id, from /panera/locations, e.g. 601447.Response shape:
categories[] — a flat list, each with cat_id, name, sort_weight, image_key, and item_ids[] (items in this category — look them up in the top-level items[]).items[] — every resolved catering item at this cafe, each with:
item_id, name, description, price, product_type (Panera's own upstream label, e.g. SANDWICH, SALAD, SOUP), portion (e.g. Individual), customizable, image_key.nutrients[] — a full published nutrient panel. Each entry has name, value, unit.allergens — contains[] and may_contain[], each entry an {id, name} pair. Omitted when Panera publishes no allergen statement for the item.in_stock — reflects this cafe's live catering stockout feed for today's fulfillment date.Example response (trimmed):
{"code":200,"msg":"OK","data":{"cafe_id":606477,"categories":[{"cat_id":181,"name":"Sandwiches","sort_weight":1,"item_ids":[647093]}],"items":[{"item_id":647093,"name":"Ciabatta Sausage, Egg & Cheese Sandwich Boxed Breakfast","description":"Savory sausage and scrambled egg with melty aged white cheddar with salt and pepper on our Ciabatta. Served with a fruit cup.","price":10.99,"product_type":"PRODUCT","portion":"Individual","customizable":true,"image_key":"sausage-scrambled-egg-and-cheese-breakfast-sandwich","nutrients":[{"name":"Calories","value":610,"unit":"Cal"},{"name":"Fat","value":33,"unit":"g"},{"name":"Sodium","value":1080,"unit":"mg"},{"name":"Protein","value":28,"unit":"g"}],"allergens":{"contains":[{"id":"EGG","name":"Egg"},{"id":"MILK","name":"Milk"},{"id":"WHEAT","name":"Wheat"}],"may_contain":[{"id":"MAYSESAME","name":"Sesame"}]},"in_stock":true}],"count":257,"source_url":"https://catering.panerabread.com/foundation-api/public/cafe/606477/menu/version/109864/placards?busUnit=cater","fetched_at":"2026-09-02T12:00:00Z"}}
| Field | Filled in, of 240 checked | Values in the sample |
|---|---|---|
| item_id | 240 | |
| name | 240 | “Chips” and 209 other values |
| description | 240 | median 144 characters |
| price | 216 | 0.89 to 311.99, median 11.39 |
| product_type | 239 | “SIDE” and 10 other values |
| portion | 235 | “Individual” and 20 other values |
| customizable | 240 | true in 173 of 240 |
| image_key | 239 | |
| nutrients | 219 | median 12 entries |
| in_stock | 240 | true in 232 of 240 |
| allergens | 190 |
| 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/catering-menu?cafe_id=601447" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"cafe_id": 606477,
"categories": [
{
"cat_id": 181,
"name": "Sandwiches",
"sort_weight": 1,
"item_ids": [
647093
]
}
],
"items": [
{
"item_id": 647093,
"name": "Ciabatta Sausage, Egg & Cheese Sandwich Boxed Breakfast",
"description": "Savory sausage and scrambled egg with melty aged white cheddar with salt and pepper on our Ciabatta. Served with a fruit cup.",
"price": 10.99,
"product_type": "PRODUCT",
"portion": "Individual",
"customizable": true,
"image_key": "sausage-scrambled-egg-and-cheese-breakfast-sandwich",
"nutrients": [
{
"name": "Calories",
"value": 610,
"unit": "Cal"
},
{
"name": "Fat",
"value": 33,
"unit": "g"
},
{
"name": "Sodium",
"value": 1080,
"unit": "mg"
},
{
"name": "Protein",
"value": 28,
"unit": "g"
}
],
"allergens": {
"contains": [
{
"id": "EGG",
"name": "Egg"
},
{
"id": "MILK",
"name": "Milk"
},
{
"id": "WHEAT",
"name": "Wheat"
}
],
"may_contain": [
{
"id": "MAYSESAME",
"name": "Sesame"
}
]
},
"in_stock": true
}
],
"count": 257,
"source_url": "https://catering.panerabread.com/foundation-api/public/cafe/606477/menu/version/109864/placards?busUnit=cater",
"fetched_at": "2026-09-02T12:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/panera.cateringMenuResponseDoc
| 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.CateringMenuResponse | No | ||||
| data.cafe_id | integer | No | 601447 | |||
| data.categories | array | No | ||||
| data.categories[].cat_id | integer | No | 181 | |||
| data.categories[].image_key | string | No | ||||
| data.categories[].item_ids | array | No | ItemIDs are the items 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 | ||||
| data.count | integer | No | 257 | |||
| 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 | ||||
| data.items[].in_stock | boolean | No | true | InStock reflects this cafe's live catering stockout feed for today's fulfillment date. false means Panera currently has this item unavailable to order for catering at this specific cafe. | ||
| data.items[].item_id | integer | No | 647093 | |||
| data.items[].name | string | No | Ciabatta Sausage, Egg & Cheese Sandwich | |||
| 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[].portion | string | No | Individual | |||
| data.items[].price | number | No | 10.99 | |||
| data.items[].product_type | string | No | SANDWICH | |||
| 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/panera/catering-menu?cafe_id=601447" \
-H "x-api-key: $CRAWLORA_API_KEY"