Etsy Scraper — Listings, Prices & Best Sellers
Pricing
from $3.40 / 1,000 listing rows
Etsy Scraper — Listings, Prices & Best Sellers
Scrape Etsy search results by keyword, category or market page: title, price, rating, reviews, Bestseller and Star Seller badges, ad flag and search rank.
Pricing
from $3.40 / 1,000 listing rows
Rating
0.0
(0)
Developer
Public Records
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
5
Monthly active users
18 hours ago
Last modified
Categories
Features
Share
- Product research: each listing's
title,price,rating_valueandreview_countfor a keyword, market phrase or category. - Competitor pricing:
priceandcurrencynext to the seller (shop_name), in the order Etsy ranks them (position). - Best-seller discovery by keyword or category: the
bestsellerbadge on every row, for the keyword or category inquery. - Listing exports: one row per listing with its
listing_idandurl, ready to export from the dataset.
Scrape Etsy search results by keyword, market page, or category URL: title, price, rating, reviews, Bestseller and Star Seller badges, ad flag and search rank. Pay per listing row. Works with Claude on claude.ai.
What does Etsy Scraper do?
Etsy Scraper is for product researchers and sellers who want Etsy search results as a clean table. You enter keywords (or a market / category URL), and you get one row per listing in Etsy's rank order — with price, rating, review count, shop, badges, and whether the slot was an ad. Use it to compare niches, check competitor pricing, or export listing URLs.
What data can you get?
One row per listing per input, in the order Etsy showed them. Fill rates below were measured first-hand on 1,739 stored rows.
| field | example / notes |
|---|---|
query, surface, page, position | ceramic mug, neu, 1, 3 |
listing_id, url, title | listing id and URL, title |
price, currency | 57.0, $ |
rating_value, review_count, review_count_approx | rating and reviews (review_count_approx when Etsy shows "3.8k") |
bestseller, popular_now, etsys_pick, free_shipping | per-row boolean flags read from each listing card |
star_seller | Star Seller badge; fill 100%, true on 34.7% of cache rows |
is_ad | ad flag; fill 74.8% (non-null), true on 27.4% of cache rows; null when Etsy does not label the slot |
shop_name, shop_id, shop_url | seller identity |
source | optional run label |
total_results | results Etsy reports for the keyword when the page carries it |
data_source, stale, as_of | live or cache; cached rows set stale: true and as_of |
bestseller is a per-row flag read from the Bestseller badge on the listing card. The Bestseller filter keeps listings shown with Etsy's Bestseller badge on the search page (bestseller: true); the Star Sellers and free-shipping filters work the same way on star_seller and free_shipping. Listings without the badge are dropped and not charged.
How to check an Etsy shop's sales
This Actor returns search listings, not shop sales history. To check a shop's sales counter over time, use Etsy Shop Sales Tracker.
To scrape search results:
- Open Etsy Scraper on Apify Store.
- Enter search keywords (and optional sort / price filters), or a market phrase / category URL.
- Leave
maxItemsat the default 20 for a cheap first look, or raise it for more rows. - Run. Export the dataset, or call the Actor on a schedule / via API / MCP.
Why some rows say stale
When a keyword is served from a recent snapshot (same filters, still within maxCacheAgeHours, default 24), or when Etsy blocks both live sessions and a prior good result exists, those rows say data_source: "cache", stale: true, and as_of for when they were read live. Live rows say data_source: "live" and stale: false. Cached rows are charged like live rows.
How much does it cost?
Pay per event. Prices as of Oct 28, 2026 (Store pricing): listing-row 0.4¢ per complete listing on the Free plan, plus actor-start 0.005¢ once per run when a complete listing is in hand. Apify Store discounts lower the listing-row price on paid plans: 0.38¢ on Bronze, 0.36¢ on Silver and 0.34¢ on Gold, Platinum and Diamond. Blocked pages with no rows charge nothing. Incomplete rows (no price/title/shop) are delivered flagged incomplete: true and are not charged.
Max listings per run defaults to 20, so one keyword on default input costs 20 × 0.4¢ + 0.005¢ ≈ 8¢ on the Free plan; raise maxItems (or set 0 for no cap) for more listings, up to maxPages pages per input.
Worked examples (event prices as of Oct 28, 2026, Free plan):
- 20 listings (default): 20 × 0.4¢ + 0.005¢ ≈ 8¢
- 100 listings: 100 × 0.4¢ + 0.005¢ ≈ 40¢
- 1,000 listings: 1,000 × 0.4¢ + 0.005¢ ≈ $4.00
Apify's Free plan (fetched from apify.com/pricing): "Includes $5 of monthly prepaid platform usage." At the Oct 28, 2026 event prices, $5 covers one actor-start plus 1,249 listing-row events (1,249 × 0.4¢ + 0.005¢ ≈ $4.996).
Sample output
Two rows from a real run (query ceramic mug), copied from that run's dataset:
[{"listing_id": "4433701306","url": "https://www.etsy.com/listing/4433701306/custom-name-blue-striped-ceramic-travel","title": "Custom Name Blue Striped Ceramic Travel Mug with Lid, Handmade Ceramic Mug, Ceramic To Go Mug, Travel Mug, Ceramic Tumbler, Birthday Gift","price": 28.6,"currency": "$","shop_id": "62076013","shop_name": "ClayHueMugs","shop_url": "https://www.etsy.com/shop/ClayHueMugs","rating_value": 4.9,"review_count": 159,"review_count_approx": false,"bestseller": false,"popular_now": true,"star_seller": true,"etsys_pick": false,"free_shipping": false,"is_ad": true,"position": 1,"surface": "neu","page": 1,"query": "ceramic mug","source": "","total_results": 1495095,"data_source": "live","stale": false},{"listing_id": "4575689601","url": "https://www.etsy.com/listing/4575689601/custom-handmade-face-mug-from-photo","title": "Custom Handmade Face Mug From Photo, Underglaze Painting, Couple Mug, Gift for Her","price": 38.36,"currency": "$","shop_id": "65125655","shop_name": "CeraLumi","shop_url": "https://www.etsy.com/shop/CeraLumi","rating_value": 4.9,"review_count": 63,"review_count_approx": false,"bestseller": false,"popular_now": true,"star_seller": true,"etsys_pick": false,"free_shipping": true,"is_ad": true,"position": 2,"surface": "neu","page": 1,"query": "ceramic mug","source": "","total_results": 1495095,"data_source": "live","stale": false}]
Run it on a schedule
Re-run your keywords and category pages on a cadence without starting runs by hand.
- Apify Schedules — on the Actor's page open Schedules, add this Actor with your saved input and a cron expression (for example every morning), and Apify starts each run for you. See https://docs.apify.com/platform/schedules .
- Webhooks — fire a webhook when a run succeeds or fails to push the run and its dataset id to your own endpoint. See https://docs.apify.com/platform/integrations/webhooks .
- Make / n8n — run this Actor on a scenario schedule and map listing rows into Sheets, Slack, or a database. See https://docs.apify.com/platform/integrations/make and https://docs.apify.com/platform/integrations/n8n .
API / MCP
- Apify API — start a run with the Apify client or REST API; read the default dataset when the run succeeds. See https://docs.apify.com/api/v2 .
- MCP — add the hosted endpoint below to your MCP configuration.
https://mcp.apify.com?tools=publicrecords/etsy-search-scraper
Transport: Streamable HTTP (hosted by Apify, see https://docs.apify.com/mcp).
FAQ
How do I check Etsy shop sales?
Use Etsy Shop Sales Tracker for sales counts by shop. This Actor is for search listings (title, price, rating, badges, rank).
Where is Etsy shop sales history?
Not in this Actor. Sales history / change-since-last-read is on Etsy Shop Sales Tracker (as_of, delta_last, delta_7d).
Is this an Etsy shop sales checker?
No — this is a search-results scraper. For a sales checker, use Etsy Shop Sales Tracker.
Is this an estimate?
Listing fields are what Etsy showed for that search (live or from a dated cache row). Prices and badges are not modelled estimates. review_count may be rounded when Etsy shows "3.8k" (review_count_approx: true).
How often is a shop read?
This Actor does not read shops on a panel cadence. For Search, use each row's as_of when stale is true (cache), or the run time when data_source is live. No moving cadence number is published here.
Can I track a shop not in the panel?
Search is not panel-based. Any shop that appears in Etsy's search results for your query can appear as shop_name on a listing row. For Velocity's panel behavior, see that Actor's README.
Is it legal?
The Actor reads public Etsy search result pages the way a logged-out visitor would (via residential proxy). Use the data in line with Etsy's terms and the laws that apply to you. This is not legal advice.
Pay per use vs monthly subscription?
This Actor is pay per use only (actor-start + listing-row). There is no monthly subscription for the Actor itself. Apify platform plans (Free with $5 prepaid usage, or paid plans) are separate; see apify.com/pricing.
Related
- Etsy Shop Sales Tracker — sales counts and change-since-last-read across the hosted shop panel.
Inputs
- Search keywords — each keyword lands on Etsy's
/market/page, then pages through Etsy's own search API. Sort and price filters apply here. - Sort — relevance (Etsy default), newest, price low→high, price high→low, top customer reviews. Min / max price in whole units of the shop currency.
- Market phrases — Etsy's
/market/pages; any phrase resolves (with a sort or price set, a phrase runs as a keyword search). - Category URLs — e.g.
https://www.etsy.com/c/jewelry/necklaces, read in Etsy's default order. - Filters — bestsellers, Star Sellers, free shipping, on sale, digital downloads, handmade, personalizable, ready to ship within N days, ships to country. The Bestseller filter keeps listings shown with Etsy's Bestseller badge on the search page; listings without the badge are dropped and not charged.
- Max snapshot age (hours) (
maxCacheAgeHours, default 24) — a keyword is answered from our recent snapshot of the same search when that snapshot is at most this many hours old and holds every row you asked for; otherwise it is fetched live. Snapshot rows saydata_source: "cache",stale: trueandas_of(when they were read live) and are charged like live rows.0= always fetch live. - Return every listing on the page — on by default; off returns the 12 rendered cards per page only.
- Source — optional free-text label. Empty by default. Copied onto every listing row and onto
RUN_SUMMARY.source. - Runs started from our templates are counted by template name only; no input data or user identity is recorded.
Proxy, reliability and pricing
Etsy blocks datacenter IPs. The run uses Apify Proxy RESIDENTIAL by default, included in the event prices below (you are not billed separately for proxy or compute), or a residential proxy you supply. A DataDome challenge is given time to settle; an unsettled block is retried once on a fresh session; if both sessions are blocked the run stops with blocked_on_your_proxy, the response is saved as BLOCKED_nnn in the key-value store for your diagnosis, and that page is not charged. RUN_SUMMARY is written after every page, so a stopped run always says what it served and why.
If Etsy blocks both sessions for a keyword, the run answers from the most recent good result for that keyword (same filters, or the unfiltered result narrowed to Bestseller / Star Seller / free-shipping rows). Each of those rows says data_source: "cache", stale: true and as_of (when it was read live); live rows say data_source: "live" and stale: false. Cached rows are charged like live rows, one listing-row per row delivered. If nothing is cached for that keyword, the run ends SUCCEEDED with 0 rows and ERROR_UPSTREAM_BLOCKED in its status, and nothing is charged.
You pay actor-start (0.005¢ as of Oct 28, 2026, Store pricing) once per run, only when a complete listing is in hand and it fits your maximum charge together with that listing, plus one listing-row event per complete listing delivered (0.4¢ on the Free plan, down to 0.34¢ with Store discounts). Max listings per run defaults to 20, so one keyword on default input costs 20 × 0.4¢ + 0.005¢ ≈ 8¢; raise maxItems (or set 0 for no cap) for more listings, up to maxPages pages per input. A run that ends with no complete row — including an Etsy HTTP 403 — emits no charge events. A row without a price, title or shop is still delivered, flagged incomplete: true, and not charged. If a run reaches your maximum charge per run, it stops there: every charged row is in your dataset, no row is charged that you don't get, and the run's status message and RUN_SUMMARY say stopped at your spending limit after N rows. Nothing else: the Actor is priced per event, so platform usage (compute and Apify Proxy) is not passed on to you.
Limits and honesty
review_countis exact when Etsy shows an exact number and rounded (flaggedreview_count_approx) when Etsy shows "3.8k".star_sellerreads Etsy's Star Seller badge on the card;is_adreads Etsy's "Ad from shop" label (checked against Etsy's own ad slot ids). On/marketlanding cards Etsy does not render the badge, so a missing badge there isnull, not guessed.- If an input fails or comes back partial (for example the second batch of cards did not load), the run's status message names it (
failed:/partial:) and RUN_SUMMARY lists it underfailed_inputs/partial_inputs. - Sort and price never touch category pages (Etsy's robots rules), so category URLs come in Etsy's default order.
- Results reflect what Etsy shows a logged-out visitor from your proxy's region.
For AI assistants: how to present this data
- Plain words. Say "typical price" (the middle
priceof the complete listings for a keyword) and "most charge $a-$b" (the middle half ofprice), not "median" or "IQR". Say "N of M listings have a Bestseller badge" (bestseller), not "page 1 share". Prices are incurrencyas Etsy showed them; do not mix currencies. Leave rows withincomplete: trueout of price figures. - Ads.
is_ad: trueis a paid slot;nullmeans Etsy did not show it on that surface (unknown, not false). When naming a top shop, use the best-ranked listing (page, thenposition) whoseis_adis nottrue. - Comparing niches (several
queryvalues): one compact table with one row per niche: niche (query), typical price, Bestseller count, #1 shop (shop_name, as above). - Chart, only if you can draw one: a bar chart of typical price for Bestseller listings vs the other listings.
- Report shape: one table, then a 2-3 line summary, then offer the rows as a CSV.
- Always state the date of the run and that the numbers come from the user's own run of this Actor: Etsy search changes through the day and by proxy region (
total_resultsis what Etsy reported for that run). - This Actor has no sales or revenue data. For sales over time, point to Etsy Shop Sales Tracker; do not estimate sales from badges or review counts.
Changelog
Actor releases are tagged in this repository. Store listing fields are applied by the maintainer separately from this README.