Chipotle API endpoint
Returns Chipotle's restaurant-independent menu catalog -- every item it sells nationally, split into entrees, sides and drinks, with each item's category, type, primary filling and full customization tree. Takes no parameters. Prices are deliberately omitted from this response: Chipotle prices per restaurant, so the upstream returns every price as zero here, and surfacing a field of zeros would read as "free" rather than "unpriced". Use GET /chipotle/restaurant/menu for real prices.
/chipotle/menuTakes no parameters.
Prices are deliberately omitted from this response. Chipotle prices per restaurant, so the upstream returns every price as zero here; surfacing a field of zeros would read as "free" rather than "unpriced". The pricing key is therefore absent on this endpoint's items. Use /api/v1/chipotle/restaurant/menu for real prices.
Response includes entrees[], sides[], drinks[], non_food_items[], source_url, and fetched_at. Each item has item_id, name, category, type, pos_id, primary_filling, available, delivery_eligible, max_quantity, contents[], and content_groups[] — but no pricing.
| Field | Filled in, of 111 checked | Values in the sample |
|---|---|---|
| item_id | 111 | |
| name | 111 | “Smoked Brisket Bowl” and 110 other values |
| category | 111 | Entree in all 111 |
| type | 111 | “Bowl” and 8 other values |
| pos_id | 111 | |
| primary_filling | 111 | “Smoked Brisket” and 17 other values |
| available | 111 | true in 111 of 111 |
| delivery_eligible | 111 | true in 111 of 111 |
| max_quantity | 111 | 1 |
| contents | 111 | median 26 entries |
| content_groups | 111 | median 3 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/chipotle/menu" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"entrees": [
{
"item_id": "CMG-6",
"name": "Veggie Burrito",
"category": "Entree",
"type": "Burrito",
"pos_id": 4,
"primary_filling": "Veggie",
"available": true,
"delivery_eligible": true,
"max_quantity": 1,
"content_groups": [
{
"name": "BYORiceContentGroup",
"min_quantity": 0,
"max_quantity": 1
}
]
}
],
"sides": [],
"drinks": [],
"source_url": "https://services.chipotle.com/menuinnovation/v1/universalmenus/menurules",
"fetched_at": "2026-08-31T04:20:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/chipotle.nationalMenuResponseDoc
| 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.NationalMenuResponse | No | ||||
| data.drinks | array | No | ||||
| data.drinks[].available | boolean | No | true | |||
| data.drinks[].category | string | No | Entree | |||
| data.drinks[].content_groups | array | No | ContentGroups describe how many picks each component group allows. | |||
| data.drinks[].content_groups[].max_quantity | integer | No | 1 | |||
| data.drinks[].content_groups[].min_quantity | integer | No | 1 | |||
| data.drinks[].content_groups[].name | string | No | BYOSalsaContentGroup | |||
| data.drinks[].contents | array | No | Contents are the included/optional components of a built item. | |||
| data.drinks[].contents[].delivery_eligible | boolean | No | true | |||
| data.drinks[].contents[].group_name | string | No | BYOAlwaysIncluded | GroupName ties this content back to a ContentGroup entry. | ||
| data.drinks[].contents[].item_id | string | No | CMG-5382 | |||
| data.drinks[].contents[].name | string | No | Large Guacamole | |||
| data.drinks[].contents[].pos_id | integer | No | 6020 | |||
| data.drinks[].contents[].pricing | chipotle.Money | No | ||||
| data.drinks[].contents[].pricing.delivery_price | number | No | 13.9 | |||
| data.drinks[].contents[].pricing.price | number | No | 10.7 | |||
| data.drinks[].contents[].type | string | No | Included | |||
| data.drinks[].delivery_eligible | boolean | No | true | |||
| data.drinks[].item_id | string | No | CMG-6 | |||
| data.drinks[].max_quantity | integer | No | 1 | |||
| data.drinks[].name | string | No | Veggie Burrito | |||
| data.drinks[].pos_id | integer | No | 4 | PosID is Chipotle's point-of-sale id for the item. | ||
| data.drinks[].pricing | object | No | Pricing is absent on the national catalog, where Chipotle publishes no prices at all -- a zeroed price object there would read as "free" rather than "unpriced at this level". | |||
| data.drinks[].pricing.delivery_price | number | No | 13.9 | |||
| data.drinks[].pricing.price | number | No | 10.7 | |||
| data.drinks[].primary_filling | string | No | Veggie | PrimaryFilling is the protein/filling the item is built around. | ||
| data.drinks[].type | string | No | Burrito | |||
| data.entrees | array | No | ||||
| data.entrees[].available | boolean | No | true | |||
| data.entrees[].category | string | No | Entree | |||
| data.entrees[].content_groups | array | No | ContentGroups describe how many picks each component group allows. | |||
| data.entrees[].content_groups[].max_quantity | integer | No | 1 | |||
| data.entrees[].content_groups[].min_quantity | integer | No | 1 | |||
| data.entrees[].content_groups[].name | string | No | BYOSalsaContentGroup | |||
| data.entrees[].contents | array | No | Contents are the included/optional components of a built item. | |||
| data.entrees[].contents[].delivery_eligible | boolean | No | true | |||
| data.entrees[].contents[].group_name | string | No | BYOAlwaysIncluded | GroupName ties this content back to a ContentGroup entry. | ||
| data.entrees[].contents[].item_id | string | No | CMG-5382 | |||
| data.entrees[].contents[].name | string | No | Large Guacamole | |||
| data.entrees[].contents[].pos_id | integer | No | 6020 | |||
| data.entrees[].contents[].pricing | chipotle.Money | No | ||||
| data.entrees[].contents[].pricing.delivery_price | number | No | 13.9 | |||
| data.entrees[].contents[].pricing.price | number | No | 10.7 | |||
| data.entrees[].contents[].type | string | No | Included | |||
| data.entrees[].delivery_eligible | boolean | No | true | |||
| data.entrees[].item_id | string | No | CMG-6 | |||
| data.entrees[].max_quantity | integer | No | 1 | |||
| data.entrees[].name | string | No | Veggie Burrito | |||
| data.entrees[].pos_id | integer | No | 4 | PosID is Chipotle's point-of-sale id for the item. | ||
| data.entrees[].pricing | object | No | Pricing is absent on the national catalog, where Chipotle publishes no prices at all -- a zeroed price object there would read as "free" rather than "unpriced at this level". | |||
| data.entrees[].pricing.delivery_price | number | No | 13.9 | |||
| data.entrees[].pricing.price | number | No | 10.7 | |||
| data.entrees[].primary_filling | string | No | Veggie | PrimaryFilling is the protein/filling the item is built around. | ||
| data.entrees[].type | string | No | Burrito | |||
| data.fetched_at | string | No | ||||
| data.non_food_items | array | No | ||||
| data.non_food_items[].available | boolean | No | true | |||
| data.non_food_items[].category | string | No | Entree | |||
| data.non_food_items[].content_groups | array | No | ContentGroups describe how many picks each component group allows. | |||
| data.non_food_items[].content_groups[].max_quantity | integer | No | 1 | |||
| data.non_food_items[].content_groups[].min_quantity | integer | No | 1 | |||
| data.non_food_items[].content_groups[].name | string | No | BYOSalsaContentGroup | |||
| data.non_food_items[].contents | array | No | Contents are the included/optional components of a built item. | |||
| data.non_food_items[].contents[].delivery_eligible | boolean | No | true | |||
| data.non_food_items[].contents[].group_name | string | No | BYOAlwaysIncluded | GroupName ties this content back to a ContentGroup entry. | ||
| data.non_food_items[].contents[].item_id | string | No | CMG-5382 | |||
| data.non_food_items[].contents[].name | string | No | Large Guacamole | |||
| data.non_food_items[].contents[].pos_id | integer | No | 6020 | |||
| data.non_food_items[].contents[].pricing | chipotle.Money | No | ||||
| data.non_food_items[].contents[].pricing.delivery_price | number | No | 13.9 | |||
| data.non_food_items[].contents[].pricing.price | number | No | 10.7 | |||
| data.non_food_items[].contents[].type | string | No | Included | |||
| data.non_food_items[].delivery_eligible | boolean | No | true | |||
| data.non_food_items[].item_id | string | No | CMG-6 | |||
| data.non_food_items[].max_quantity | integer | No | 1 | |||
| data.non_food_items[].name | string | No | Veggie Burrito | |||
| data.non_food_items[].pos_id | integer | No | 4 | PosID is Chipotle's point-of-sale id for the item. | ||
| data.non_food_items[].pricing | object | No | Pricing is absent on the national catalog, where Chipotle publishes no prices at all -- a zeroed price object there would read as "free" rather than "unpriced at this level". | |||
| data.non_food_items[].pricing.delivery_price | number | No | 13.9 | |||
| data.non_food_items[].pricing.price | number | No | 10.7 | |||
| data.non_food_items[].primary_filling | string | No | Veggie | PrimaryFilling is the protein/filling the item is built around. | ||
| data.non_food_items[].type | string | No | Burrito | |||
| data.sides | array | No | ||||
| data.sides[].available | boolean | No | true | |||
| data.sides[].category | string | No | Entree | |||
| data.sides[].content_groups | array | No | ContentGroups describe how many picks each component group allows. | |||
| data.sides[].content_groups[].max_quantity | integer | No | 1 | |||
| data.sides[].content_groups[].min_quantity | integer | No | 1 | |||
| data.sides[].content_groups[].name | string | No | BYOSalsaContentGroup | |||
| data.sides[].contents | array | No | Contents are the included/optional components of a built item. | |||
| data.sides[].contents[].delivery_eligible | boolean | No | true | |||
| data.sides[].contents[].group_name | string | No | BYOAlwaysIncluded | GroupName ties this content back to a ContentGroup entry. | ||
| data.sides[].contents[].item_id | string | No | CMG-5382 | |||
| data.sides[].contents[].name | string | No | Large Guacamole | |||
| data.sides[].contents[].pos_id | integer | No | 6020 | |||
| data.sides[].contents[].pricing | chipotle.Money | No | ||||
| data.sides[].contents[].pricing.delivery_price | number | No | 13.9 | |||
| data.sides[].contents[].pricing.price | number | No | 10.7 | |||
| data.sides[].contents[].type | string | No | Included | |||
| data.sides[].delivery_eligible | boolean | No | true | |||
| data.sides[].item_id | string | No | CMG-6 | |||
| data.sides[].max_quantity | integer | No | 1 | |||
| data.sides[].name | string | No | Veggie Burrito | |||
| data.sides[].pos_id | integer | No | 4 | PosID is Chipotle's point-of-sale id for the item. | ||
| data.sides[].pricing | object | No | Pricing is absent on the national catalog, where Chipotle publishes no prices at all -- a zeroed price object there would read as "free" rather than "unpriced at this level". | |||
| data.sides[].pricing.delivery_price | number | No | 13.9 | |||
| data.sides[].pricing.price | number | No | 10.7 | |||
| data.sides[].primary_filling | string | No | Veggie | PrimaryFilling is the protein/filling the item is built around. | ||
| data.sides[].type | string | No | Burrito | |||
| 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 |
|---|---|---|
| 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/menu" \
-H "x-api-key: $CRAWLORA_API_KEY"