Chairish Scraper: New Listing & Price Drop Alerts
Pricing
from $1.50 / 1,000 listing returneds
Chairish Scraper: New Listing & Price Drop Alerts
Chairish scraper by category, designer, maker or brand: US vintage furniture and decor with price, markdowns (discount %) and dealer info. New chair listings on Chairish, price drop alerts for chaise lounges, export wall mirrors to Google Sheets, CSV or n8n. No login. Quiet runs are free.
Pricing
from $1.50 / 1,000 listing returneds
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Features
Share
Watch a search, get only what's new. New listings and price drops since your last run, charged per new row, free on quiet days. Schedule it hourly and send it to Discord, Slack, Google Sheets or n8n.
This actor reads Chairish, the US vintage furniture and decor marketplace, by category, designer
or brand: give it a keyword like "chairs", a designer or brand like "designer: Hans Wegner", or
paste a chairish.com/collection/... or /maker/... link, and get one row per listing with the
title, price, Chairish's own category path, its newly-made/vintage flag, and the link. Turn on
monitoring and each run returns only the listings that appeared, or got cheaper, since the previous
run — including a listing Chairish itself just marked down.
How to search
| You type | You get | Example |
|---|---|---|
| a plain keyword | one of Chairish's own categories | chairs, wall mirrors, chaise lounge |
designer: <name> | that designer's page, every piece they made | designer: Hans Wegner |
brand: <name> | that brand's page | brand: Knoll |
maker: <name> | same as designer/brand — Chairish uses one page for both | maker: Chanel |
| a pasted link | that exact collection or maker page, as-is | https://www.chairish.com/maker/knoll |
Finding one exact model. A designer or brand page returns everything they made — to narrow it
to one model, add the model name under "Only include listings matching" rather than typing it
into the search itself: brand: Knoll plus includeKeywords: ["Tulip"] returns only Knoll listings
whose title or category mentions "Tulip".
What does not work. Chairish's own /search page is off-limits (its robots.txt disallows it),
so a combined free-text query like knoll tulip table white is not supported and will be rejected —
this actor can only resolve a line to one specific Chairish page (a category, or a designer/brand),
never an arbitrary search. Split it: brand: Knoll for the maker, includeKeywords for the model.
Who it's for
- Dealers and sourcing agents hunting vintage pieces on Chairish who lose good finds to whoever refreshes the page fastest. A watchlist on "chairs" or "chaise lounge", run every hour, puts new listings in your Discord or Telegram without keeping a tab open.
- Interior designers researching what a category or period piece genuinely costs on Chairish right now.
- Resellers watching for Chairish's own markdowns — this actor treats a listing going on sale as a price-drop alert, not just a price falling below what this monitor last saw.
- Bot and workflow builders who want a stable JSON row per listing instead of maintaining their own scraper.
Why this one
- Category-first search, honestly. Chairish's own
robots.txtdisallows/search, so this actor never uses it — and it only maps keywords to the Chairish collections this build actually confirmed render a real product grid server-side (chairs,wall mirrors,chaise lounge,runner rugs,bar stools, and a handful more). Most of Chairish's own category names for common furniture nouns (mirrors, sofas, tables, dining chairs...) turned out to be "hub" pages with an empty, JavaScript-only product grid; rather than silently return zero rows for those, this actor rejects them up front with a clear message. A pastedchairish.com/collection/...link works for any leaf collection, including ones this build didn't test. - Search by designer or brand, not just category.
designer: Hans Wegnerorbrand: Knollreads that maker's own Chairish page — the same route covers both, since Chairish itself doesn't distinguish a designer's page from a brand's. Pair it withincludeKeywordsto land on one exact model (see "How to search" above). - Monitoring built in, not bolted on.
deltaModeremembers what each watchlist has seen. New listings and price drops (with your own minimum drop %) come back; everything else is removed before billing. A quiet run returns one summary row and costs only the start fee. - Chairish's own markdown flag counts too. A listing that goes on sale is a price drop even the first time this monitor sees it — see "Monitoring" below.
- No login required. Chairish's collection pages are plain server-rendered HTML — no CAPTCHA, and a residential IP reads them with no challenge at all.
What you get
By default each listing is its own row. Every row also repeats the search it came from.
| Field | What it is |
|---|---|
listingId, url, title | Chairish's listing ID, the listing link and its title |
price, currency | The price in US dollars |
category | Chairish's own full category path (e.g. "Furniture/Seating/Dining Chairs") |
isNewlyMade, condition | Chairish's own newly-made flag, and the same thing as New / Vintage/Antique — not a graded condition (see FAQ) |
isDiscounted, discountPct | Chairish's own markdown flag and percentage |
isPurchasable | Whether Chairish currently shows the listing as purchasable |
imageUrl | Link to the main photo (links only, nothing is downloaded) |
sellerType, sellerHash | Always dealer (see FAQ), and an anonymous 16-character dealer hash |
isNew, changeType, firstSeenAt | Monitoring: new, price-drop or seen, and when this watchlist first saw it |
previousPrice, priceDropPct | Monitoring: the price last seen and the drop in %, on price-drop rows |
searchQuery, listingCount, truncated | The search summary |
newCount, priceDropCount, monitorStatus | Monitoring summary |
Not in this actor, because Chairish's own listing cards don't carry them (confirmed on the sampled
cards): a posting date or a total-matches count. totalAvailable is always empty.
Monitoring: new listings and price drops
The recipe most buyers use:
- Put your search in
searches(a Chairish category keyword, or paste a collection link), and turn on Only return listings that are new, or cheaper, since the last run (deltaMode). - Optionally turn on Seed silently so the first run remembers today's listings without sending them all to your webhook.
- Save it as a Task and add an hourly Schedule in Apify.
- Add a webhook or integration on the Task for Run succeeded: Discord or Slack webhook, Telegram bot via n8n or Make, a Google Sheets append, or an HTTP call to your own bot.
{"searches": ["chairs"],"maxPrice": 2000,"deltaMode": true,"skipFirstRun": true,"alertOnNew": true,"alertOnPriceDrop": true,"minPriceDropPct": 10}
How it decides:
- New means this watchlist has never returned that listing ID before.
- Price drop means the price is at least
minPriceDropPctbelow the price last seen. Because this actor tracks the CURRENT price (already net of any markdown), a listing that goes on sale is naturally a price drop from the second run on. - Chairish's own markdown, even on a first sighting. A listing your watchlist has never seen before, but which Chairish already shows as marked down, is delivered as a price-drop alert too — even if "Alert on new listings" is off — so a buyer watching only for markdowns doesn't miss one just because it's also new to the watchlist.
- Unchanged listings are removed before you are billed. A run with nothing new returns one summary
row with
monitorStatus: NO_NEW_ROWS,listingCount: 0, and costs only the start fee. - Each watchlist remembers up to 5,000 listings, oldest forgotten first.
Limitations. Chairish's collection pages expose no total-matches count anywhere in the static
HTML, so totalAvailable is always empty and truncated is a best-effort signal based on whether
the last page fetched was still full. A run only sees the newest maxListingsPerSearch listings; a
listing that drops in price after it slides out of that window is not seen again. This actor
defaults its proxy to Residential rather than Datacenter — Chairish answers Apify's shared
datacenter IP range with an HTTP 418 block, even though it serves a plain, un-challenged page to an
ordinary residential IP.
Price
- Listing returned: $3 per 1,000 listings
Plus a $0.005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.
- Listings: $3 per 1,000 listings returned, plus a $0.005 start fee per run.
- A monitoring run with nothing new costs the start fee only. A search that returns nothing is never billed.
How to use
- In the Apify Console. Open the actor page and click Start — the
searchesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~chairish-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["chairs","brand: Knoll"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Tips:
includeKeywords/excludeKeywordsmatch the title and Chairish's own category path before billing, so a word you don't want never costs you a row.minPrice/maxPriceare applied after fetching — Chairish has no price-filter URL parameter this build could find, so these are honoured client-side rather than dropped silently.- Looking for one designer or brand instead of a category? Use
designer: <name>orbrand: <name>— see "How to search" above. - If your keyword doesn't match, paste the real
chairish.com/collection/...or/maker/...link instead — the actor's error message tells you when this happens.
How to filter
Every filter below is optional and off by default — leave it out and you get the exact same rows
as before. minPrice/maxPrice and includeKeywords/excludeKeywords already existed; this
section adds availability and sortBy. There is no conditions filter: Chairish's only
condition-shaped signal is isNewlyMade (new production vs. vintage/antique), a production-era
flag rather than a graded condition, so it stays as the existing condition/conditionRaw
columns rather than a filterable 6-value grade.
1. Available only, cheapest first:
{"searches": ["dining chairs"],"availability": "available","sortBy": "price_asc"}
availability filters on Chairish's own "purchasable" flag (no "reserved" state exists).
sortBy sorts the listings this run fetched, after filtering — Chairish's pages carry no posting
date, so only the two price sorts do anything; leaving it empty (or "Newest") keeps the page's own
order.
2. Newly made only, over a price range:
{"searches": ["brand: Knoll"],"includeKeywords": [],"minPrice": 200,"maxPrice": 2000}
Combine with the existing condition column (visible in the results) to see which of these are
newly made vs. vintage — there is no input to filter on it directly.
3. Exclude a word, most expensive first:
{"searches": ["armchairs"],"excludeKeywords": ["reproduction"],"sortBy": "price_desc"}
Input
{"searches": ["chairs","brand: Knoll"]}
One search per line, in any of these forms:
chairs (a Chairish collection) designer: Hans Wegner (a designer or brand page) brand: Knoll https://www.chairish.com/maker/knoll (any collection or maker URL)
Looking for one model (Wishbone, Tulip)? Add it under "Only include listings matching" below. Free-text search is not available on Chairish (its own robots.txt blocks it), so a keyword must resolve to one of Chairish's own collections or a real designer/brand page. No login required. Accepted formats: chairs, wall mirrors, designer: Hans Wegner, brand: Knoll, https://www.chairish.com/maker/knoll, https://www.chairish.com/collection/us-vintage.
Sample output
| query | found | status | searchQuery | listingCount | truncated | newCount | priceDropCount | monitorStatus | listings | listingId | title | price | currency | category | isNewlyMade | condition | conditionRaw | isDiscounted | discountPct | isPurchasable | availability | imageUrl | sellerType | sellerHash | changeType | isNew | previousPrice | priceDropPct | firstSeenAt | url | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| chairs | true | OK | <monitoring status (quiet / seeded runs)> | <all listings found (full list)> | <price (usd)> | <chairish's own category path> | <newly made (vs. vintage/antique)> | <new or vintage/antique, from chairish's own flag> | <condition (raw, same as condition — marketplace-filters standard column)> | <chairish's own markdown flag> | <discount % (chairish's own)> | <availability (marketplace-filters standard: available/sold, from ispurchasable)> | <always "dealer" — see readme> | <new / price-drop / seen> | <is this listing new?> | <price drop % (this monitor)> | 1970-01-01T00:00:00.000Z |
A real row from a chairs run (2026-09-22), trimmed:
{"searchQuery": "chairs","listingCount": 5,"listingId": "35487167","url": "https://www.chairish.com/product/35487167/antique-viennese-fan-chairs-in-walnut-veneer-with-lemon-band-inlays-austria-1830-set-of-6","title": "Antique Viennese Fan Chairs in Walnut Veneer with Lemon Band Inlays, Austria, 1830, Set of 6","price": 17971,"currency": "USD","category": "Furniture/Seating/Dining Chairs","isNewlyMade": false,"condition": "Vintage/Antique","isDiscounted": false,"sellerType": "dealer","sellerHash": "3f7c1a9e0d2b5648"}
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~chairish-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["chairs","brand: Knoll"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~chairish-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["chairs","brand: Knoll"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~chairish-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Chairish Scraper: Designer & Brand Price Alerts" — the agent will find and run this actor.
Discord or Slack alerts without code. Schedule the monitoring Task hourly, then add an
integration on the Task: in n8n or Make, trigger on "Apify: run succeeded", read the run's dataset,
skip rows where listingCount is 0, and post title, price, category and url to a Discord
or Slack webhook. Google Sheets users can append the same rows for a running price log.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
| This actor | $3 per 1,000 listings, quiet monitoring runs free | Category search mapped to Chairish's real collections, Chairish's own markdown flag treated as a price-drop signal, built-in new-listing and price-drop monitoring | No free-text search (robots.txt blocks it), no posting date or total-matches count |
| Checking Chairish by hand | Free, plus your time | Full control | Doesn't scale past a handful of searches and misses whatever appears between visits |
Data & privacy
Data & privacy. This actor reads public listing pages that anyone can see without logging in. It doesn't log in, solve CAPTCHAs or reveal hidden contact details. Chairish's own listing cards expose no seller name, only an opaque dealer code; this actor hashes even that before it reaches the output. Not affiliated with Chairish.
FAQ
Is this allowed?
It collects the same public listing data your browser shows, for the categories you choose. It's
built for monitoring a category, not for copying the marketplace. Check that your use fits
Chairish's terms and your local law — note that this actor deliberately never uses Chairish's
/search page, which its own robots.txt disallows.
Why does my keyword not work?
Chairish's search page is off-limits by its own robots.txt, so this actor only reads its category
("collection") and maker pages — and only the ones that are genuine, server-rendered listing grids.
A keyword must resolve to a real, working Chairish collection ("chairs", "wall mirrors", "chaise
lounge", "runner rugs", "bar stools"...). Many other real Chairish category names for common
furniture nouns (sofas, tables, dining chairs, most plain furniture nouns) are "hub" pages:
real, valid links whose product grid Chairish itself only fills in with client-side JavaScript,
which this actor doesn't run. Rather than silently return zero rows for those, this actor rejects
them up front with a clear message. Looking for a specific designer or brand instead? Use
designer: <name> or brand: <name> — see "How to search" above. For anything else, paste the
real chairish.com/collection/... or /maker/... link — if it turns out to be a hub page, or the
maker doesn't exist, the run comes back with a clear "no listings" result rather than fabricated
data.
Why is condition only "New" or "Vintage/Antique"?
That's the only distinction Chairish's own listing cards expose — a binary newly-made flag, not a
graded condition (like "excellent"/"good"/"fair"). It's reported as-is, not padded out with a grade
Chairish doesn't provide.
Why is sellerType always "dealer"?
Every Chairish listing card sampled during this build carried a dealer code and none exposed a
private-seller flag — Chairish is a consignment-dealer marketplace, not a peer-to-peer one. The
field is kept (rather than removed) so the anonymous sellerHash still has a labeled counterpart.
Why did my monitoring run return nothing? Nothing new or cheaper appeared since the last run. You get one row with
monitorStatus: NO_NEW_ROWSSEEDED.
What do I need to set up? Nothing. No Chairish account, no cookies, no proxy settings.
Can an AI agent call this? Yes, through the Apify MCP server or the API call shown above. Ask for "Chairish Scraper: New Listing & Price Drop Alerts".
Related actors
- Pamono Listing Lookup: the same one row per listing shape for Pamono's EU/US design and vintage-furniture marketplace.
- 1stDibs Listing Lookup: global luxury furniture and design, with 10-currency pricing and era tags.
- Selency Listing Lookup: France's vintage furniture and decor marketplace, with material and style tags.
- Vinted Listing Lookup: new-listing and price-drop alerts across 22 Vinted second-hand fashion sites.