McDonalds API endpoint
Returns the items in one McDonald's menu category: each item's numeric id, name, product page URL and image. The item id is what GET /mcdonalds/item takes for full nutrition. Category slugs come from GET /mcdonalds/categories and must be paired with the country they came from -- both slugs and item ids are market-specific. Prices are not available; McDonald's does not publish them on this surface. A calorie label is included per item where the category page prints one, which is often blank.
/mcdonalds/menuPrices are not available — McDonald's does not publish them on this surface.
Query parameters:
category (required) — category slug from /api/v1/mcdonalds/categories, e.g. breakfast.An unknown category returns a 503 rather than an empty list: a real McDonald's category always has items, so zero parsed items means either an unknown slug or page-shape drift, and neither is served as a successful empty menu.
Response includes category, items[], count, source_url, and fetched_at. Each item has item_id, name, product_url, image_url, and calories (McDonald's own per-item calorie label where the category page prints one; often blank).
Markets:
country (optional, default us) — which market. One of us, ca, gb, au, ie, nz, ch, se.Category slugs and item ids are market-specific: whats-new exists in Great Britain and Ireland but not the United States, and the same numeric item id means different products in different markets. Always pass the same country back through /mcdonalds/categories → /mcdonalds/menu → /mcdonalds/item. The response echoes country so a mixed-market workflow stays self-describing.
The three endpoints support different market sets — the locator ten, the catalog eight, nutrition seven — because McDonald's publishes different surfaces per market, not because of a limitation here. Great Britain, for example, publishes a menu but no nutrition surface.
| Field | Filled in, of 32 checked | Values in the sample |
|---|---|---|
| item_id | 32 | |
| name | 32 | “Bacon, Egg & Cheese Biscuit” and 31 other values |
| product_url | 32 | mcdonalds.com |
| image_url | 32 | s7d1.scene7.com |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| category | string | Yes | Category slug from /mcdonalds/categories | breakfast | |
| country | string | No | Market (default us). One of us, ca, gb, au, ie, nz, ch, se. Must match the market the slug came from. Allowed values: us, ca, gb, au, ie, nz, ch, se. | us | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/mcdonalds/menu?category=breakfast&country=us" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"category": "breakfast",
"items": [
{
"item_id": "200300",
"name": "Bacon, Egg & Cheese Biscuit",
"product_url": "https://www.mcdonalds.com/us/en-us/product/bacon-egg-cheese-biscuit.html",
"image_url": "https://s7d1.scene7.com/is/image/mcdonalds/DC_202405_0085_BaconEggCheeseBiscuit_1564x1564-1:nutrition-calculator-tile?fmt=png-alpha"
}
],
"count": 32,
"source_url": "https://www.mcdonalds.com/us/en-us/full-menu/breakfast.html",
"fetched_at": "2026-08-31T05:10:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/mcdonalds.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 | mcdonalds.MenuResponse | No | ||||
| data.category | string | No | breakfast | |||
| data.count | integer | No | 32 | |||
| data.country | string | No | us | |||
| data.fetched_at | string | No | ||||
| data.items | array | No | ||||
| data.items[].calories | string | No | 460 Cal. | Calories is McDonald's own per-item calorie label where the category page prints one; often blank. | ||
| data.items[].image_url | string | No | ||||
| data.items[].item_id | string | No | 200300 | |||
| data.items[].name | string | No | Bacon, Egg & Cheese Biscuit | |||
| data.items[].product_url | string | No | ||||
| 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/mcdonalds/menu?category=breakfast&country=us" \
-H "x-api-key: $CRAWLORA_API_KEY"