# Wayfair Scraper (`crawlerbros/wayfair-scraper`) Actor

Scrape Wayfair product listings, product details, category browses, and brand pages from Wayfair.com (US), Wayfair.ca (Canada), Wayfair.co.uk (UK), and Wayfair.ie (Ireland). Extract title, SKU, brand, price, currency, rating, review count, image, breadcrumbs, and product URL.

- **URL**: https://apify.com/crawlerbros/wayfair-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 45 total users, 15 monthly users, 99.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Wayfair Scraper

Scrape **Wayfair** product listings, product detail pages, category browses, and brand pages across Wayfair's US, Canada, UK, and Ireland storefronts. Get title, SKU, brand, price (including sale/previous price), currency, **stock status**, rating, review count, breadcrumbs, images, and product URLs — the data you need to track prices, monitor availability, or build a Wayfair product feed, without an API key or login.

### What this actor does

- **5 lookup modes** — keyword search, direct URL, top-level category browse, brand search, or SKU lookup.
- **4 regional storefronts** — wayfair.com (US), wayfair.ca (Canada), wayfair.co.uk (UK), wayfair.ie (Ireland).
- **Stock status on every product** — `IN_STOCK`, `LOW_STOCK`, `OUT_OF_STOCK`, or `BACKORDERED`, plus a simple `isPurchasable` yes/no flag, so you can tell what's actually shoppable right now.
- **Filter results** by price range, minimum rating, or in-stock-only, and sort by price, rating, newest, or best seller.
- **Optional full product enrichment** — fetch each product's own detail page for complete pricing, description, and delivery-estimate data.
- **No login, no cookies, no API key** — works against Wayfair's public storefront.
- Empty fields are simply omitted from each record — no `null` placeholders to filter out.

### Output per product

- `sku`, `title`, `brand`
- `price`, `previousPrice`, `currency`
- `stockStatus` — `IN_STOCK` / `LOW_STOCK` / `OUT_OF_STOCK` / `BACKORDERED`
- `isPurchasable` — `true`/`false` derived from `stockStatus`
- `estimatedDeliveryMessage` — Wayfair's own "Get it by ..." delivery estimate, when shown
- `ratingValue`, `reviewCount`
- `imageUrl`, `description`
- `breadcrumbs`, `category`, `subCategory`
- `promoFlag` — badge text such as "72-Hour Clearout", when present
- `productUrl`, `canonicalUrl`, `sourceUrl`
- `country`, `siteName`, `recordType`, `scrapedAt`

```json
{
  "sku": "CXVA1530",
  "title": "Latitude Run Ilkeston 81.6\" Wide Vegan Leather Manual Reclining Sofa",
  "brand": "Latitude Run",
  "productUrl": "https://www.wayfair.com/furniture/pdp/latitude-run-ilkeston-...-cxva1530.html",
  "canonicalUrl": "https://www.wayfair.com/furniture/pdp/latitude-run-ilkeston-...-cxva1530.html",
  "price": 689.99,
  "previousPrice": 1098.99,
  "currency": "USD",
  "stockStatus": "IN_STOCK",
  "isPurchasable": true,
  "estimatedDeliveryMessage": "Get it Fri, May 22 - Thu, May 28",
  "ratingValue": 4.63,
  "reviewCount": 648,
  "imageUrl": "https://assets.wfcdn.com/im/.../Ilkeston+81.6+...+Cup+Holders.jpg",
  "description": "Choose a delivery day that works for you...",
  "breadcrumbs": ["Furniture", "Living Room Furniture", "Sofas"],
  "category": "Furniture",
  "subCategory": "Sofas",
  "promoFlag": "72-Hour Clearout",
  "country": "com",
  "siteName": "Wayfair",
  "recordType": "product",
  "scrapedAt": "2026-05-08T17:24:33.123456+00:00",
  "sourceUrl": "https://www.wayfair.com/keyword.php?keyword=sofa"
}
```

### Input

| Field | Type | Description |
|---|---|---|
| `mode` | enum | `search`, `byUrl`, `byCategory`, `byBrand`, `byProduct` |
| `country` | enum | `com` (US), `ca` (Canada), `co.uk` (UK), `ie` (Ireland) |
| `text` | string | Search keyword (`search` mode) |
| `category` | enum | Top-level Wayfair category (`byCategory` mode) — Furniture, Outdoor, Decor & Pillows, Rugs, Kitchen & Tabletop, Bed & Bath, Lighting, Storage & Organization, Appliances, Home Improvement, Baby & Kids, Holiday Decor, Office, Pet |
| `urls` | array | Direct Wayfair URLs (`byUrl` / `byBrand` modes) |
| `brand` | string | Brand name for `byBrand` mode (e.g. "Latitude Run") |
| `skus` | array | Wayfair product SKUs (e.g. `W118077895`, `CXVA1530`) for `byProduct` mode |
| `sortBy` | enum | `relevance`, `price_low_to_high`, `price_high_to_low`, `top_rated`, `newest`, `best_seller` |
| `priceMin` / `priceMax` | int | Drop products outside this price range |
| `ratingMin` | float | Drop products with rating below this (0.0–5.0) |
| `inStockOnly` | bool | Only return listings Wayfair explicitly marks as in stock |
| `fetchProductDetails` | bool | Fetch each product's own detail page for complete pricing, description, and delivery data |
| `maxItems` | int | Hard cap on returned products |
| `maxPagesPerListing` | int | Maximum result pages to walk per search/category/brand lookup |
| `proxyConfiguration` | proxy | Apify proxy configuration (residential proxy is used by default) |

#### Example: search with filters

```json
{
  "mode": "search",
  "country": "com",
  "text": "sofa",
  "sortBy": "top_rated",
  "priceMax": 1000,
  "inStockOnly": true,
  "maxItems": 50
}
```

#### Example: direct URL

```json
{
  "mode": "byUrl",
  "urls": [
    "https://www.wayfair.com/furniture/cat/sofas-c413894.html",
    "https://www.wayfair.com/furniture/pdp/latitude-run-ilkeston-...-cxva1530.html"
  ]
}
```

#### Example: category browse

```json
{
  "mode": "byCategory",
  "country": "com",
  "category": "lighting",
  "sortBy": "newest"
}
```

#### Example: brand search

```json
{
  "mode": "byBrand",
  "country": "com",
  "brand": "Latitude Run"
}
```

#### Example: look up by SKU

```json
{
  "mode": "byProduct",
  "country": "com",
  "skus": ["W118077895", "CXVA1530"]
}
```

### Use cases

- **Price tracking** — monitor price and sale-price changes on specific Wayfair products over time.
- **Stock / availability monitoring** — get alerted the moment a backordered or out-of-stock item becomes purchasable again.
- **Competitive & market research** — compare pricing, ratings, and promotions across brands and categories.
- **Product feeds & catalog enrichment** — pull structured Wayfair listings into your own catalog or comparison site.
- **Deal & clearance hunting** — filter by price range and sort by price to surface the best current discounts.
- **Regional pricing comparison** — compare the same product's price and currency across the US, Canada, UK, and Ireland storefronts.

### FAQ

**Does this require a Wayfair account, login, or API key?** No. It scrapes Wayfair's public storefront directly.

**Does it support Wayfair.de?** No. Wayfair shut down its German storefront in 2020, so `wayfair.de` is not a supported region.

**Why don't all search results have a price?** Wayfair's search results page shows full pricing for a handful of "featured" cards and lighter data for the rest. Every other field — title, SKU, image, rating, review count, and stock status — is returned for every result regardless. To get a price on every result, turn on `fetchProductDetails`, which visits each product's own page (which always shows its price).

**How reliable is `stockStatus`?** Very — unlike price, stock status is returned for essentially every result on a search or category page, not just the featured ones. `isPurchasable` is only added when Wayfair's own stock status is known; it's never guessed.

**What's `estimatedDeliveryMessage`?** Wayfair's own delivery estimate (e.g. "Get it by Fri, May 22"). Like price, it's shown for the featured search results and always available with `fetchProductDetails` turned on.

**If I turn on `inStockOnly`, what happens to results with unknown stock status?** They're excluded. This filter means "only show me listings Wayfair explicitly confirms are in stock" — unlike the price and rating filters, which keep a result when that particular field simply isn't available.

**How does the price filter work?** A product without a price is kept, since a missing field isn't evidence it falls outside your range. A product with a known price outside `priceMin`/`priceMax` is dropped.

**Does the scraper extract individual customer reviews?** Not currently — it returns the aggregate rating and review count for each product, not the text of individual reviews.

**What currency will I get?** Each storefront's native currency: USD (US), CAD (Canada), GBP (UK), EUR (Ireland) — matched automatically to the `country` you choose.

**Why does this need a residential proxy?** Wayfair blocks requests from Apify's standard datacenter IPs with a 429 (rate-limited) response, so this actor uses residential proxy by default to reach the site reliably.

**Is this affiliated with Wayfair?** No — this is an independent, third-party actor that reads Wayfair's public storefront pages. It isn't operated or endorsed by Wayfair.

### Limitations

- `wayfair.de` is not supported (the storefront is closed).
- Individual customer reviews are not extracted, only the aggregate rating and review count.
- Brand pages vary in URL format; the most reliable way to scrape a brand is `byUrl` with the brand's listing URL copied from Wayfair.
- Full pricing and delivery-estimate data on listing pages is limited to a subset of results per page (see FAQ) — `fetchProductDetails` fills this in for every result. Stock status is not affected by this limitation.

# Actor input Schema

## `mode` (type: `string`):

Discovery axis. search: keyword search. byUrl: paste any Wayfair search/category/brand/product URL(s). byCategory: top-level category browse. byBrand: brand listing URL(s). byProduct: SKU lookup (product detail page).

## `country` (type: `string`):

Wayfair regional domain. com=US, ca=Canada, co.uk=UK, ie=Ireland. (Wayfair.de shut down in 2020 and is not supported.)

## `text` (type: `string`):

Free-text keyword (used in search mode). Examples: "sofa", "office chair", "throw pillow", "area rug".

## `category` (type: `string`):

Top-level Wayfair category (resolves to a category browse URL). Used for byCategory mode.

## `urls` (type: `array`):

Direct Wayfair URLs (search results, category page, or product detail page). Domain auto-detected from URL.

## `brand` (type: `string`):

Brand / manufacturer name (e.g. "Latitude Run", "Wade Logan", "Hokku Designs"). The scraper performs a brand-scoped search on Wayfair.

## `skus` (type: `array`):

Wayfair product SKUs (e.g. "W118077895", "CXVA1530"). The scraper resolves each SKU to its detail page.

## `sortBy` (type: `string`):

Sort order on listing pages. Wayfair maps these to its sortby URL parameter.

## `priceMin` (type: `integer`):

Drop products priced below this value (in the destination country's currency).

## `priceMax` (type: `integer`):

Drop products priced above this value (in the destination country's currency).

## `ratingMin` (type: `number`):

Drop products with rating below this value (0.0-5.0). Products with no rating are kept (the user opted into the filter, not into requiring the field).

## `inStockOnly` (type: `boolean`):

Only emit listings Wayfair explicitly marks as IN\_STOCK. Listings with no stock-status evidence are dropped (unlike price/rating filters, this is a confirmed-availability guarantee, not a best-effort filter).

## `fetchProductDetails` (type: `boolean`):

For each listing card, fetch the product detail page to enrich with brand, full description, breadcrumbs, and high-resolution image. Adds 1 HTTP request per product.

## `maxItems` (type: `integer`):

Hard cap on emitted product records.

## `maxPagesPerListing` (type: `integer`):

Maximum paginated listing pages (?page=N) to crawl per search/category/brand seed (~48 products per page).

## `proxyConfiguration` (type: `object`):

Apify proxy configuration. Wayfair blocks Apify datacenter IPs, so RESIDENTIAL proxy is required. Default is RESIDENTIAL. Leaving blank disables proxy and the actor will likely 429 on every request from Apify cloud.

## Actor input object example

```json
{
  "mode": "search",
  "country": "com",
  "text": "sofa",
  "category": "furniture",
  "urls": [],
  "brand": "",
  "skus": [],
  "sortBy": "relevance",
  "inStockOnly": false,
  "fetchProductDetails": false,
  "maxItems": 5,
  "maxPagesPerListing": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset containing Wayfair product records.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "country": "com",
    "text": "sofa",
    "category": "furniture",
    "urls": [],
    "brand": "",
    "skus": [],
    "sortBy": "relevance",
    "inStockOnly": false,
    "fetchProductDetails": false,
    "maxItems": 5,
    "maxPagesPerListing": 2,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/wayfair-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "country": "com",
    "text": "sofa",
    "category": "furniture",
    "urls": [],
    "brand": "",
    "skus": [],
    "sortBy": "relevance",
    "inStockOnly": False,
    "fetchProductDetails": False,
    "maxItems": 5,
    "maxPagesPerListing": 2,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/wayfair-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "country": "com",
  "text": "sofa",
  "category": "furniture",
  "urls": [],
  "brand": "",
  "skus": [],
  "sortBy": "relevance",
  "inStockOnly": false,
  "fetchProductDetails": false,
  "maxItems": 5,
  "maxPagesPerListing": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call crawlerbros/wayfair-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/wayfair-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/g0TvR2oIcet86fqxn/builds/Onbp9ir3GwXQVEGRp/openapi.json
