Etsy Scraper — Listings, Prices & Best Sellers avatar

Etsy Scraper — Listings, Prices & Best Sellers

Pricing

from $3.40 / 1,000 listing rows

Go to Apify Store
Etsy Scraper — Listings, Prices & Best Sellers

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

Public Records

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

5

Monthly active users

18 hours ago

Last modified

Features

Limited permissionsSingle-tenantServer interface

Share

  • Product research: each listing's title, price, rating_value and review_count for a keyword, market phrase or category.
  • Competitor pricing: price and currency next to the seller (shop_name), in the order Etsy ranks them (position).
  • Best-seller discovery by keyword or category: the bestseller badge on every row, for the keyword or category in query.
  • Listing exports: one row per listing with its listing_id and url, 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.

fieldexample / notes
query, surface, page, positionceramic mug, neu, 1, 3
listing_id, url, titlelisting id and URL, title
price, currency57.0, $
rating_value, review_count, review_count_approxrating and reviews (review_count_approx when Etsy shows "3.8k")
bestseller, popular_now, etsys_pick, free_shippingper-row boolean flags read from each listing card
star_sellerStar Seller badge; fill 100%, true on 34.7% of cache rows
is_adad 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_urlseller identity
sourceoptional run label
total_resultsresults Etsy reports for the keyword when the page carries it
data_source, stale, as_oflive 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:

  1. Open Etsy Scraper on Apify Store.
  2. Enter search keywords (and optional sort / price filters), or a market phrase / category URL.
  3. Leave maxItems at the default 20 for a cheap first look, or raise it for more rows.
  4. 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.

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.

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.

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 say data_source: "cache", stale: true and as_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_count is exact when Etsy shows an exact number and rounded (flagged review_count_approx) when Etsy shows "3.8k".
  • star_seller reads Etsy's Star Seller badge on the card; is_ad reads Etsy's "Ad from shop" label (checked against Etsy's own ad slot ids). On /market landing cards Etsy does not render the badge, so a missing badge there is null, 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 under failed_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 price of the complete listings for a keyword) and "most charge $a-$b" (the middle half of price), not "median" or "IQR". Say "N of M listings have a Bestseller badge" (bestseller), not "page 1 share". Prices are in currency as Etsy showed them; do not mix currencies. Leave rows with incomplete: true out of price figures.
  • Ads. is_ad: true is a paid slot; null means Etsy did not show it on that surface (unknown, not false). When naming a top shop, use the best-ranked listing (page, then position) whose is_ad is not true.
  • Comparing niches (several query values): 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_results is 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.