# Wayfair Scraper — Furniture Prices, Specs & Reviews (`khadinakbar/wayfair-scraper`) Actor

Scrape Wayfair by keyword, category/listing URL, or product URL: title, price, original price, savings, rating, review count, brand, SKU, availability, breadcrumbs, images, and (with detail enrichment) specs, dimensions, materials, description + optional customer reviews. PPE. MCP-ready.

- **URL**: https://apify.com/khadinakbar/wayfair-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** E-commerce, MCP servers, Automation
- **Stats:** 8 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 wayfair product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 — Furniture Prices, Specs & Ratings

Scrape **Wayfair** furniture and home‑goods listings by keyword, category/listing URL, or product URL. Get clean, structured records — **title, current price, original price, savings, star rating, review count, brand, SKU, availability, breadcrumbs, and images** — plus full **specs, dimensions, materials, and description** when detail enrichment is on. Works across **Wayfair.com (US), Wayfair.ca (CA), Wayfair.co.uk (UK), and Wayfair.ie (IE)**. MCP‑ready for AI agents.

> Wayfair runs aggressive bot protection (Akamai + PerimeterX). This Actor uses a stealth browser through residential/mobile proxies to fetch real, rendered pages — so you get the same data a shopper sees.

***

### What you can do

- **Keyword search** — pass a search term (e.g. `office chair`, `sectional sofa`) and collect product cards across paginated results.
- **Category / listing URLs** — paste any Wayfair listing URL (`/keyword.php?keyword=…` or a category page like `/furniture/sb0/sofas-c413892.html`) and the Actor walks the pages.
- **Product URLs** — paste `/.../pdp/…-w12345678.html` links to get one full detail record each (specs, dimensions, materials, description, image gallery).
- **Detail enrichment** — turn on `enrichProductDetails` to upgrade every search/listing result with full product‑page data.
- **Filter** — `minPrice`, `maxPrice`, `minRating`, and `sortBy` (relevance, price low→high, price high→low, top rated, newest).

#### Who it's for

Furniture resellers and dropshippers (competitor SKU + price monitoring), retail price‑monitoring SaaS, interior designers sourcing by dimensions/materials, procurement teams, market researchers, and AI shopping agents.

***

### Output

Each record is one product (`recordType: "product"`). Listing/search mode returns card‑level fields; product‑URL mode and `enrichProductDetails` add the full detail set.

```json
{
  "recordType": "product",
  "title": "Lundgren Faux Leather Task Chair with Padded Arms",
  "productUrl": "https://www.wayfair.com/furniture/pdp/ophelia-co-lundgren-faux-leather-task-chair-with-padded-arms-kthm2748.html",
  "sku": "KTHM2748",
  "brand": "Ophelia & Co.",
  "price": 164.99,
  "originalPrice": 379.90,
  "savings": 214.91,
  "savingsPercent": 57,
  "currency": "USD",
  "rating": 4.6,
  "reviewCount": 3478,
  "availability": "In Stock",
  "imageUrl": "https://assets.wfcdn.com/im/.../resize-h800-w800/...jpg",
  "breadcrumbs": ["Furniture", "Office Furniture", "Office Chairs"],
  "category": "Office Furniture",
  "subCategory": "Office Chairs",
  "dimensions": "40'' H X 22.2'' W X 26'' D",
  "weight": "26 lb.",
  "material": "Manufactured Wood",
  "specs": { "Seat": "22.2'' H X 19.2'' W X 20.5'' D", "Overall Product Weight": "26 lb." },
  "position": 1,
  "searchQuery": "office chair",
  "site": "wayfair.com",
  "scrapedAt": "2026-06-21T00:00:00.000Z"
}
```

#### Fields

| Field | Type | Description |
|---|---|---|
| `title` | string | Product name |
| `productUrl` | string | Canonical product page URL |
| `sku` | string | Wayfair SKU (e.g. `W118077895`, `KTHM2748`) |
| `brand` | string | Manufacturer / brand (detail mode) |
| `price` | number | Current price in the marketplace currency |
| `originalPrice` | number | List/strike‑through price before discount |
| `savings` / `savingsPercent` | number | Dollar and percent savings |
| `currency` | string | USD / CAD / GBP / EUR by marketplace |
| `rating` | number | Average star rating (0–5) |
| `reviewCount` | number | Total review count |
| `availability` | string | Stock status |
| `imageUrl` / `images` | string / array | Lead image + gallery (detail mode) |
| `breadcrumbs` / `category` / `subCategory` | array / string | Category path (detail mode) |
| `dimensions` / `weight` / `material` / `color` | string | Parsed from the spec table (detail mode) |
| `description` | string | Product description (detail mode) |
| `features` / `specs` | array / object | Feature bullets + full spec map (detail mode) |
| `position` | number | Result rank within the run |
| `searchQuery` / `site` / `sourceUrl` | string | Provenance |
| `scrapedAt` | string | ISO 8601 timestamp |

Download the dataset as **JSON, CSV, Excel, XML, or RSS**.

***

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQuery` | string | `office chair` | Keyword to search Wayfair |
| `startUrls` | string\[] | `[]` | Wayfair search, category, or `/pdp/` product URLs (auto‑detected) |
| `maxResults` | integer | `100` | Max product records (cost ceiling) |
| `country` | enum | `com` | `com`, `ca`, `co.uk`, `ie` |
| `sortBy` | enum | `relevance` | `relevance`, `price_low_to_high`, `price_high_to_low`, `top_rated`, `newest` |
| `minPrice` / `maxPrice` | integer | — | Price bounds (marketplace currency) |
| `minRating` | integer | — | Minimum star rating (0–5) |
| `enrichProductDetails` | boolean | `false` | Visit each product page for full specs/dimensions/description |
| `proxyConfiguration` | object | Apify Proxy | Override proxy (residential strongly recommended) |

#### Examples

Keyword search:

```json
{ "searchQuery": "sectional sofa", "maxResults": 50, "sortBy": "top_rated" }
```

Product URLs (full detail):

```json
{ "startUrls": ["https://www.wayfair.com/furniture/pdp/...-w12345678.html"] }
```

Category with enrichment + price filter:

```json
{ "startUrls": ["https://www.wayfair.com/furniture/sb0/sofas-c413892.html"], "enrichProductDetails": true, "maxPrice": 800 }
```

***

### Pricing (Pay Per Event)

| Event | Price |
|---|---|
| Actor start | $0.00005 |
| Product scraped | $0.004 |

You're charged only for products returned in the dataset; products dropped by your filters are not billed. `maxResults` is your hard cost ceiling. Pay‑Per‑Usage (compute + proxy) is also available.

***

### Reliability & proxies

Wayfair uses **Akamai + PerimeterX**, which block datacenter IPs and non‑browser requests outright. This Actor runs a **stealth Chromium browser** and defaults to a **residential/mobile proxy gateway**. If you supply your own `proxyConfiguration`, use **residential** proxies for dependable results. If every request is blocked, the run **fails honestly** with a clear message rather than returning an empty "success".

***

### Use with AI agents (MCP)

This Actor is exposed in the Apify MCP server as `apify--wayfair-scraper`. Agents pass a `searchQuery` or `startUrls` and receive structured JSON. Input descriptions are written for LLM routing (when to use, accepted format, disambiguators).

***

### FAQ

**Does it work outside the US?** Yes — set `country` to `ca`, `co.uk`, or `ie`. Prices/currency follow the marketplace.

**Why are some detail fields empty in search mode?** Search cards expose price, rating, reviews, image, and SKU. Turn on `enrichProductDetails` (or pass product URLs) for specs, dimensions, materials, and description.

**Can I scrape a whole category?** Yes — paste the category URL in `startUrls`; the Actor auto‑paginates until `maxResults`.

**Does it scrape customer reviews?** Not in this version — it returns the product's aggregate `rating` and `reviewCount`. Individual review text is planned for a later release.

***

### Legal

Use this Actor responsibly and in compliance with Wayfair's Terms of Service and applicable laws (including data‑protection regulations). Scrape only publicly available data, respect rate limits, and do not use the data for unlawful purposes. You are responsible for how you use the collected data. This Actor is not affiliated with or endorsed by Wayfair.

# Actor input Schema

## `searchQuery` (type: `string`):

Free-text keyword to search Wayfair (e.g. 'office chair', 'sectional sofa'). The Actor opens Wayfair's search-results pages and collects product cards across pages up to your Max results cap. Leave empty if you instead paste Start URLs. NOT a single product URL — for one product, paste a /pdp/ link into Start URLs.

## `startUrls` (type: `array`):

Optional list of Wayfair URLs: keyword/search pages (/keyword.php?keyword=...), category/browse pages (e.g. /furniture/sb0/sofas-c413892.html), or product detail pages (/.../pdp/...-w12345678.html). Each URL's type is auto-detected — listing URLs are paginated for product cards; product URLs return one full detail record. Plain https strings only; non-Wayfair URLs are skipped.

## `maxResults` (type: `integer`):

Maximum number of product records to return across all sources. The Actor auto-paginates listing pages until this cap is hit, then stops, so it doubles as your product cost ceiling (each product is one billable event). Defaults to 100. Reviews, when enabled, are billed separately and are not counted against this cap.

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

Which Wayfair storefront to search: 'com' (United States, default), 'ca' (Canada), 'co.uk' (United Kingdom), or 'ie' (Ireland). Prices and currency reflect the chosen marketplace, and the residential proxy exit country is matched automatically. Ignored for Start URLs, which use their own domain.

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

Order Wayfair returns search/listing results in: 'relevance' (default best match), 'price\_low\_to\_high', 'price\_high\_to\_low', 'top\_rated', or 'newest'. Applies to keyword searches and category Start URLs; ignored for product Start URLs. Use 'top\_rated' to surface the best-reviewed items first.

## `minPrice` (type: `integer`):

Only return products whose current price is at or above this value, in the marketplace currency. Applied as a Wayfair URL filter and re-checked on the parsed price. Filtered products are not billed. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Only return products whose current price is at or below this value, in the marketplace currency. Applied as a Wayfair URL filter and re-checked on the parsed price. Filtered products are not billed. Leave empty for no maximum.

## `minRating` (type: `integer`):

Drop products whose average star rating (0–5) is below this value, or whose rating is unknown when this is set. Applied after extraction; filtered products are not billed. Useful to keep only well-reviewed items. Leave empty to keep all ratings.

## `enrichProductDetails` (type: `boolean`):

When scraping from keyword/listing sources, also open each product's detail page to add breadcrumbs, full specs, dimensions, materials, description, feature bullets, and the high-res image gallery (slower: one extra request per product). Product Start URLs always return full detail regardless of this flag. Default false keeps listing runs fast and cheap; each enriched product is still billed once.

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

Proxy used for requests. Wayfair runs Akamai + PerimeterX and blocks datacenter IPs, so residential proxies are strongly recommended for reliable results. Defaults to Apify Proxy. The Actor automatically prefers a configured residential gateway and falls back through available proxy tiers.

## Actor input object example

```json
{
  "searchQuery": "sectional sofa",
  "startUrls": [],
  "maxResults": 10,
  "country": "com",
  "sortBy": "relevance",
  "enrichProductDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

All product (and optional review) records found across the search/listing/product pages. Download as JSON, CSV, Excel, HTML, or RSS.

## `runOutput` (type: `string`):

Machine-readable terminal outcome, useful result count, failure details, and PPE charge counts.

## `runSummary` (type: `string`):

Detailed terminal status for automation, monitoring, and AI-agent workflows.

# 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 = {
    "searchQuery": "office chair",
    "startUrls": [],
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "searchQuery": "office chair",
    "startUrls": [],
    "maxResults": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQuery": "office chair",
  "startUrls": [],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call khadinakbar/wayfair-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/wayfair-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/K92eYk0fkGW5YHvVf/builds/6SNojcMd4TSikYpFX/openapi.json
