Starbucks API endpoint
Use Crawlora's Starbucks Custom Nutrition 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/product/{product_number}/{form}/nutritionRecalculates calories, fat, sugars, and protein for a customized build of a Starbucks beverage: swap the milk, change the number of espresso shots or syrup pumps, and get the real figures for that exact drink rather than the standard recipe. Starbucks only offers this for four hot espresso beverages; product_number and form must be one of 406/hot (Caffe Americano), 407/hot (Caffe Latte), 408/hot (Caffe Mocha), or 413/hot (Caramel Macchiato). Any other product returns an invalid-parameter error naming the four that work. size_sku comes from a /starbucks/product result's sizes[].sku. modifiers is the COMPLETE build, not a change-set: start from that size's default_recipe, adjust what you want, and send the whole list back; an empty list is rejected. Each modifier needs a sku, an optional quantity (defaults to 1, and is the dial that matters for countable modifiers like espresso shots), and an optional replaced_sku when substituting a pick-one slot such as the milk. This returns Starbucks' own four-value dynamic-nutrition panel, which is smaller than the full per-size panel /starbucks/product returns for the standard build. 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 |
|---|---|---|---|---|---|
| product_number (path) | string | Yes | Starbucks numeric product id. One of: 406, 407, 408, 413 | ||
| form (path) | string | Yes | Product form. Only hot is supported for this endpoint Allowed values: hot | ||
| request (body) | object | Yes | The size and the complete modifier build | ||
| x-api-key (header) | string | Yes | API key required |
curl -X POST "https://api.crawlora.net/api/v1/starbucks/product/%3Cproduct_number%3E/%3Cform%3E/nutrition" \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"form":"hot","market":"us","modifiers":[{"quantity":3,"replaced_sku":"string","sku":"55"}],"product_number":"406","size_sku":"93"}'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.
Some targets require real browser execution because the data is loaded through JavaScript, dynamic rendering, or interaction-like browser behavior.
For supported endpoints, Crawlora can route requests through a managed browser cluster. This allows Crawlora to execute JavaScript, load dynamic content, apply browser-level request behavior, and normalize the rendered result into JSON.
You do not need to operate your own Playwright, Puppeteer, Chrome, proxy, queue, or retry infrastructure.
- `values` is Starbucks' own four-value dynamic-nutrition panel (calories, fat, sugars, protein). It is deliberately smaller than the full per-size panel `/starbucks/product` returns for the standard build, so the two endpoints complement each other rather than overlap. - The figures genuinely recalculate. A Short Caffè Americano reports 0 calories with its default single espresso shot and 25 calories plus 2g protein with six. - `modifiers` is echoed back with defaults applied, so the response records exactly which build produced the figures. - No prices are returned. Starbucks does not expose dollar pricing on this surface. Example request: ```json { "size_sku": "93", "modifiers": [ {"sku": "55", "quantity": 6}, {"sku": "11010168", "quantity": 1} ] } ``` Example response: ```json { "code": 200, "msg": "OK", "data": { "market": "us", "product_number": "406", "form": "hot", "size_sku": "93", "modifiers": [ {"sku": "55", "quantity": 6}, {"sku": "11010168", "quantity": 1} ], "values": [ {"key": "calories", "name": "Calories", "value": "25", "unit_of_measure": "kcal"}, {"key": "fat", "name": "Fat", "value": "0", "unit_of_measure": "g"}, {"key": "protein", "name": "Protein", "value": "2", "unit_of_measure": "g"}, {"key": "sugars", "name": "Sugars", "value": "0", "unit_of_measure": "g"} ] } } ```
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 |
{
"form": "hot",
"market": "us",
"modifiers": [
{
"quantity": 3,
"replaced_sku": "string",
"sku": "55"
}
],
"product_number": "406",
"size_sku": "93"
}{
"code": 200,
"msg": "OK",
"data": {
"market": "us",
"product_number": "406",
"form": "hot",
"size_sku": "93",
"modifiers": [
{
"sku": "55",
"quantity": 6
},
{
"sku": "11010168",
"quantity": 1
}
],
"values": [
{
"key": "calories",
"name": "Calories",
"value": "25",
"unit_of_measure": "kcal"
},
{
"key": "fat",
"name": "Fat",
"value": "0",
"unit_of_measure": "g"
},
{
"key": "protein",
"name": "Protein",
"value": "2",
"unit_of_measure": "g"
},
{
"key": "sugars",
"name": "Sugars",
"value": "0",
"unit_of_measure": "g"
}
]
}
}Request schema
#/definitions/starbucks.NutritionOption
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| form | string | No | hot | |||
| market | string | No | us | Market selects which country site answers. Defaults to us. | ||
| modifiers | array | No | Modifiers is the COMPLETE build, not a delta from the default. Start from the size's default_recipe (returned by /starbucks/product), change what you want, and send the whole list back. An empty list is rejected by Starbucks with "Modifiers list required". | |||
| modifiers[].quantity | integer | No | 3 | Quantity is how many of this modifier. Defaults to 1. For countable modifiers (formCode "qty" -- espresso shots, syrup pumps) this is the dial that actually moves the numbers. | ||
| modifiers[].replaced_sku | string | No | ReplacedSKU is the default modifier this one substitutes, when the caller is swapping a pick-one slot such as the milk. Leave empty for a modifier that is not replacing anything. | |||
| modifiers[].sku | string | No | 55 | SKU is the modifier's sku, from a product size's default_recipe[].sku or from an option in the product's options tree (e.g. a different milk). | ||
| product_number | string | No | 406 | ProductNumber and Form identify the product. Only the four combinations in dynamicNutritionProducts are supported upstream. | ||
| size_sku | string | No | 93 | SizeSKU is the sku of the size being built, from a /starbucks/product result's sizes[].sku. |
Response schema
#/definitions/starbucks.nutritionResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | starbucks.NutritionResponse | No | ||||
| data.fetched_at | string | No | ||||
| data.form | string | No | ||||
| data.market | string | No | ||||
| data.modifiers | array | No | ||||
| data.modifiers[].quantity | integer | No | 3 | Quantity is how many of this modifier. Defaults to 1. For countable modifiers (formCode "qty" -- espresso shots, syrup pumps) this is the dial that actually moves the numbers. | ||
| data.modifiers[].replaced_sku | string | No | ReplacedSKU is the default modifier this one substitutes, when the caller is swapping a pick-one slot such as the milk. Leave empty for a modifier that is not replacing anything. | |||
| data.modifiers[].sku | string | No | 55 | SKU is the modifier's sku, from a product size's default_recipe[].sku or from an option in the product's options tree (e.g. a different milk). | ||
| data.product_number | string | No | ||||
| data.size_sku | string | No | ||||
| data.source_url | string | No | ||||
| data.values | array | No | ||||
| data.values[].key | string | No | ||||
| data.values[].name | string | No | ||||
| data.values[].unit_of_measure | string | No | ||||
| data.values[].value | string | No | ||||
| msg | string | No | OK |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X POST "https://api.crawlora.net/api/v1/starbucks/product/%3Cproduct_number%3E/%3Cform%3E/nutrition" \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"form":"hot","market":"us","modifiers":[{"quantity":3,"replaced_sku":"string","sku":"55"}],"product_number":"406","size_sku":"93"}'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