Zappos API & Scraper
Zappos API returns live Zappos data as clean JSON for zappos The primary endpoint, search, returns product results including product id, style id, color id, name and brand.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Developers reach for it when they need to track product listings, prices, availability, variants and reviews without maintaining one-off scraping code or separate API contracts. If you were about to build or fix a Zappos scraper, this API is the maintained alternative — it returns the same data as clean JSON, with the proxies, rotation and anti-bot handling already solved. This page covers the live example, request shape, response shape and available actions: search, price, product_detail. Every request uses the same ReefAPI envelope, one API key and one shared credit pool, so it fits alongside the rest of your data stack.
The four Zappos ids, and which parameter each one belongs in
Zappos numbers a shoe at four levels and every one of them is a bare integer, so it is easy to send the wrong one. product_id is the only required key; style_id and color_id both select a colorway; stock_id, ASIN and UPC live below that and are read-only. All examples were measured 2026-08-27 on KEEN products.
| Id | What it identifies | Measured example | Accepted as |
|---|---|---|---|
| product_id | One product across every colorway | 10029603 | product_id (required) |
| style_id | Zappos' SKU for one colorway | 6630380 | style_id (colorway selector) |
| color_id | The colorway | 1122594, and 6969 on an older style | color_id (colorway selector) |
| stock_id | One size and width of one colorway | 60404349 | read-only, not a parameter |
| asin | Amazon id for that size and width | B0FDCYLXNC | read-only, not a parameter |
| upc | Barcode for that size and width | 195208999734 | read-only, not a parameter |
Sending a style_id where product_id belongs fails cleanly: product_id 6630380 returned NOT_FOUND saying the id redirected to the Zappos homepage. A color_id that belongs to a different product also fails and names the valid ones: color_id 9999999 on product 10029603 returned "That product's colour ids are: 1121608, 1122594, 1122875". Neither case quietly returns a different shoe. color_id has no fixed length, 6969 and 1122594 are both real.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/zappos/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "running shoes",
"max_results": 40
}
}{
"ok": true,
"meta": {
"api": "zappos",
"endpoint": "search",
"mode": "live",
"latency_ms": 1774.4,
"record_count": 40,
"bytes": 1378658,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "limit_reached",
"pagination": {
"page": 1,
"per_page": 100,
"total_results": 2160,
"page_count": 22,
"returned": 40,
"has_more": true,
"next_page": 2
},
"filters": {
"applied": [],
"ignored": []
},
"charged_credits": 1,
"version": "1.0.0"
},
"data": {
"products": [
{
"product_id": "10083154",
"style_id": "6778884",
"color_id": "1152141",
"name": "Novablast 6 GTX",
"brand": "ASICS",
"product_type": "Shoes",
"color": "Brown",
"color_detail": "Dark Aubergine/Black",
"genders": [
"Women"
],
"url": "https://www.zappos.com/p/asics-novablast-6-gtx-dark-aubergine-black/product/10083154/color/1152141",
"price": 174.95,
"original_price": 174.95,
"currency": "USD",
"on_sale": false,
"percent_off": 0,
"discount_amount": null,
"in_stock": true,
"units_available": 493,
"low_stock": null,
"is_new": true,
"rating": 0,
"style_rating": 0,
"review_count": 0,
"image": "https://m.media-amazon.com/images/I/713y+adHhcL._SX700_.jpg",
"images": [
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
}
],
"swatch_image": "https://swch-cl2.olympus.zappos.com/fabric/27567/27580/10083154/6778884.jpg",
"has_fabric_swatch": true,
"is_couture": false,
"badges": [
"NEW"
],
"promo_badges": null,
"other_colors": [
{
"style_id": "[trimmed-depth]",
"color_id": "[trimmed-depth]",
"color": "[trimmed-depth]",
"color_detail": "[trimmed-depth]",
"price": "[trimmed-depth]",
"original_price": "[trimmed-depth]",
"percent_off": "[trimmed-depth]",
"units_available": "[trimmed-depth]",
"rating": "[trimmed-depth]",
"review_count": "[trimmed-depth]",
"image": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"style_id": "[trimmed-depth]",
"color_id": "[trimmed-depth]",
"color": "[trimmed-depth]",
"color_detail": "[trimmed-depth]",
"price": "[trimmed-depth]",
"original_price": "[trimmed-depth]",
"percent_off": "[trimmed-depth]",
"units_available": "[trimmed-depth]",
"rating": "[trimmed-depth]",
"review_count": "[trimmed-depth]",
"image": "[trimmed-depth]",
"url": "[trimmed-depth]"
}
]
},
{
"product_id": "10083171",
"style_id": "6778992",
"color_id": "450833",
"name": "Novablast 6 GTX",
"brand": "ASICS",
"product_type": "Shoes",
"color": "Khaki",
"color_detail": "Sandstorm/Black",
"genders": [
"Men"
],
"url": "https://www.zappos.com/p/asics-novablast-6-gtx-sandstorm-black/product/10083171/color/450833",
"price": 174.95,
"original_price": 174.95,
"currency": "USD",
"on_sale": false,
"percent_off": 0,
"discount_amount": null,
"in_stock": true,
"units_available": 481,
"low_stock": null,
"is_new": true,
"rating": 0,
"style_rating": 0,
"review_count": 0,
"image": "https://m.media-amazon.com/images/I/81rADcpI-uL._SX700_.jpg",
"images": [
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
}
],
"swatch_image": "https://swch-cl2.olympus.zappos.com/fabric/27567/27580/10083171/6778992.jpg",
"has_fabric_swatch": true,
"is_couture": false,
"badges": [
"NEW"
],
"promo_badges": null,
"other_colors": [
{
"style_id": "[trimmed-depth]",
"color_id": "[trimmed-depth]",
"color": "[trimmed-depth]",
"color_detail": "[trimmed-depth]",
"price": "[trimmed-depth]",
"original_price": "[trimmed-depth]",
"percent_off": "[trimmed-depth]",
"units_available": "[trimmed-depth]",
"rating": "[trimmed-depth]",
"review_count": "[trimmed-depth]",
"image": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"style_id": "[trimmed-depth]",
"color_id": "[trimmed-depth]",
"color": "[trimmed-depth]",
"color_detail": "[trimmed-depth]",
"price": "[trimmed-depth]",
"original_price": "[trimmed-depth]",
"percent_off": "[trimmed-depth]",
"units_available": "[trimmed-depth]",
"rating": "[trimmed-depth]",
"review_count": "[trimmed-depth]",
"image": "[trimmed-depth]",
"url": "[trimmed-depth]"
}
]
},
{
"product_id": "10086061",
"style_id": "6786565",
"color_id": "145876",
"name": "GT-2000 15 GTX®",
"brand": "ASICS",
"product_type": "Shoes",
"color": "Gray",
"color_detail": "Graphite Grey/Black",
"genders": [
"Men"
],
"url": "https://www.zappos.com/p/asics-gt-2000-15-gtx-graphite-grey-black/product/10086061/color/145876",
"price": 169.95,
"original_price": 169.95,
"currency": "USD",
"on_sale": false,
"percent_off": 0,
"discount_amount": null,
"in_stock": true,
"units_available": 72,
"low_stock": null,
"is_new": true,
"rating": 0,
"style_rating": 0,
"review_count": 0,
"image": "https://m.media-amazon.com/images/I/81MJIf4k6fL._SX700_.jpg",
"images": [
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
},
{
"view": "[trimmed-depth]",
"url": "[trimmed-depth]"
}
],
"swatch_image": null,
"has_fabric_swatch": false,
"is_couture": false,
"badges": [
"NEW"
],
"promo_badges": null,
"other_colors": null
}
],
"__trimmed": "response capped for page display"
}
}What the Zappos API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search the Zappos catalog. Give a `query` ('running shoes', 'hiking boots', 'nike air max', 'womens dresses') and get back 100 products per page, each with Zappos' own product id, style id and colour id, price and list price, discount, units in stock, star rating, review count, badges, the full image set, and the product's OTHER colourways inline. Narrow with brand, colour, gender, size, width, department, category, material, style, feature, occasion, pattern, theme, price bucket and an on-sale switch; sort by price, rating, newest or best sellers. Every filter value your query actually supports — with the number of products behind it — is returned in `filters_available`, so you never have to guess. | Pricing teams call search to search the Zappos catalog. | query, max_results, page, sort, brand, ... |
| price | Refresh the current price and stock of one Zappos product, cheaply. Give the `product_id` (optionally `color_id` or `style_id`) and get back every colourway with its price, list price, discount, in-stock flag and units in stock, plus the requested colourway on top. One request, about half the bytes of `product_detail`. Stock is per COLOURWAY (summed over its sizes); for per-size stock, ASIN and UPC use `product_detail`. | Marketplace operators call price to get refresh the current price and stock of one Zappos product, cheaply. | product_id, color_id, style_id, url |
| product_detail | Get one Zappos product in full, by its product id (or its zappos.com URL) — brand, category, gender, the marketing description and every specification bullet, the parsed physical measurements (weight, heel height, shaft, circumference, platform height, bag depth and strap drop where Zappos lists them), size charts, the customer rating with its star histogram and the runs-small / runs-wide / arch-support breakdowns, and the two customer reviews Zappos embeds. Every colourway is returned with its own style id, colour id, price, list price, image set and stock, and the selected colourway is broken down to the SIZE x WIDTH level: one row per purchasable variant with Zappos' stock id, the Amazon ASIN, the manufacturer UPC, that variant's own price and list price, and how many units are in stock right now. | Catalog enrichment teams call product_detail to get one Zappos product in full, by its product id (or its zappos.com URL). | product_id, color_id, style_id, url, include_all_color_variants |
Call search from your stack
curl -X POST https://api.reefapi.com/zappos/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"running shoes","max_results":40}'import requests
r = requests.post(
"https://api.reefapi.com/zappos/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "running shoes",
"max_results": 40
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/zappos/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "running shoes",
"max_results": 40
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.zappos.search with {"query":"running shoes","max_results":40}.Who uses this API and why
- Pricing teams use Zappos to search the Zappos catalog.
- Marketplace operators use Zappos to get refresh the current price and stock of one Zappos product, cheaply.
- Catalog enrichment teams use Zappos to get one Zappos product in full, by its product id (or its zappos.com URL).
Questions developers ask before integrating
How does Zappos model width, and how do I filter on it?
Width is a second size axis, not a text note. On a measured men's boot, selected_color.size_axis came back as Width, widths listed D - Medium and EE - Wide with width_id 61808 and 64170, and the variant grid was the cross product: 14 sizes times 2 widths, 28 variants. Kids' shoes use a shorter vocabulary, plain M with width_id 3090. The search width parameter takes the facet label (Wide, Medium, Narrow, Extra Narrow) and the response echoes which facet it landed in, hc_men_width in the measured call.
Why do some sizes come back with a null stock_id?
Those are placeholder rows: is_placeholder true, stock_id, asin and upc all null, units_available 0, in_stock false. Zappos prints the size cell so the grid stays square but has nothing to sell in it. On one measured colorway the 28 variants split into 21 sellable rows and 7 placeholders, all of them in the EE - Wide column.
Why does adding a sort change the number of results?
Any explicit ordering narrows the set. Measured on the query hiking boots: the default relevance ordering reported 469 total_results, sort=rating reported 344 and sort=price_low also reported 344. meta.pagination.total_results always describes the request you actually made, so compare like with like when you are tracking a category's size over time.
What happens if I pass a brand or color Zappos does not have?
It is reported, not silently applied and not silently dropped. brand=NotARealBrand came back with meta.filters.ignored listing the filter, the value and the reason "Zappos publishes no such value for this query", while total_results stayed at 469. Filters that did land show up in meta.filters.applied with the facet field they matched, so you can always reconcile the count you got against the filters that took effect.
Is units_available a stock count per size or per colorway?
Both, at different levels. On a search row and on a colorway it is the colorway total, 29 on one measured KEEN colorway. Inside variants[] it is per size and width: 10 units in M 1 Big Kid, 6 in M 2 Big Kid, 0 in the placeholder rows. in_stock_variant_count against variant_count tells you how much of the grid is live, 4 of 7 on that colorway and 21 of 28 on another.
How do I get the size grid for every colorway in one call?
Set include_all_color_variants true. By default only selected_color carries variants[], and the other colorways in colors[] come back summarised with price, price_min, price_max, variant_count, in_stock_variant_count, units_available and widths but no per-size rows. That default is what keeps the payload manageable: a three-color kids' boot with one colorway expanded already measured 959 KB, and every extra colorway adds its whole size and width grid.
Does search return the other colorways of the same product?
Yes, inline. Each product row carries other_colors[] with style_id, color_id, color, color_detail, price, original_price, percent_off, units_available, rating, review_count, image and url for each sibling colorway, so you do not need a second call to enumerate them. Note that color is the broad family (Olive) and color_detail is Zappos' own name (Dark Olive/Martini Olive); the color search filter matches the family, not the detail.
What does product_detail add that search does not have?
The parsed measurements block (heel_height 1 1/4 in, weight 8.64 oz, circumference 7 in), the specification bullets, size-chart links, breadcrumbs, and the fit verdicts Zappos computes from reviews: rating.fit_size, fit_width and fit_arch, each a percentage split such as Felt true to size 100. It also returns sample_reviews with per-review comfort_rating, look_rating and the same three fit verdicts.
What is the Zappos API?
Zappos API is a ReefAPI endpoint group for zappos It returns live JSON through POST requests under /zappos/v1.
Is the Zappos API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Zappos calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Zappos login or account?
No login to Zappos is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Zappos data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Zappos API use?
Zappos actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Zappos from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call zappos actions with the same key, credit pool and JSON envelope used by normal REST requests.