To get Wayfair price history, record it: Wayfair shows no past prices, so read the same products every day and store what you read. Scavio's Wayfair API returns each product's price, strikethrough was_price, Sale tag (price_label) and badge: POST /api/v1/wayfair/search and /category return up to 48 products per call, /product returns one SKU with all its options, and an option_id prices one option. Every call costs 1 credit, so 500 SKUs read daily is 15,000 credits a month, $15 on the Growth plan of $1 per 1,000 credits.
Wayfair's terms say "We do not price match" and that prices "are subject to change without notice", so a shopper who wants to know whether a deal is good, or a seller watching a competitor's promotions, has to keep their own record. Every response in Steps 1 to 7 is a trimmed capture from live calls on November 14, 2026, between 02:10 and 02:19 UTC. Prices are numbers in the market's currency: 469.99 with "currency": "USD" is $469.99. Images are trimmed from every sample, and the docs list every field.
Step 1: Find the SKU
Every Wayfair product has a SKU, shown as "SKU:" on the product page and at the end of its URL (.../ebern-designs-oliver-3-person-sofa-w110562316.html is W110562316). Most US SKUs start with W; others are letters and digits (AEOI1247, CXVA1519), and the Canadian, UK and Irish listings we read included SKUs starting with C, U and I. To find SKUs by keyword, search:
curl -s https://api.scavio.dev/api/v1/wayfair/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "sofa", "country": "us"}'Wayfair mapped "sofa" to its Sofas category, so the answer is that category's first 48 products and says so in redirected_to. The first item, which shows a strikethrough and the Early Black Friday badge but no Sale tag:
{
"query": "sofa",
"count": 48,
"total": 261284,
"total_is_approximate": true,
"page": 1,
"page_size": 48,
"total_pages": 5444,
"sort": "recommended",
"redirected_to": {
"type": "category",
"category_id": "413892",
"name": "Sofas",
"url": "https://www.wayfair.com/furniture/sb0/sofas-c413892.html"
},
"country": "us",
"currency": "USD",
"items": [
{
"position": 1,
"sku": "W110562316",
"variant_id": "W110562316_880809770",
"name": "Oliver 3-Person Sofa",
"brand": { "id": 44308, "name": "Ebern Designs" },
"url": "https://www.wayfair.com/furniture/pdp/ebern-designs-oliver-3-person-sofa-w110562316.html?piid=880809770",
"price": 469.99,
"sale_price": null,
"was_price": 699.99,
"price_label": null,
"discount_percent": 33,
"prices": [
{ "type": "primary", "label": null, "amount": 469.99, "prefix": null, "suffix": null },
{ "type": "previous", "label": null, "amount": 699.99, "prefix": null, "suffix": null }
],
"badge": "Early Black Friday",
"rating": 4.41,
"review_count": 2643,
"stock_status": "in_stock",
"stock_text": "604 Left in Stock",
"open_box_price": 194.99,
"option_counts": [{ "name": "Colors", "count": 17 }],
"selected_options": [{ "category": "Body Fabric", "name": "Gray Polyester" }],
"category": "Sofas",
"sponsored": false
}
]
}The second item, the Barton faux-leather sofa, came back with "price_label": "Sale", "sale_price": 399.99, "was_price": 699.99 and "sponsored": true. A keyword Wayfair does not map to a category ("bed") returns 30 items a page instead of 48. total is Wayfair's own count and moves between pages on keyword searches, so do not use it as an exact number. Search also takes page, sort (recommended, price_asc, price_desc, rating) and filters for on_sale, closeout, open_box, in_stock, brand, min_rating, price_min and price_max. 1 credit.
Step 2: Read one product
curl -s https://api.scavio.dev/api/v1/wayfair/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sku": "W110562316", "zip": "10001", "country": "us"}'The Oliver sofa, with 3 of its 17 fabric choices shown and the description, specifications, images and reviews cut:
{
"sku": "W110562316",
"variant_id": "W110562316_880809770",
"name": "Oliver 3-Person Sofa",
"brand": { "id": 44308, "name": "Ebern Designs", "url": "https://www.wayfair.com/brand/bnd/ebern-designs-b44308.html" },
"price": 469.99,
"sale_price": null,
"was_price": 699.99,
"price_label": null,
"percent_off": 33,
"badge": "Early Black Friday",
"limited_time_deal": null,
"stock_status": "in_stock",
"max_quantity": 604,
"options": [
{
"category": "Body Fabric",
"total": 17,
"selected": "Gray Polyester",
"choices": [
{ "name": "Turmeric Corduroy", "option_id": "911590661", "stock_status": "in_stock", "url": "https://www.wayfair.com/furniture/pdp/ebern-designs-oliver-3-person-sofa-w110562316.html?piid=911590661" },
{ "name": "Rust Corduroy", "option_id": "911590668", "stock_status": "in_stock", "url": "https://www.wayfair.com/furniture/pdp/ebern-designs-oliver-3-person-sofa-w110562316.html?piid=911590668" },
{ "name": "Light Green Polyester", "option_id": "937697222", "stock_status": "in_stock", "url": "https://www.wayfair.com/furniture/pdp/ebern-designs-oliver-3-person-sofa-w110562316.html?piid=937697222" }
]
}
],
"rating": 4.41,
"review_count": 2643,
"rating_histogram": { "1": 134, "2": 76, "3": 150, "4": 490, "5": 1793 },
"review_summary": {
"text": "Customers find this product to be comfortable and easy to assemble, with many praising its value for the price. The appearance and color are also frequently highlighted as positive attributes.",
"label": "AI-generated from customer reviews"
},
"delivery": [
{ "name": "Ground Delivery", "date_min": "2026-11-17", "date_max": "2026-11-17", "text": "Get it by Tue, Nov 17", "badge": "FREE Fast Delivery" }
],
"delivery_zip": "10001",
"notes": [
"options[].choices[] carry no price: call product with that choice's option_id for its price and stock."
],
"country": "us",
"currency": "USD"
}The product price matched the search card to the cent. Product also returns dimensions (overall 32.7'' H X 89'' W X 35'' D, 114.64 lb.), specifications, features, breadcrumbs, collection, returns, review_aspects (Comfort mentioned positively 1,227 times, Assembly 853, Value 490) and reviews, the 5 reviews the page shows, with date, rating, verified flag and the option the reviewer bought. There is no review paging. Send url instead of sku if you have the product link. zip works for US ZIP codes and Canadian postal codes. 1 credit.
Step 3: Price each option
Option choices carry no price. To price one, send its option_id:
curl -s https://api.scavio.dev/api/v1/wayfair/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sku": "W110562316", "option_id": "911590668", "country": "us"}'{
"sku": "W110562316",
"variant_id": "W110562316_911590668",
"price": 469.99,
"sale_price": 469.99,
"was_price": 539.99,
"price_label": "Sale",
"percent_off": 13,
"badge": "Early Black Friday",
"stock_status": "in_stock",
"max_quantity": 663
}Same sofa, same price, a different strikethrough and the Sale tag. Four of the 17 fabrics, one call each:
| Fabric (option_id) | Price | Strikethrough | Sale tag | Percent off |
|---|---|---|---|---|
| Gray Polyester (880809770, the default) | $469.99 | $699.99 | none | 33% |
| Rust Corduroy (911590668) | $469.99 | $539.99 | Sale | 13% |
| Blue Polyester (880809764) | $469.99 | $529.99 | Sale | 11% |
| Rust Polyester (906178339) | $509.99 | $559.99 | Sale | 9% |
The same happened on search cards: one sofa listed twice in our capture, in Beige at $829.99 and in Khaki at $799.99. So the row you store should key on variant_id, which carries the option. 1 credit per option.
Step 4: Watch a whole category
To watch many items for few credits, read category pages, 48 products per call:
curl -s https://api.scavio.dev/api/v1/wayfair/category \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"category_id": "413892", "on_sale": true, "sort": "price_asc", "country": "us"}'{
"category": {
"id": "413892",
"name": "Sofas",
"url": "https://www.wayfair.com/furniture/sb1/sofas-on-sale-c413892-specialoffers.ca.38~8.html"
},
"count": 48,
"total": 73325,
"total_is_approximate": true,
"page": 1,
"page_size": 48,
"sort": "price_asc",
"requested_filters": { "on_sale": true },
"applied_filters": [{ "filter_id": "specialoffers.ca.38", "option_id": "8", "min": null, "max": null }],
"country": "us",
"currency": "USD",
"items": [
{
"position": 1,
"sku": "W117817372",
"name": "Air Sofa inflatable Couch, Inflatable Mattress with Adjustable Backrest Brown Portable Foldable Flocked Air Mattress",
"price": 45.99,
"sale_price": 45.99,
"was_price": 104.99,
"price_label": "Sale",
"discount_percent": 56,
"badge": "Sale",
"rating": 2.33,
"review_count": 3,
"category": "Sofas",
"sponsored": false
}
]
}All 48 carried the Sale tag and came back in price order. The cheapest "sofas" on sale were an inflatable couch, sofa armrest covers and a pet ramp, so add price_min when you want furniture only. category_id comes from a category URL (...-c413892.html) or a search's redirected_to; category_url takes the URL itself, filters included. Sorted pages follow Wayfair's price per item, so a set can sit out of order by its shown price. 1 credit.
Step 5: Poll every day and store the rows
This script reads a watchlist once and stores one row per SKU per day in SQLite. Run it from cron each morning:
import sqlite3, datetime, requests
API = "https://api.scavio.dev/api/v1/wayfair/product"
HEADERS = {"Authorization": "Bearer YOUR_SCAVIO_API_KEY"}
SKUS = ["W110562316", "W011370556", "AEOI1247", "W005097038", "W008315154", "W110951038"]
db = sqlite3.connect("wayfair_prices.db")
db.execute("""CREATE TABLE IF NOT EXISTS prices (
day TEXT, sku TEXT, variant_id TEXT, price REAL, sale_price REAL, was_price REAL,
price_label TEXT, badge TEXT, stock_status TEXT, PRIMARY KEY (day, sku))""")
day = datetime.date.today().isoformat()
for sku in SKUS:
r = requests.post(API, headers=HEADERS, timeout=180, json={"sku": sku, "country": "us"})
if r.status_code != 200:
print(sku, r.status_code, r.text[:120]) # 502/503 are not charged: retry later
continue
p = r.json()["data"]
db.execute("INSERT OR REPLACE INTO prices VALUES (?,?,?,?,?,?,?,?,?)",
(day, sku, p["variant_id"], p["price"], p["sale_price"], p["was_price"],
p["price_label"], p["badge"], p["stock_status"]))
print(day, sku, p["price"], p["was_price"], p["price_label"], p["badge"])
db.commit()Its first run, on November 14, 2026, one product from each of six categories:
| day | sku | product | price | was_price | price_label | badge |
|---|---|---|---|---|---|---|
| 2026-11-14 | W110562316 | Oliver 3-Person Sofa | 469.99 | 699.99 | null | Early Black Friday |
| 2026-11-14 | W011370556 | Calvo area rug | 169.99 | 450 | null | Early Black Friday |
| 2026-11-14 | AEOI1247 | Ergonomic mesh office chair | 48.99 | 95.96 | Sale | Early Black Friday |
| 2026-11-14 | W005097038 | Marilee metal frame bed | 203.99 | 791.96 | Sale | Early Black Friday |
| 2026-11-14 | W008315154 | Acacia solid wood dining table | 799.99 | 1063 | null | Early Black Friday |
| 2026-11-14 | W110951038 | Louann table lamp set | 124.99 | 169.99 | null | Early Black Friday |
Six credits a day. From the second day on, a drop is a row whose price is below the previous day's, and a strikethrough that moves while the price stands still is a row whose was_price changed. For a whole category, store every item of each daily category read instead, keyed on variant_id: in our run, page 2 repeated 55 products from page 1 across six categories, most of them sponsored placements, so dedupe before you count. To watch every fabric of a product, add one row per option_id.
Step 6: Know what the strikethrough and the Sale tag mean
Wayfair defines both in its Terms of Use, under "About Our Prices" (we quote the terms as archived on March 24, 2026):
- The strikethrough: "Where a product listing on our Sites references a higher price, typically denoted by a strikethrough (e.g. "$549"), such higher price represents the retail price suggested by the manufacturer or supplier. In the absence of a price suggested by the manufacturer or supplier, this price represents the highest price at which we offered or sold the product at some point in the past."
- Flash Deals: "an additional strikethrough price is presented that represents a recent previous price before the Flash Deal promotion."
- The Sale tag: "signifies that we are selling the product at a discount from a price in the previous 90 days."
- Closeout prices "may return to prices that are equal to or greater than their original prices" when the promotion ends.
So was_price is not necessarily yesterday's price, and a history you record is how you see the price itself move. In our 485-item capture, 414 items showed a strikethrough and 160 carried the Sale tag; is the Wayfair sale price real? breaks that down by category.
Step 7: Black Friday and Cyber Monday
Black Friday is November 27, 2026 and Cyber Monday November 30, and Wayfair was already running Early Black Friday badges on 213 of 485 items on November 14. Read your watchlist more often in that window, say every six hours from November 23. The sale events endpoint lists what Wayfair is running:
curl -s https://api.scavio.dev/api/v1/wayfair/deals \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "us"}'{
"count": 38,
"events": [
{ "event_id": 635914, "slug": "bedroom-furniture-sale~ev635914", "title": "bedroom furniture sale", "url": "https://www.wayfair.com/curated/bedroom-furniture-sale~ev635914.html" },
{ "event_id": 640190, "slug": "sealy-mattresses-more-up-to-60-off~ev640190", "title": "Sealy mattresses & more: up to 60% OFF", "url": "https://www.wayfair.com/curated/sealy-mattresses-more-up-to-60-off~ev640190.html" },
{ "event_id": 635924, "slug": "living-room-seating-sale~ev635924", "title": "living room seating sale", "url": "https://www.wayfair.com/curated/living-room-seating-sale~ev635924.html" }
],
"notes": [
"Event pages show only their first few products, so events are listed, not expanded: for sale, closeout or open-box products use search or category with on_sale, closeout or open_box."
],
"country": "us",
"currency": "USD"
}wayfair.com listed 38 events, from area rugs to hot tubs. Events are listed, not expanded into products: for the products on sale, use search or category with on_sale, closeout or open_box. 1 credit.
Step 8: Canada, the UK, Ireland and the US banners
Add country for another market; prices come in its own currency and are never converted. From our playground samples, captured from the live API the same morning between 02:05 and 02:07 UTC:
- Canada (
ca): "sofa" returned 48 items in CAD; the first, the Carmelinda corduroy loveseat, was CAD 489.99 against a strikethrough of 549.99 with the Sale tag."language": "fr"returns wayfair.ca in French, with "Solde" as the Sale tag and "Offre du Vendredi fou en primeur" as the early Black Friday badge. - UK (
gb): "sofa" returned 48 items in GBP; the first was £340 against £460, with the Sale tag and a "Black Friday Presale" badge. - Ireland (
ie): "dining table" returned 48 items in EUR. 19 carried the Sale tag, but only 1 item showed a strikethrough price, so expectwas_priceto be null more often there. - AllModern, Birch Lane, Joss & Main and Perigold:
"site": "perigold"with "sofa" returned Perigold's Sofas & Loveseats, 48 items in USD; the first, the Dylan Sofa, at $2,099.
zip works on the US and Canada only, and a country of de or at answers 400 because Wayfair no longer sells there.
All Wayfair endpoints
| Endpoint | What it returns | Credits |
|---|---|---|
POST /api/v1/wayfair/search | Products for a keyword: 30 a page, or 48 when Wayfair maps it to a category; price, strikethrough, Sale tag, badge, stock, rating, open-box price, sponsored flag; sorts, filters and facets | 1 |
POST /api/v1/wayfair/category | One category's products by id or URL, 48 a page, with the same fields, sorts and filters plus breadcrumbs | 1 |
POST /api/v1/wayfair/product | One product by SKU or URL: prices, options with option ids, dimensions, specifications, rating histogram, review summary and aspects, the 5 reviews on the page, ZIP delivery; with option_id, that option's price and stock | 1 |
POST /api/v1/wayfair/deals | The market's current sale events: id, title and URL | 1 |
Failed calls (502, 503) are not charged; a product that does not exist is. In our run a search for "lamp" failed three times and was not charged, and "table lamp" worked.
Getting started
- Sign up for 50 free credits, no card, and copy your API key.
- Run one search in the playground and pick your SKUs or a
category_id. - Save the Step 5 script with your key and SKUs, and schedule it daily.
- After a week, query the table for SKUs whose
pricefell or whosewas_pricemoved.
The money math on the Growth plan of $1 per 1,000 credits: the six category pages in Step 4's style, two per category, cost 12 credits a reading, $0.36 for a month of daily reads; 500 SKUs daily cost $15 a month. The best Wayfair price history APIs compares seven options on price and coverage, and the Wayfair API page lists every field.
Reference: Wayfair API overview · search docs · product docs · category docs · sale events docs · best Wayfair price history APIs · is the Wayfair sale price real? · how to get TCGplayer price history · how to get IKEA prices by country
Frequently asked questions
Does Wayfair have an API?
Wayfair's official API is for approved suppliers, behind a Wayfair Partner Home account, and covers orders, inventory and catalog sync rather than shopper prices. Scavio's Wayfair API returns public search results, categories, products with options and sale events as JSON for wayfair.com, wayfair.ca, wayfair.co.uk and wayfair.ie, 1 credit a call.
Does Wayfair show price history?
No. Wayfair pages show today's price and often a strikethrough price, but no chart of past prices, and Wayfair's terms say it does not price match. To see how a Wayfair price moved, record it yourself: read the same SKUs or category pages every day and store price, strikethrough, Sale tag and badge with the date.
Why do two colors of the same Wayfair product show different prices?
Each option is its own variant with its own price and strikethrough price. On November 14, 2026 the Oliver 3-Person Sofa cost $469.99 in Gray Polyester with a $699.99 strikethrough and no Sale tag, $469.99 against $539.99 in Rust Corduroy with the Sale tag, and $509.99 against $559.99 in Rust Polyester. Track the variant_id, not just the SKU.
Which Wayfair sites does the API cover?
wayfair.com in USD, wayfair.ca in CAD in English or French, wayfair.co.uk in GBP and wayfair.ie in EUR, plus Wayfair's US banners AllModern, Birch Lane, Joss & Main and Perigold through the site parameter. Wayfair no longer sells in Germany or Austria. ZIP delivery dates cover the US and Canada.
Do Wayfair's terms allow automated data collection?
Wayfair's Terms of Use say users agree not to "use any of the Sites in any manner that could overburden or impair any of the Sites" and prohibit "unauthorized copying, reproduction, ... or duplicating all or any part of the Sites". The version we read, archived on March 24, 2026, does not mention scraping, crawling or robots. This is not legal advice; read the current terms for your use case.