Starbucks API endpoint
Use Crawlora's Browse the full Starbucks menu API to extract supported public Starbucks data as structured JSON. This page includes request parameters, cURL examples, response schema, error behavior, credit cost, and a Playground link for testing before integration.
/starbucks/menuReturns Starbucks' full menu as a category tree: top-level categories, their child categories, and every product with its product number, form, product type, sizes, default size, availability, and image. Pair a product's product_number and form with /starbucks/product to fetch full detail including nutrition. store_number optionally scopes the menu to one store, using a store number from /starbucks/stores; a store-scoped menu marks items that store does not carry with availability NotAvailableHere, while the unscoped menu reports everything as Available. market selects which country catalog to return, one of us or ca, defaulting to us; the two differ substantially (roughly 282 US products vs 253 CA, with exclusives on both sides). Only these two markets are available: every other Starbucks country site runs a different platform, and the European ones disallow API access in robots.txt. Developers commonly use this endpoint for data enrichment, monitoring, research dashboards, internal automation, and agent-native workflows that need repeatable structured public web data. Authentication uses the documented Crawlora headers, and usage is metered with the credit cost shown on this page.
Request parameters are generated from the active endpoint catalog. Required values must be sent before Crawlora can call the upstream public web data source.
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| store_number | string | No | Starbucks store number to scope availability to, e.g. 101-54 | ||
| market | string | No | us | Starbucks country site to read. One of: us, ca. Defaults to us Allowed values: us, ca | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/starbucks/menu?market=us" \ -H "x-api-key: $CRAWLORA_API_KEY"
Send your scraping API key in the x-api-key header. Use the console API Keys page to rotate or select the active key.
Endpoint usage is metered in credits. The plan prices, included credits, limits, and overage rates below match the active backend billing configuration.
| Plan | Price | Included credits | Daily cap | Rate limit | Overage |
|---|---|---|---|---|---|
| Free | $0/mo | 2,000 | 500 daily credits | 5/min | No overage |
| Starter | $9/mo | 20,000 | 5,000 daily credits | 15/min | $0.75/1,000 overage credits when enabled |
| Growth | $29/mo | 100,000 | 25,000 daily credits | 45/min | $0.45/1,000 overage credits when enabled |
| Pro | $79/mo | 400,000 | No daily cap | 120/min | $0.30/1,000 overage credits |
| Business | $199/mo | 1,200,000 | No daily cap | 300/min | $0.20/1,000 overage credits |
| Enterprise | $499/mo | 5,000,000 | No daily cap | 1,000/min | $0.12/1,000 overage credits |
This endpoint is executed through Crawlora's managed scraping infrastructure.
- Categories nest via `children`; products hang off the category that lists them. A category holds either child categories or products, not usually both. - Each product carries `product_number` and `form`. Pair those two with `/starbucks/product/{product_number}/{form}` to fetch full detail including nutrition. `product_detail_url` is the matching page on starbucks.com. - `form` is the normalized lowercase form slug: `hot`, `iced`, `single`, `packaged`, `whole-bean`, or `via`. - `product_type` is Starbucks' own coarse classification in the menu tree: `Beverage`, `Food`, or `Coffee`. - `availability` is `Available` for every product on the unscoped menu. When `store_number` is given, items that store does not carry are marked `NotAvailableHere`, so a store-scoped menu is the only way to get real per-store availability. - This menu is Starbucks' **US catalog and is not localized** — there is no locale parameter, and the upstream ignores language negotiation. (The store locator, by contrast, genuinely is worldwide.) - No prices. Starbucks does not expose dollar pricing on this surface. - `category_count` counts top-level categories; `product_count` counts distinct products anywhere in the tree. Example response: ```json { "code": 200, "msg": "OK", "data": { "store_number": "101-54", "category_count": 9, "product_count": 265, "source_url": "https://www.starbucks.com/apiproxy/v1/ordering/menu?storeNumber=101-54", "fetched_at": "2026-08-30T10:31:08Z", "categories": [ { "name": "The Latest", "display_order": 1, "children": [ { "name": "Trending", "display_order": 1, "products": [ { "name": "Iced Pumpkin Cream Chai", "product_number": "2123774", "form": "iced", "product_type": "Beverage", "availability": "Available", "image_url": "https://cloudassets.starbucks.com/is/image/sbuxcorp/IcedPumpkinCreamChaiTeaLatte", "display_order": 1, "sizes": ["Tall", "Grande", "Venti"], "default_size": "Grande", "default_size_sku": "11151107", "menu_uri": "/product/2123774/iced", "product_detail_url": "https://www.starbucks.com/menu/product/2123774/iced" } ] } ] } ] } } ```
Crawlora does not silently return bad data when the upstream page cannot be used.
| Status | Common failure case |
|---|---|
| 400 | Invalid input or missing required parameter |
| 429 | Plan or endpoint rate limit exceeded |
| 500 | Internal execution error |
| 502 | Upstream platform failed, returned unusable HTML, or served a challenge page that could not be resolved |
When possible, Crawlora returns structured error context so your integration can retry, back off, or inspect the request.
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
{
"code": 200,
"msg": "OK",
"data": {
"store_number": "101-54",
"category_count": 9,
"product_count": 265,
"source_url": "https://www.starbucks.com/apiproxy/v1/ordering/menu?storeNumber=101-54",
"fetched_at": "2026-08-30T10:31:08Z",
"categories": [
{
"name": "The Latest",
"display_order": 1,
"children": [
{
"name": "Trending",
"display_order": 1,
"products": [
{
"name": "Iced Pumpkin Cream Chai",
"product_number": "2123774",
"form": "iced",
"product_type": "Beverage",
"availability": "Available",
"image_url": "https://cloudassets.starbucks.com/is/image/sbuxcorp/IcedPumpkinCreamChaiTeaLatte",
"display_order": 1,
"sizes": [
"Tall",
"Grande",
"Venti"
],
"default_size": "Grande",
"default_size_sku": "11151107",
"menu_uri": "/product/2123774/iced",
"product_detail_url": "https://www.starbucks.com/menu/product/2123774/iced"
}
]
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/starbucks.menuResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | starbucks.MenuResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].children | array | No | ||||
| data.categories[].display_order | integer | No | ||||
| data.categories[].hero_image_url | string | No | ||||
| data.categories[].image_url | string | No | ||||
| data.categories[].name | string | No | ||||
| data.categories[].products | array | No | ||||
| data.categories[].products[].availability | string | No | Availability is "Available" on the unscoped menu; a store-scoped menu also returns "NotAvailableHere" for items that store lacks. | |||
| data.categories[].products[].default_size | string | No | ||||
| data.categories[].products[].default_size_sku | string | No | ||||
| data.categories[].products[].display_order | integer | No | ||||
| data.categories[].products[].form | string | No | Form is the normalized, lowercase form slug ("iced", "hot", "single", "packaged", "whole-bean", "via") taken from the product's own menu URI. It is the second path segment Product requires. | |||
| data.categories[].products[].image_url | string | No | ||||
| data.categories[].products[].menu_uri | string | No | ||||
| data.categories[].products[].name | string | No | ||||
| data.categories[].products[].product_detail_url | string | No | ||||
| data.categories[].products[].product_number | string | No | ||||
| data.categories[].products[].product_type | string | No | ProductType is Starbucks' own coarse classification: "Beverage", "Food", or "Coffee". | |||
| data.categories[].products[].sizes | array | No | ||||
| data.category_count | integer | No | CategoryCount counts top-level categories; ProductCount counts distinct products anywhere in the tree. | |||
| data.fetched_at | string | No | ||||
| data.market | string | No | ||||
| data.product_count | integer | No | ||||
| data.source_url | string | No | ||||
| data.store_number | string | No | ||||
| msg | string | No | OK |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/starbucks/menu?market=us" \
-H "x-api-key: $CRAWLORA_API_KEY"Crawlora is designed for responsible structured public web data workflows. Customers are responsible for using Crawlora in compliance with applicable laws, third-party rights, target-platform rules, and Crawlora terms.
Read Crawlora terms