# Wayfair API scraper — wayfair.com, the largest US online home-goods retailer: keyword search and category browse with Wayfair's own facets, the full product record (price, was-price, every colour and size option with its own SKU, stock, images, specifications, dimensions, materials, assembly and warranty), and the review block. No account, no browser.

> Search Wayfair by keyword and read the whole result grid. 48 listings per page with price, was-price, sale badge, brand, rating and review count, the selected colour or fabric, the other options with their own product URLs, stock message and delivery promise. Wayfair's own facets can be applied with `filters`.
> ReefAPI engine `wayfair` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/wayfair/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/wayfair/v1/search — 2 credits
Search Wayfair by keyword and read the whole result grid. 48 listings per page with price, was-price, sale badge, brand, rating and review count, the selected colour or fabric, the other options with their own product URLs, stock message and delivery promise. Wayfair's own facets can be applied with `filters`.

**Parameters:**
- `query` (string, required) — What to search for, e.g. 'velvet accent chair'.
- `page` (integer, optional, default 1) — Result page. Wayfair serves 48 listings per page.
- `filters` (array, optional) — Wayfair facet selections as '<filter_id>~<option_id>' pairs, e.g. '2470~7175' (Material: Genuine Leather). Several stack as AND. Call the `filters` action for the valid pairs of a category.
- `max_rotations` (integer, optional, default 6) — How many times to retry on a different route out when the site paces the request. Higher = slower but more reliable.

**Returns:** results[{position, sku, variant_sku, variant_id, option_id, title, brand, url, price, was_price, currency, sale_label, price_is_from, loyalty_savings, rating, review_count, selected_options[{name, category}], option_count, options[{option_id, name, variant_id, url, image, price (null — see note)}], stock_message, delivery_promise, delivery_method, is_sponsored, is_best_value, images[], marketing_copy}], count, page_kind, page_note, total_results, page, per_page, has_more, query, resolved_url, resolved_category{category_id, name}, filters_applied[], pagination_note, option_price_note

**Example request body:**
```json
{
  "query": "sofa"
}
```

### POST https://api.reefapi.com/wayfair/v1/category/products — 2 credits
Browse one Wayfair category — the same 48-listing grid as search, for a category id. Facets stack with `filters`: Sofas alone is 278,015 listings, Sofas + Genuine Leather + Seats 3 is about 1,170, and the two result sets do not overlap at all on page 1.

**Parameters:**
- `category` (string, required) — Wayfair category id (e.g. 413892 for Sofas) or any category URL.
- `page` (integer, optional, default 1) — Result page. Wayfair serves 48 listings per page.
- `filters` (array, optional) — Wayfair facet selections as '<filter_id>~<option_id>' pairs, e.g. '2470~7175' (Material: Genuine Leather). Several stack as AND. Call the `filters` action for the valid pairs of a category.
- `max_rotations` (integer, optional, default 6) — How many times to retry on a different route out when the site paces the request. Higher = slower but more reliable.

**Returns:** results[] (same row shape as search), count, page_kind (browse_grid | department_landing), page_note, total_results, page, per_page, has_more, category{category_id, name, url}, filters_applied[], pagination_note, option_price_note

**Example request body:**
```json
{
  "category": "413892"
}
```

### POST https://api.reefapi.com/wayfair/v1/brand/products — 2 credits
Every listing Wayfair publishes for one of its house or partner brands (Mercer41, Latitude Run, AllModern…), by brand id or brand-page URL.

**Parameters:**
- `brand` (string, required) — Wayfair brand id (e.g. 40128 for Latitude Run) or the brand URL.
- `page` (integer, optional, default 1) — Result page. Wayfair serves 48 listings per page.
- `max_rotations` (integer, optional, default 6) — How many times to retry on a different route out when the site paces the request. Higher = slower but more reliable.

**Returns:** results[] (same row shape as search), count, total_results, page, per_page, has_more, brand{brand_id, name, url}, pagination_note

**Example request body:**
```json
{
  "brand": "40128"
}
```

### POST https://api.reefapi.com/wayfair/v1/filters — 1 credit
Every facet Wayfair offers for a keyword or a category, with the ids needed to build a filtered call: material, colour, size, brand, style, seating capacity, customer rating, availability, assembly, sustainability and the rest — plus the price buckets, the sort options the page offers, and the neighbouring categories.

**Parameters:**
- `query` (string, optional) — Facets for a keyword search.
- `category` (string, optional) — Facets for a category id or URL.
- `filters` (array, optional) — Wayfair facet selections as '<filter_id>~<option_id>' pairs, e.g. '2470~7175' (Material: Genuine Leather). Several stack as AND. Call the `filters` action for the valid pairs of a category.
- `max_rotations` (integer, optional, default 6) — How many times to retry on a different route out when the site paces the request. Higher = slower but more reliable.

**Returns:** filters[{filter_id, name, group, type, options[{option_id, name, filter, is_selected, description}], buckets[{name, min, max, is_selected}], range{min, max, units}}], filter_count, option_count, sort_options[{sort_id, name}], sort_note, related_categories[{category_id, name, url}], total_results, resolved_url

**Example request body:**
```json
{
  "category": "413892"
}
```

### POST https://api.reefapi.com/wayfair/v1/product/detail — 2 credits
The full Wayfair product record for one SKU (and, when given, one option): title, brand, price and was-price, sale badge, rating and review count, stock, delivery promise, description, the specification table, structured dimensions and weight, assembly, warranty, certifications, breadcrumbs, every image, and every colour / fabric / size option with its own product URL and stock status.

**Parameters:**
- `sku` (string, required) — Wayfair SKU, e.g. W117906390 — or the full product URL.
- `option_id` (string, optional) — One option (colour / fabric / size) of the listing, as published in `option_groups[].options[].option_id`. The price, images and stock all follow the option.
- `max_rotations` (integer, optional, default 6) — How many times to retry on a different route out when the site paces the request. Higher = slower but more reliable.

**Returns:** product{sku, variant_sku, variant_id, option_id, title, brand, brand_id, brand_url, manufacturer_part_number, url, price, was_price, currency, sale_label, price_is_from, loyalty_savings, rating, review_count, stock_status, stock_message (null on this surface — Wayfair prints the "N Left in Stock" line on the grid, not on the product page; `stock_status` is the product page's answer), delivery{promise, method}, listing_status, is_best_value, category{category_id, name, class_id}, breadcrumbs[{name, category_id, url}], description, specifications[{name, value}], assembly[], warranty[], certifications[], dimensions[{name, value}], selected_options[], option_groups[{name, option_category_id, display, selected_option_id, total_options, options[{option_id, name, url, stock_status, image, available_with_current_selection, price (null unless product/options was called)}]}], images[], lead_image, minimum_order_quantity, quantity_per_unit}, option_price_note

**Example request body:**
```json
{
  "sku": "W117906390"
}
```

### POST https://api.reefapi.com/wayfair/v1/product/reviews — 2 credits
The review block Wayfair serves on a product page: the star average, the review count, Wayfair's own AI summary of what customers say, the sentiment aspects, and the five most recent reviews with rating, body, date, reviewer and incentive badge. The source serves only those five without an account — `has_more_on_source` says whether more exist.

**Parameters:**
- `sku` (string, required) — Wayfair SKU, e.g. W117906390 — or the full product URL.
- `option_id` (string, optional) — One option (colour / fabric / size) of the listing, as published in `option_groups[].options[].option_id`. The price, images and stock all follow the option.
- `max_rotations` (integer, optional, default 6) — How many times to retry on a different route out when the site paces the request. Higher = slower but more reliable.

**Returns:** sku, title, rating, review_count, summary{text, disclaimer}, aspects[{name, sentiment, phrase}], reviews[{review_id, rating, body, date, author, location, badge, badge_description, locale, options[]}], count, has_more_on_source, reviews_served_by_source

**Example request body:**
```json
{
  "sku": "W117906390"
}
```

### POST https://api.reefapi.com/wayfair/v1/product/options — 4 credits
Every option of a listing WITH ITS OWN PRICE. Wayfair prices each colour and size separately — one sofa measured $264.99 / $289.99 / $499.99 / $269.99 across four fabrics — and only the option's own page carries its price, so this action reads them. Costs one upstream page per option, which is why it is priced above `product/detail`.

**Parameters:**
- `sku` (string, required) — Wayfair SKU, e.g. W117906390 — or the full product URL.
- `max_options` (integer, optional, default 6) — How many options to price. Each one is a separate page on the source.
- `max_rotations` (integer, optional, default 6) — How many times to retry on a different route out when the site paces the request. Higher = slower but more reliable.

**Returns:** sku, title, brand, url, option_groups[{name, option_category_id, selected_option_id, total_options, options[{option_id, name, url, image, stock_status, price, was_price, currency, priced}]}], priced_count, options_total, price_min, price_max, prices_vary, not_priced_reason

**Example request body:**
```json
{
  "sku": "W111515578",
  "max_options": 2
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=wayfair
- Human docs page: https://reefapi.com/docs/wayfair
- Overview page: https://reefapi.com/wayfair-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
