Zappos API

Get Zappos data with one API

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.

Z
/zappos/v1

2 active endpoints, on 1 and 2 credit tiers.

  • POST/zappos/v1/search
  • POST/zappos/v1/product_detail

What Zappos endpoints does ReefAPI ship?

2 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

2 endpoints

search

1 cr

Search the Zappos catalog.

required
query
optional
max_results, page, sort, brand, color, gender, size, width, category, department, material, style, feature, occasion, pattern, theme, price_range, on_sale

product_detail

2 cr

Get one Zappos product in full, by its product id (or its zappos.com URL).

required
product_id
optional
color_id, style_id, url, include_all_color_variants

Every parameter, every allowed value →

Zappos API

2 of 2 endpoints, ready to run

View docs ↗

Search the Zappos catalog.

1 credit1 required · 1 optional
POST/zappos/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Zappos API works

Zappos is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /zappos/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

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.

IdWhat it identifiesMeasured exampleAccepted as
product_idOne product across every colorway10029603product_id (required)
style_idZappos' SKU for one colorway6630380style_id (colorway selector)
color_idThe colorway1122594, and 6969 on an older stylecolor_id (colorway selector)
stock_idOne size and width of one colorway60404349read-only, not a parameter
asinAmazon id for that size and widthB0FDCYLXNCread-only, not a parameter
upcBarcode for that size and width195208999734read-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.

What people build with Zappos

The jobs this data is most often used for.

2

endpoints

1/2

credits per call

01

Pricing and assortment teams use Zappos to search the Zappos catalog.

02

Brand-protection teams use Zappos to get one Zappos product in full, by its product id (or its zappos.com URL).

03

Retail analysts use Zappos to read a retailer's own catalogue with full product detail, variants, price and stock, all from one ReefAPI key and credit pool.

What Zappos data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 185 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
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}'
python
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"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Zappos.

Get a free key →
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, and 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.

15 More APIs APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Zappos, you are one call away from the rest of the category — no second contract, no second integration.

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts.