Wayfair Scraper at a glance
Wayfair Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes product, brand, price, was and discount %, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.60 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Other
- Pricing
- $1.60 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 29 options
Scrape Wayfair.com furniture and home products by keyword or URL, including product, category, brand and sitemap links. Extract prices, discounts, ratings, variants, stock, images, specifications, dimensions and reviews. Supports scheduled price and stock change tracking.
What Wayfair Scraper can do
- Two ways to find products. Search by keyword, or paste product, category, brand, search or sitemap links and scrape them directly.
- 48 products per request, at no extra cost. Result pages already carry price, was-price, discount, rating, review count, colour and finish options, key specifications and images, so a plain listing run is the cheapest way to watch a whole category.
- Full detail on demand. Switch on description, specifications, dimensions, materials, the rating breakdown, the full gallery and in-stock status for every option, and pay only for what you use.
- Customer voice included. Review text, stars, date, first name, location, verified-purchase flag and the options the reviewer bought, in the order you choose, with the store's own summary of what reviewers say.
- Built for monitoring. Incremental mode returns only new, changed, restocked and, optionally, delisted products on a schedule, a price-and-stock-only mode keeps description or image edits out of your bill, and a refused run fails loudly instead of returning an empty dataset.
- Missing products are never charged. A product page that no longer exists is skipped, not returned and not billed.
Choose what to collect
These inputs let you configure Wayfair Scraper - Furniture, Prices, Stock & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose 'search' for keywords plus filters, or 'url' to scrape pasted Wayfair links. Each mode reads only its own field below. |
queriesarray | Only used when mode = search, ignored in URL mode. One or more keywords, for example 'standing desk', 'area rug 8x10' or 'bar stool'. |
urlsarray | Only used when mode = url, ignored in search mode. Product links (/pdp/), search links (keyword.php?keyword=...), category, brand and curated-collection pages and the store's product sitemaps (seo-pdp-sitemap~N.xml) are all accepted; other store pages are skipped with a warning. A result-page link that already carries curpage=N starts at that page, and a sortby value written into a link is kept. Tracking parameters are ignored. |
sortBystring | Order of the result pages. A sort order written into a pasted link wins over this setting. The store mixes sponsored products into every ordering, so the order is not strict. |
minPricenumber | Only return products priced at or above this value, in the store's currency (US dollars). Applied to the returned rows. |
maxPricenumber | Only return products priced at or below this value, in the store's currency (US dollars). Applied to the returned rows. |
onSaleOnlyboolean | Only return products that currently show a was-price above the current price. |
Show 22 more inputs
| Input | What it controls |
|---|---|
minRatingnumber | Only return products whose average customer rating is at least this value (0 to 5). |
brandsarray | Only return products from these brands. Matching ignores case and trademark signs, for example 'Lark Manor'. |
skipSponsoredboolean | Result pages mix paid placements in with the organic products. Turn on to leave the sponsored ones out; each returned row carries an isSponsored flag either way. |
fetchDetailsboolean | Read every product's own page for the full description, specifications, dimensions, materials, breadcrumbs, the rating breakdown, the full image and video gallery and in-stock status for every option. Off by default because it costs one extra page per product. A pasted product link always reads the product page, because there is no result card behind it, so a product link is always billed one 'Product page detail' event whatever this toggle says. |
fetchReviewsboolean | Also collect customer reviews for each product: rating, text, date, first name, location, verified-purchase flag and the options the reviewer bought. Also reads the product page, so it carries the same per-product surcharge as the toggle above, plus one 'Customer review' event per review returned. The average rating, review count and rating breakdown do not need this. |
maxReviewsPerProductinteger | Cap on how many individual reviews are collected for each product when 'Fetch customer reviews' is on. The first few come with the product page; further ones are read twenty at a time. Each review returned is billed, so keep this tight. |
reviewSortstring | Which reviews come first when a product has more than the cap. |
includeReviewImagesboolean | Add the links of the photos reviewers attached to each review. |
maxItemsinteger | Maximum number of products to return across the whole run, EXPIRED rows from Incremental mode included. This is the run's cap. Use 0 for the maximum of 100000 products per run. |
maxPagesinteger | Maximum number of result pages to take per keyword or link. Each page carries about 48 products. 0 = no page limit set; the run then stops at Max products, when there are no more results, when the store stops serving new products for the search, or at a safety limit of 4167 pages per keyword or link (far above what Max products can reach). When a limit you set here stops a search that still had results, the log says so. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large catalogue pull without returning or charging for products already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns every matching product as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products, which makes it a cheap way to watch price drops and restocks. What is compared: price, was-price, discount, on-sale flag, stock status, the option list with per-option stock, name, brand, description, specifications, dimensions and categories. What is excluded by default (still returned in the row, never a change): scrape timestamps, the product's rank and page in the results, the sponsored flag, delivery promise and arrival date, the live units-left message, how the product was found, image and video links, and ratings and reviews (average rating, review count, rating breakdown, review summary and the review sample). Option and material lists are compared regardless of the order the store returns them. 'Changes to watch' narrows this to price and stock only. Turn on 'Emit unchanged' or 'Emit expired' only when you also want those rows returned (and billed). State is kept separately for each search and filter setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to derive a key automatically from the search and filter settings, so two different searches never mix state. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want a full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, never when Max products capped it or Resume was used. EXPIRED rows count against Max products: a run returns at most the room left under it, and the rest are returned on a later complete run. This returns, and bills, extra rows, so leave it off unless you need expiry tracking. |
changeScopestring | All fields (default): any change to the compared product data marks a product UPDATED. Price and stock only: just price, was-price, discount, on-sale flag, stock status and per-option stock count, so name, description or specification edits never produce a billable UPDATED row. Changing this never starts a new baseline: the existing saved state is kept (under an automatic or a named State key) and each stored product is simply compared under the new setting. |
compactUpdatesboolean | Off by default. When on, UPDATED and EXPIRED rows are slim: ids, link, title, current price and stock, plus priceChanges (old and new value of each field that moved) and variantChanges (per-option ADDED, REMOVED or CHANGED). NEW rows stay full. A compact row does not carry product-page detail fields or reviews, so no detail or review charge applies to it. |
expireAfterMissedScansinteger | Used with 'Emit expired'. A product is marked EXPIRED only after it was missing from this many CONSECUTIVE complete scans (default 1). EXPIRED means the product dropped out of the scanned results; it does not prove the product is unavailable, because no product page is opened. Check stockStatus for availability. |
ignoreFieldsForChangesarray | Field names that must not count as a change, for example name or promoFlag. Use a dotted path to ignore a key inside every element of a list, for example options.url. Ignored fields are still returned in the row. Rank, sponsored flag, delivery text, media links and ratings and reviews are already ignored by default. Changing this list never starts a new baseline: the saved state is kept and each stored product is re-compared under the new list, so no product comes back as NEW. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per product; other connectors get a best-effort write or digest. Each connector receives a condensed summary per product, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which product pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on products written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
nameProductbrandBrandpricePricewasPriceWasdiscountPercentDiscount %currencyCurrencyratingRatingreviewCountReviewsstockStatusStockpromoFlagPromotionisSponsoredSponsored (boolean)imageUrlImage (image)Show 30 more fields
urlURL (link)skuSKUchangeTypeChangecategoryCategorydescriptionDescriptionhighlightsHighlights (array)specificationsSpecifications (object)dimensionsDimensions (object)materialsMaterials (array)selectedOptionsSelected options (object)optionsOptions (array)optionCountOption countratingHistogramRating breakdown (object)reviewSummaryReview summarybreadcrumbsBreadcrumbs (array)imagesImages (array)videosVideos (array)reviewsreviewsreviewIdReview IDtextReviewdateDateauthorAuthorlocationLocationverifiedPurchaseVerified purchase (boolean)purchasedOptionsOptions bought (object)changedFieldsChanged fields (array)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)priceChangesPrice changes (old/new) (object)variantChangesOption changes (array)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordType": "product",
"sku": "W000000001",
"variantId": "AB00000001",
"optionIds": "100000001",
"name": "Sample Task Chair",
"brand": "Sample Brand",
"collection": "Sample Collection",
"url": "https://www.wayfair.com/furniture/pdp/sample-brand-sample-task-chair-w000000001.html?piid=100000001",
"price": 212.99,
"wasPrice": 244.99,
"currency": "USD",
"onSale": true,
"discountPercent": 13,
"discountLabel": "13% Off",
"priceLabel": "Sale",
"rating": 4.6,
"reviewCount": 477,
"ratingHistogram": {
"1": 10,
"2": 8,
"3": 28,
"4": 75,
"5": 356
},
"stockStatus": "IN_STOCK",
"category": "Office Chairs",
"breadcrumbs": [
{
"name": "Furniture",
"url": "https://www.wayfair.com/furniture/cat/furniture-c45974.html"
}
],
"description": "A sample description of the product.",
"specifications": {
"Product Type": "Task Chair",
"Weight Capacity": "300 lb."
},
"dimensions": {
"Overall Dimensions": "39'' H X 26'' W X 26'' D"
},
"materials": [
"Linen",
"Foam"
],
"selectedOptions": {
"Upholstery Color": "Pink"
},
"options": [
{
"optionKey": "Upholstery Color: Pink",
"group": "Upholstery Color",
"name": "Pink",
"optionId": 100000001,
"inStock": true,
"selected": true,
"url": "https://www.wayfair.com/furniture/pdp/sample-brand-sample-task-chair-w000000001.html?piid=100000001"
}
],
"optionCount": 14,
"imageUrl": "https://assets.wfcdn.com/im/0/compr-r85/0000/000000001/i.jpg",
"promoFlag": "Fall Clearance",
"isBestValue": true,
"isSponsored": false,
"position": 3,
"page": 1,
"detailsFetched": true,
"reviewsRequested": true,
"reviews": [
{
"reviewId": 1,
"rating": 5,
"text": "Sample review text.",
"date": "09/25/2026",
"author": "Sam",
"location": "Springfield, ST",
"verifiedPurchase": true,
"purchasedOptions": {
"Upholstery Color": "Green"
},
"language": "en",
"images": []
}
],
"reviewsDelivered": 1,
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-10-31T12:00:00Z",
"lastSeenAt": "2026-10-31T12:00:00Z",
"scrapedAt": "2026-10-31T12:00:00Z"
}Ways to use this data
- Price and discount monitoring: track price drops, was-prices and promotion flags across a brand, a category or a keyword on a schedule.
- Competitive intelligence for home retailers: compare assortment, pricing, ratings and option depth against the largest online furniture store.
- Stock and restock alerts: watch specific products for sold-out and back-in-stock changes, option by option, with Incremental mode.
- Review mining: pull thousands of verified-purchase reviews with the options each reviewer bought to find what breaks, what runs small and what people love.
- Catalogue and content teams: build a structured feed of descriptions, specifications, dimensions and images for a comparison site or app.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Wayfair Scraper return?
The documented output for Wayfair Scraper includes product, brand, price, was, discount %, currency, rating and reviews. Availability of each field depends on the source page and the selected mode.
How much does Wayfair Scraper cost?
It costs $1.60 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and restocked products, and unchanged ones are not billed unless you turn on Emit unchanged.
Why did my run fail instead of returning an empty dataset?
If the store refuses every request, the run stops with a clear message so "no matches today" is never confused with "nothing could be read". Run it again in a few minutes. If only some pages could be read, you still get what was found, and the run tells you the result is incomplete.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
