Starbucks API endpoint
Returns one Starbucks product's full detail: name, description, product type, image, Rewards star cost, customization options, and every size with its own nutrition panel (serving size, calories, calories from fat, and per-fact values for total fat with saturated and trans fat subfacts, cholesterol, sodium, total carbohydrates, protein, and caffeine). product_number is the numeric id from a /starbucks/menu result or a product page URL. form is that product's form; allowed values are hot, iced, single, packaged, whole-bean, and via. store_number optionally scopes availability to one store. Starbucks does not expose dollar pricing on this surface, so no price is returned; star_cost is the Rewards star cost. market selects which country catalog to resolve against, one of us or ca, defaulting to us. Each size also carries its default_recipe, the standard build, which is the required starting point for the /starbucks/product/{product_number}/{form}/nutrition endpoint. An unknown product number, or a form that product is not sold in, returns not found.
/starbucks/product/{product_number}/{form}market is optional, one of us or ca, defaults to us. A product number valid in one market may not exist in the other. These are the only two markets available.
product_number is a required path parameter: Starbucks' numeric product id, taken from a /starbucks/menu result's product_number or from a product page URL. It must be numeric.
form is a required path parameter: that product's form. Allowed values are hot, iced, single, packaged, whole-bean, and via. Any other value is rejected with an invalid-parameter error.
store_number is optional, a Starbucks store number from /starbucks/stores, e.g. 101-54.
Notable response behavior:
Each size carries a default_recipe: the standard build for that size, as a list of modifiers with sku, name, form_code, and option_product_number. This is the required starting point for POST /starbucks/product/{product_number}/{form}/nutrition, which wants the complete modifier set rather than a change-set. form_code describes how a modifier behaves: one is a pick-exactly-one slot (the milk), qty is a countable (espresso shots, syrup pumps), and modifier/yes-no are toggles.
No price. Starbucks does not expose dollar pricing on this surface — it is store- and session-scoped behind its authenticated ordering flow. star_cost is the Starbucks Rewards star cost and is the only price-like value available.
Each entry in sizes carries its own nutrition panel: serving_size, calories, calories_from_fat, and a facts list. Facts cover Total Fat (with Saturated Fat and Trans Fat as subfacts), Cholesterol, Sodium, Total Carbohydrates, Protein, and Caffeine.
daily_percent_value is Starbucks' own preformatted percentage, e.g. "15%".
Nutrition values are returned as strings.
options lists the customization categories Starbucks offers for the product, e.g. Milk, Flavors, Espresso.
product_type on this endpoint uses a different vocabulary from the menu tree's (beverages here versus Beverage there); treat it as an upstream label rather than a stable enum.
An unknown product_number, or a form that product is not sold in, returns a not-found error.
| Field | Filled in, of 9 checked | Values in the sample |
|---|---|---|
| name | 9 | “Milk” and 8 other values |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| product_number (path) | string | Yes | Starbucks numeric product id | 2123774 | |
| form (path) | string | Yes | Product form. One of: hot, iced, single, packaged, whole-bean, via Allowed values: hot, iced, single, packaged, whole-bean, via. | iced | |
| store_number | string | No | Starbucks store number to scope availability to, e.g. 101-54 | 101-54 | |
| market | string | No | us | Starbucks country site to read. One of: us, ca. Defaults to us Allowed values: us, ca. | us |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/starbucks/product/2123774/iced?market=us" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"product_number": "418",
"form": "hot",
"name": "Pumpkin Spice Latte",
"description": "Our signature Espresso Roast and steamed milk with the celebrated flavor combination of pumpkin, cinnamon, nutmeg and clove. Enjoy it topped with whipped cream and real pumpkin-pie spices.",
"product_type": "beverages",
"image_url": "https://cloudassets.starbucks.com/is/image/sbuxcorp/PumpkinSpiceLatteV1",
"in_catalog": true,
"star_cost": 200,
"options": [
{
"name": "Milk"
},
{
"name": "Flavors"
}
],
"sizes": [
{
"size_code": "Short",
"sku": "183885",
"nutrition": {
"serving_size": "8 fl oz",
"calories": "210",
"calories_from_fat": "80",
"facts": [
{
"name": "Total Fat",
"value": "9 g",
"unit_of_measure": "g",
"daily_percent_value": "11%",
"subfacts": [
{
"name": "Saturated Fat",
"value": "5 g",
"unit_of_measure": "g",
"daily_percent_value": "25%"
},
{
"name": "Trans Fat",
"value": "0 g",
"unit_of_measure": "g"
}
]
},
{
"name": "Caffeine",
"value": "150 mg",
"unit_of_measure": "mg"
}
]
}
}
],
"source_url": "https://www.starbucks.com/apiproxy/v1/ordering/418/hot",
"fetched_at": "2026-08-30T10:31:11Z"
}
}Request schema
No body schema
Response schema
#/definitions/starbucks.productResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | starbucks.ProductResponse | No | ||||
| data.description | string | No | ||||
| data.fetched_at | string | No | ||||
| data.form | string | No | ||||
| data.image_url | string | No | ||||
| data.in_catalog | boolean | No | ||||
| data.market | string | No | ||||
| data.name | string | No | ||||
| data.options | array | No | Options are the customization choices Starbucks offers for this product, e.g. milk, syrups, espresso shots. | |||
| data.options[].name | string | No | ||||
| data.options[].type | string | No | ||||
| data.product_number | string | No | ||||
| data.product_type | string | No | ||||
| data.sizes | array | No | ||||
| data.sizes[].default_recipe | array | No | DefaultRecipe is the size's standard build -- the modifiers a plain order of this size already includes. It is exposed because it is the required input to the nutrition-calculate endpoint: that endpoint wants the FULL modifier set, not a delta, so a caller starts from this list, changes what they want, and posts the whole thing back. | |||
| data.sizes[].default_recipe[].form_code | string | No | FormCode describes how the modifier behaves: "one" is a pick-exactly-one slot (the milk), "qty" is a countable (espresso shots, syrup pumps), "modifier"/"yes-no" are toggles. | |||
| data.sizes[].default_recipe[].name | string | No | ||||
| data.sizes[].default_recipe[].option_product_number | string | No | OptionProductNumber identifies the option in the product's own options tree. | |||
| data.sizes[].default_recipe[].sku | string | No | SKU is the value to send as a nutrition-calculate modifier sku. | |||
| data.sizes[].display_name | string | No | ||||
| data.sizes[].nutrition | starbucks.Nutrition | No | ||||
| data.sizes[].nutrition.calories | string | No | ||||
| data.sizes[].nutrition.calories_from_fat | string | No | ||||
| data.sizes[].nutrition.facts | array | No | ||||
| data.sizes[].nutrition.facts[].daily_percent_value | string | No | ||||
| data.sizes[].nutrition.facts[].name | string | No | ||||
| data.sizes[].nutrition.facts[].subfacts | array | No | ||||
| data.sizes[].nutrition.facts[].unit_of_measure | string | No | ||||
| data.sizes[].nutrition.facts[].value | string | No | ||||
| data.sizes[].nutrition.serving_size | string | No | ||||
| data.sizes[].size_code | string | No | ||||
| data.sizes[].sku | string | No | ||||
| data.source_url | string | No | ||||
| data.star_cost | integer | No | ||||
| data.store_number | string | No | ||||
| msg | string | No | OK |
| 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/starbucks/product/2123774/iced?market=us" \
-H "x-api-key: $CRAWLORA_API_KEY"