Arbys API endpoint
Returns the items in one Arby's menu category, each with its stable product code, name, description, image, tags, availability, a full per-serving nutrition panel (calories, total and saturated fat, trans fat, cholesterol, sodium, carbohydrate, fiber, sugar, protein and serving weight), and a price when store_id resolves to a priced catalog. Category slugs come from GET /arbys/categories. store_id (optional, default 0) is Arby's own priceless national reference catalog; pass a store_id you already know to get that store's pricing instead -- there is no location-lookup endpoint in this family, so store_id is a passthrough value, not something this API can look up for you. A price of exactly 0 on an item is a genuine free add-on, distinct from the default catalog's complete absence of pricing.
/arbys/menuQuery parameters:
category (required) — category slug from /api/v1/arbys/categories, e.g. slow-roasted-beef.store_id (optional, default 0) — same semantics as /api/v1/arbys/categories. 0 is Arby's priceless national reference catalog: every item's price is omitted entirely. Passing a real store id returns that store's live pricing instead — find one with /api/v1/arbys/locations (a proximity search) or use one you already know.An unknown category returns 404. A price of exactly 0 is a genuine free item/add-on and is distinct from the default catalog's complete absence of a price field — check for null/absent price, not 0, to detect "this catalog has no pricing".
Response includes category, store_id, display_name, items[], count, source_url, and fetched_at. Each item has:
code — Arby's own stable product key, unique across the whole catalog.slug, name, description, image_url, tags[], is_available, url (the item's page on arbys.com).price (object with value/currency, omitted when this catalog has no pricing at all).nutrition (omitted only for a handful of size-variant parent products Arby's publishes with no nutrition data): calories, calories_from_fat, calories_min/calories_max (set instead of calories for a size-dependent item such as a fountain drink), total_fat_grams, saturated_fat_grams, trans_fat_grams, cholesterol_mg, sodium_mg, total_carbohydrate_grams, dietary_fiber_grams, sugars_grams, protein_grams, serving_weight_grams.| Field | Filled in, of 7 checked | Values in the sample |
|---|---|---|
| code | 7 | |
| slug | 7 | |
| name | 7 | “Bottled Water” and 6 other values |
| nutrition | 1 | |
| tags | 2 | median 2 entries |
| image_url | 7 | imagedelivery.net |
| is_available | 7 | true in 7 of 7 |
| url | 7 | arbys.com |
| description | 5 | “The perfect mix of water, pure lemon juice, and cane sugar.” and 4 other values |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| category | string | Yes | Category slug from /arbys/categories | slow-roasted-beef | |
| store_id | integer | No | Optional. Same store id semantics as /arbys/categories. | 0 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/arbys/menu?category=slow-roasted-beef" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"category": "slow-roasted-beef",
"store_id": 1,
"display_name": "ARB-National",
"items": [
{
"code": "classic-roast-beef-fb83178d",
"slug": "classic-roast-beef",
"name": "Classic Roast Beef",
"description": "This is the sandwich that put roast beef on the map.",
"price": {
"value": 5.09,
"currency": "USD"
},
"nutrition": {
"calories": 360,
"calories_from_fat": 120,
"total_fat_grams": 14,
"saturated_fat_grams": 5,
"trans_fat_grams": 0.5,
"cholesterol_mg": 50,
"sodium_mg": 970,
"total_carbohydrate_grams": 37,
"dietary_fiber_grams": 2,
"sugars_grams": 5,
"protein_grams": 23,
"serving_weight_grams": 154
},
"tags": [
"protein.Beef"
],
"image_url": "https://imagedelivery.net/.../download",
"is_available": true,
"url": "https://www.arbys.com/menu/categories/slow-roasted-beef/classic-roast-beef/"
}
],
"count": 7,
"source_url": "https://api.arbys.com/menu/1",
"fetched_at": "2026-09-01T12:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/arbys.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 | arbys.MenuResponse | No | ||||
| data.category | string | No | slow-roasted-beef | |||
| data.count | integer | No | 7 | |||
| data.display_name | string | No | ARB-National | |||
| data.fetched_at | string | No | ||||
| data.items | array | No | ||||
| data.items[].code | string | No | classic-roast-beef-fb83178d | Code is Arby's own stable product key, unique across the whole catalog. | ||
| data.items[].description | string | No | ||||
| data.items[].image_url | string | No | ||||
| data.items[].is_available | boolean | No | true | |||
| data.items[].name | string | No | Classic Roast Beef | |||
| data.items[].nutrition | arbys.NutritionFacts | No | ||||
| data.items[].nutrition.calories | number | No | 360 | |||
| data.items[].nutrition.calories_from_fat | number | No | 120 | |||
| data.items[].nutrition.calories_max | number | No | 380 | |||
| data.items[].nutrition.calories_min | number | No | 0 | CaloriesMin/Max are set instead of Calories for a size-variant item (e.g. a fountain drink) whose calories depend on a choice Arby's does not resolve at this level. | ||
| data.items[].nutrition.cholesterol_mg | number | No | 50 | |||
| data.items[].nutrition.dietary_fiber_grams | number | No | 2 | |||
| data.items[].nutrition.protein_grams | number | No | 23 | |||
| data.items[].nutrition.saturated_fat_grams | number | No | 5 | |||
| data.items[].nutrition.serving_weight_grams | number | No | 154 | |||
| data.items[].nutrition.sodium_mg | number | No | 970 | |||
| data.items[].nutrition.sugars_grams | number | No | 5 | |||
| data.items[].nutrition.total_carbohydrate_grams | number | No | 37 | |||
| data.items[].nutrition.total_fat_grams | number | No | 14 | |||
| data.items[].nutrition.trans_fat_grams | number | No | 0.5 | |||
| data.items[].price | object | No | Price is nil when store_id has no pricing data at all (the key is absent upstream, e.g. the default national catalog), not when an item is genuinely free -- a real $0.00 add-on still carries a Price. | |||
| data.items[].price.currency | string | No | USD | |||
| data.items[].price.value | number | No | 5.09 | |||
| data.items[].slug | string | No | classic-roast-beef | |||
| data.items[].tags | array | No | ||||
| data.items[].url | string | No | ||||
| data.source_url | string | No | ||||
| data.store_id | integer | No | 0 | |||
| 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/arbys/menu?category=slow-roasted-beef" \
-H "x-api-key: $CRAWLORA_API_KEY"