Chipotle API endpoint
Returns the preset meals one Chipotle restaurant sells -- group Build-Your-Own packs, the High Protein line and limited-time Influencer meals -- each with its dine-in and delivery price at that restaurant, calorie label, dietary and macro tags, the components that make it up, merchandising tags and images. Prices are genuinely restaurant-specific: the same Build-Your-Own Chicken pack is priced differently from one location to another, so this is the endpoint to use for real pricing rather than /chipotle/meals, which lists the national meal definitions with no prices at all. Calorie labels are a range for build-your-own meals and a single figure for fixed ones, so they are returned as strings. Restaurant numbers come from GET /chipotle/restaurants.
/chipotle/restaurant/mealsThis is the priced counterpart to /api/v1/chipotle/meals. That endpoint lists the national meal definitions — id, name, type and description — and carries no prices at all. This one is per-restaurant and prices are genuinely location-specific: the same Build-Your-Own Chicken pack is $48.00 dine-in at one restaurant and $58.00 at another. Use this endpoint whenever the price matters.
Three meal families are published:
BuildYourOwn — group packs, typically serving several people.HighProtein — the high-protein line, whose dietary_tags carry macro callouts such as 46g Protein | 14g Fiber | GLP-1 Friendly.Influencer — limited-time collaboration meals.Every meal carries both prices in one object, as elsewhere in this family: pricing.price is dine-in and pricing.delivery_price is delivery. Components have their own pricing where they add a surcharge, and it is omitted for included items rather than reported as zero.
calories is a string. Build-your-own meals publish a range (520 - 1220) because the total depends on what is chosen; fixed meals publish a single figure (1345). Forcing this to a number would lose the range. Note that Chipotle also emits a literal placeholder in its per-component calorie fields; those are dropped rather than surfaced.
Meals are returned in Chipotle's own sort_order, which is the merchandising order its apps display and is not the same as the upstream array order.
Query parameters:
restaurant_number (required) — Chipotle's numeric restaurant id, e.g. 3982. These come from /api/v1/chipotle/restaurants.meal_type (optional) — filter to one family. One of BuildYourOwn, HighProtein, Influencer. Matching is case-insensitive; any other value is rejected as an invalid parameter. A filter that matches nothing returns an empty list, not an error.An unknown restaurant number returns a 404.
Response includes restaurant_number, meals[], count, meal_type (echoing the filter, omitted when none was applied), source_url, and fetched_at. Each meal has meal_id, name, type, description, pricing, calories, dietary_tags[], meal_tags[], entree_name, entree_item_id, entree_available, components[], sides[], drinks[], images[], marketing_copy, and sort_order.
| Field | Filled in, of 15 checked | Values in the sample |
|---|---|---|
| meal_id | 15 | |
| name | 15 | “Family Meal - Chicken” and 14 other values |
| type | 15 | HighProtein (8), BuildYourOwn (4), Influencer (3) |
| description | 15 | median 116 characters |
| pricing | 15 | |
| calories | 15 | “520 - 1220” and 13 other values |
| dietary_tags | 15 | median 1 entry |
| entree_name | 12 | “Family Meal - Chicken” and 11 other values |
| entree_item_id | 12 | |
| components | 12 | median 6 entries |
| images | 15 | median 3 entries |
| marketing_copy | 14 | median 101 characters |
| sort_order | 15 | 1 to 7, median 4 |
| entree_available | 15 | true in 12 of 15 |
| sides | 4 | median 1 entry |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| restaurant_number | string | Yes | Chipotle's numeric restaurant id, from /chipotle/restaurants | 3982 | |
| meal_type | string | No | Filter to one meal family. One of BuildYourOwn, HighProtein, Influencer. Allowed values: BuildYourOwn, HighProtein, Influencer. | HighProtein | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/chipotle/restaurant/meals?restaurant_number=3982&meal_type=BuildYourOwn" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"restaurant_number": 3982,
"meals": [
{
"meal_id": "e4200067-da42-490c-81f1-37d26ddd9722",
"name": "Build-Your-Own Chicken",
"type": "BuildYourOwn",
"description": "Chicken, White Rice, Black Beans, Cheese, Romaine Lettuce, Fresh Tomato Salsa, Tomatillo-Red Chili Salsa, Sour Cream, Guacamole, 1 Large Chips, and 10 Soft Flour Tortillas",
"pricing": {
"price": 58,
"delivery_price": 75
},
"calories": "520 - 1220",
"dietary_tags": [
"Serves 4-6 people"
],
"entree_name": "Build-Your-Own Chicken",
"entree_item_id": "CMG-5374",
"entree_available": true,
"components": [
{
"item_id": "CMG-5375",
"name": "White Rice",
"quantity": 1,
"available": true
}
],
"images": [
{
"category": "WEB",
"url": "https://chipotlestrg-cdn.chipotle.com/assets/menuinnovation/pcms/e4200067-da42-490c-81f1-37d26ddd9722/2025_Chicken_Build_Web_1080x720.png"
}
],
"marketing_copy": "BuildYourOwn",
"sort_order": 1
}
],
"count": 21,
"source_url": "https://services.chipotle.com/menuinnovation/v1/restaurants/3982/onlinemeals",
"fetched_at": "2026-09-01T09:12:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/chipotle.restaurantMealsResponseDoc
| 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 | chipotle.RestaurantMealsResponse | No | ||||
| data.count | integer | No | 21 | |||
| data.fetched_at | string | No | ||||
| data.meal_type | string | No | HighProtein | MealType echoes the filter applied, empty when none was. | ||
| data.meals | array | No | ||||
| data.meals[].calories | string | No | 520 - 1220 | Calories is Chipotle's own label. It is a RANGE for build-your-own meals ("520 - 1220") and a single figure for fixed ones, so it stays a string rather than being forced into a number. | ||
| data.meals[].components | array | No | ||||
| data.meals[].components[].available | boolean | No | true | |||
| data.meals[].components[].customization_name | string | No | CustomizationName is set when the component is a chosen customization rather than a fixed part of the meal. | |||
| data.meals[].components[].item_id | string | No | CMG-5375 | |||
| data.meals[].components[].name | string | No | White Rice | |||
| data.meals[].components[].pricing | object | No | Pricing is the component's own surcharge, zero for included items. | |||
| data.meals[].components[].pricing.delivery_price | number | No | 13.9 | |||
| data.meals[].components[].pricing.price | number | No | 10.7 | |||
| data.meals[].components[].quantity | integer | No | 1 | |||
| data.meals[].description | string | No | ||||
| data.meals[].dietary_tags | array | No | DietaryTags carries Chipotle's own labels: serving size ("Serves 4-6 people") and, for the high-protein presets, macro callouts such as "46g Protein | 14g Fiber | GLP-1 Friendly". | |||
| data.meals[].drinks | array | No | ||||
| data.meals[].drinks[].available | boolean | No | true | |||
| data.meals[].drinks[].customization_name | string | No | CustomizationName is set when the component is a chosen customization rather than a fixed part of the meal. | |||
| data.meals[].drinks[].item_id | string | No | CMG-5375 | |||
| data.meals[].drinks[].name | string | No | White Rice | |||
| data.meals[].drinks[].pricing | object | No | Pricing is the component's own surcharge, zero for included items. | |||
| data.meals[].drinks[].pricing.delivery_price | number | No | 13.9 | |||
| data.meals[].drinks[].pricing.price | number | No | 10.7 | |||
| data.meals[].drinks[].quantity | integer | No | 1 | |||
| data.meals[].entree_available | boolean | No | true | |||
| data.meals[].entree_item_id | string | No | CMG-5374 | |||
| data.meals[].entree_name | string | No | Entree is the meal's headline item and its components. | |||
| data.meals[].images | array | No | ||||
| data.meals[].images[].category | string | No | WEB | |||
| data.meals[].images[].url | string | No | ||||
| data.meals[].marketing_copy | string | No | BuildYourOwn | |||
| data.meals[].meal_id | string | No | e4200067-da42-490c-81f1-37d26ddd9722 | |||
| data.meals[].meal_tags | array | No | MealTags are typed merchandising tags, e.g. type "rewards" with value "Exclusive". They are objects upstream, not plain strings. | |||
| data.meals[].meal_tags[].type | string | No | rewards | |||
| data.meals[].meal_tags[].value | string | No | Exclusive | |||
| data.meals[].name | string | No | Build-Your-Own Chicken | |||
| data.meals[].pricing | object | No | Pricing is the whole meal's dine-in and delivery price at this restaurant. Prices are restaurant-specific. | |||
| data.meals[].pricing.delivery_price | number | No | 13.9 | |||
| data.meals[].pricing.price | number | No | 10.7 | |||
| data.meals[].sides | array | No | ||||
| data.meals[].sides[].available | boolean | No | true | |||
| data.meals[].sides[].customization_name | string | No | CustomizationName is set when the component is a chosen customization rather than a fixed part of the meal. | |||
| data.meals[].sides[].item_id | string | No | CMG-5375 | |||
| data.meals[].sides[].name | string | No | White Rice | |||
| data.meals[].sides[].pricing | object | No | Pricing is the component's own surcharge, zero for included items. | |||
| data.meals[].sides[].pricing.delivery_price | number | No | 13.9 | |||
| data.meals[].sides[].pricing.price | number | No | 10.7 | |||
| data.meals[].sides[].quantity | integer | No | 1 | |||
| data.meals[].sort_order | integer | No | 1 | |||
| data.meals[].type | string | No | BuildYourOwn | |||
| data.restaurant_number | integer | No | 3982 | |||
| 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/chipotle/restaurant/meals?restaurant_number=3982&meal_type=BuildYourOwn" \
-H "x-api-key: $CRAWLORA_API_KEY"