# 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:** 20 total users, 6 monthly users, 97.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 wayfair product scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 — Prices, Specs, Ratings & SKUs

Wayfair Scraper is an Apify Actor for people who need structured Wayfair product data from a keyword search, category/listing URL, or product URL. It accepts one search term or a set of Wayfair URLs, returns one dataset record per product, and includes fields such as title, current price, original price, savings, rating, review count, brand, SKU, availability, breadcrumbs, images, and provenance. When product detail enrichment is enabled, the Actor also adds specs, dimensions, materials, description, feature bullets, and the full image gallery.

### Best fit and connected workflows

This Actor fits workflows that start with Wayfair search or browse pages and end with structured product records for analysis or downstream automation. It is a natural route for:

- Keyword-based catalog collection from Wayfair search results.
- Category or listing-page collection with automatic pagination.
- Single-product extraction from `/pdp/` URLs when you want a full detail record.
- Marketplace-aware runs across Wayfair US, CA, UK, and IE storefronts.
- Apify MCP workflows where an agent needs to turn a Wayfair query into dataset rows.

For browsing by storefront, use `country`. For listing pages, use `sortBy`, `minPrice`, `maxPrice`, or `minRating` to shape the returned set before it is written to the dataset. For richer product cards, enable `enrichProductDetails`.

#### Practical scenario

A procurement analyst starts with a Wayfair category URL for office chairs and wants a clean shortlist. They provide the listing page in `startUrls`, set `sortBy` to `top_rated`, and cap `maxResults` at 20. The dataset returns fields like `title`, `price`, `rating`, `reviewCount`, `brand`, `sku`, `availability`, and `productUrl`. The analyst uses those records to compare chair candidates and then opens the linked product pages for a final review of `dimensions` and `material` before sharing the shortlist with the buyer.

### Input fields

| Field | Type | Default | Description |
|---|---|---:|---|
| `searchQuery` | string | `office chair` | Free-text Wayfair keyword. The Actor opens search results and collects product cards across pages up to `maxResults`. |
| `startUrls` | string\[] | `[]` | Wayfair search, category/listing, or `/pdp/` product URLs. URL type is detected automatically. |
| `maxResults` | integer | `100` | Maximum number of product records across all sources. |
| `country` | enum | `com` | Wayfair storefront: `com`, `ca`, `co.uk`, or `ie`. |
| `sortBy` | enum | `relevance` | Result order: `relevance`, `price_low_to_high`, `price_high_to_low`, `top_rated`, or `newest`. |
| `minPrice` | integer | - | Minimum current price in the marketplace currency. |
| `maxPrice` | integer | - | Maximum current price in the marketplace currency. |
| `minRating` | integer | - | Minimum average star rating from 0 to 5. |
| `enrichProductDetails` | boolean | `false` | Opens each product detail page for breadcrumbs, specs, dimensions, materials, description, feature bullets, and the image gallery. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for requests. |

#### Focused JSON input example

```json
{
  "searchQuery": "sectional sofa",
  "country": "com",
  "sortBy": "top_rated",
  "maxResults": 25,
  "minPrice": 500,
  "enrichProductDetails": true
}
```

### Output fields

Each dataset record represents one product and uses `recordType: "product"`.

| Field | Type | Description |
|---|---|---|
| `recordType` | string | Record type, always `product`. |
| `title` | string | Product title. |
| `productUrl` | string | Canonical Wayfair product URL. |
| `sku` | string | Wayfair SKU. |
| `manufacturerSku` | string | Manufacturer SKU when available. |
| `brand` | string | Brand name. |
| `price` | number | Current price. |
| `originalPrice` | number | Original or strike-through price. |
| `savings` | number | Absolute savings. |
| `savingsPercent` | integer | Savings percentage. |
| `currency` | string | Marketplace currency. |
| `rating` | number | Average star rating. |
| `reviewCount` | integer | Review count. |
| `availability` | string | Stock status. |
| `imageUrl` | string | Primary image URL. |
| `images` | array | Image gallery URLs. |
| `breadcrumbs` | array | Category path. |
| `category` | string | Category name. |
| `subCategory` | string | Subcategory name. |
| `dimensions` | string | Product dimensions. |
| `weight` | string | Product weight. |
| `material` | string | Material information. |
| `color` | string | Color information. |
| `description` | string | Product description. |
| `features` | array | Feature bullets. |
| `specs` | object | Parsed specs map. |
| `shippingInfo` | string | Shipping information. |
| `freeShipping` | boolean | Free-shipping flag when available. |
| `promoFlag` | string | Promotion marker. |
| `variantCount` | integer | Number of variants. |
| `position` | integer | Result position. |
| `searchQuery` | string | Query or route provenance. |
| `site` | string | Wayfair marketplace site. |
| `sourceUrl` | string | Source page URL. |
| `scrapedAt` | string | ISO timestamp of the scrape. |
| `_warnings` | array | Record-level warnings when present. |

#### Illustrative JSON output record

```json
{
  "recordType": "product",
  "title": "Example Upholstered Sofa",
  "productUrl": "https://www.wayfair.com/furniture/pdp/example-sofa",
  "sku": "W12345678",
  "brand": "Example Brand",
  "price": 799.99,
  "originalPrice": 999.99,
  "savings": 200,
  "savingsPercent": 20,
  "currency": "USD",
  "rating": 4.7,
  "reviewCount": 184,
  "availability": "In Stock",
  "imageUrl": "https://assets.wfcdn.com/example.jpg",
  "breadcrumbs": ["Furniture", "Living Room Furniture", "Sofas"],
  "dimensions": "84 in W x 35 in D x 32 in H",
  "material": "Upholstered",
  "position": 1,
  "searchQuery": "sectional sofa",
  "site": "wayfair.com",
  "scrapedAt": "2026-06-21T00:00:00.000Z"
}
```

### How it works

The Actor accepts either a keyword search or one or more Wayfair URLs. It auto-detects whether each URL is a search page, category/listing page, or product detail page. Listing pages are paginated until `maxResults` is reached. Product URLs return one full detail record.

The implementation uses a Playwright-based Chromium crawler with stealth handling and residential/mobile proxy support. For detail enrichment, it opens product detail pages to collect breadcrumbs, specifications, dimensions, materials, description, feature bullets, and the image gallery. The dataset schema also records provenance fields such as `searchQuery`, `site`, `sourceUrl`, and `scrapedAt`.

### Pricing

Wayfair Scraper — Prices, Specs, Ratings & SKUs uses Pay per event plus Apify platform usage. The primary billable event is `Wayfair product scraped`, and there is also an `Actor start` event for execution initialization and compute baseline. Filtered-out products are not billed.

Use the live Pricing tab on the Actor page for current pricing details before you run it. As a simple example, 10 returned product records correspond to 10 product events, plus the run start event.

### Use with AI agents (MCP)

This Actor is available as an Apify Actor usable through Apify MCP. It is designed for agents that need to translate a Wayfair task into structured product records and then read the dataset back for follow-up reasoning.

**Actor identity:** `khadinakbar/wayfair-scraper`

Tool description: send a keyword, a set of Wayfair URLs, or a product URL, and receive one dataset row per product with prices, ratings, SKUs, and optional detail-page fields.

> "Find top-rated office chairs on Wayfair US, return the first 15 products, and include product URLs, prices, ratings, review counts, and dimensions if available."

Output interpretation: each dataset record is one product. Use `recordType`, `title`, `price`, `rating`, `reviewCount`, `brand`, and `productUrl` for ranking or routing. `sourceUrl`, `searchQuery`, and `scrapedAt` help track provenance. When `enrichProductDetails` is on, the record may also include `breadcrumbs`, `dimensions`, `material`, `description`, `features`, and `images`.

Scope guidance: use `searchQuery` for broad discovery and `startUrls` for known listing or product pages. Pagination is handled by the Actor, and `maxResults` caps the number of product records returned.

Cost guidance: set `maxResults` to the number of product records you want, since that acts as a practical ceiling for product events.

### Apify API example

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

const client = new ApifyClient({
  token: process.env.APIFY_TOKEN,
});

const input = {
  searchQuery: "sectional sofa",
  country: "com",
  sortBy: "top_rated",
  maxResults: 5,
  enrichProductDetails: true,
};

const run = await client.actor("khadinakbar/wayfair-scraper").call(input);

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Best results and outcome guidance

Use `searchQuery` for discovery, and use `startUrls` when you already have a specific Wayfair category, listing, or product page. If you want richer product cards, enable `enrichProductDetails`. If you want the run to focus on a narrower set, combine `sortBy` with `minPrice`, `maxPrice`, and `minRating`. For storefront-specific runs, match `country` to the marketplace you want to scrape.

### Continue the workflow

- Then use [WooCommerce Product Scraper](https://apify.com/khadinakbar/woocommerce-product-scraper) to extend Wayfair Scraper — Prices, Specs, Ratings & SKUs with a neighboring commerce research source when the brief calls for Woocommerce data.
- Then use [Walmart Reviews Scraper - Ratings, Photos & Verified](https://apify.com/khadinakbar/walmart-reviews-scraper) to extend Wayfair Scraper — Prices, Specs, Ratings & SKUs with a neighboring commerce research source when the brief calls for Walmart data.

### Design note

I found that the output contract exposes a single required record type, `product`, with `scrapedAt` as the other required field. That made it clear the dataset is centered on one normalized product record shape rather than multiple entity types.

### FAQ

**Can I start from a Wayfair search term?**\
Yes. Use `searchQuery` for keyword-driven collection from Wayfair search results.

**Can I start from a category or listing page?**\
Yes. Put the Wayfair listing URL into `startUrls`, and the Actor will paginate product cards from that page.

**Can I scrape one product page directly?**\
Yes. Use a `/pdp/` product URL in `startUrls` to return one full detail record.

**Which Wayfair marketplaces are supported?**\
The Actor supports `com`, `ca`, `co.uk`, and `ie`.

**How do I get specs and dimensions on listing runs?**\
Set `enrichProductDetails` to `true`, or use product URLs in `startUrls`.

### Responsible use

Use this Actor in line with applicable laws, platform terms, and your own data governance practices. Keep requests scoped to publicly accessible Wayfair pages, respect rate and access controls, and review the live Pricing tab before running jobs at scale.

# 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": 1,
  "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": 1,
    "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": 1,
    "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(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 '{
  "searchQuery": "office chair",
  "startUrls": [],
  "maxResults": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call khadinakbar/wayfair-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/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/K92eYk0fkGW5YHvVf/builds/KJPkrECwdB4lcHmTU/openapi.json
