Etsy Listings Scraper: Prices, Shop Ratings & Bestsellers avatar

Etsy Listings Scraper: Prices, Shop Ratings & Bestsellers

Pricing

from $1.50 / 1,000 listings

Go to Apify Store
Etsy Listings Scraper: Prices, Shop Ratings & Bestsellers

Etsy Listings Scraper: Prices, Shop Ratings & Bestsellers

Scrape Etsy search results for product research: price and discount, shop name, shop rating and review count, Star Seller, Etsy's Pick, Bestseller and free shipping badges, ad flag and image. Sort and filter by price. No login, no API key.

Pricing

from $1.50 / 1,000 listings

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

2 hours ago

Last modified

Share

40 Etsy listings in 123 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Type what a shopper would type into Etsy (water bottle, personalized necklace, wedding favors) and get the search results as clean rows: title, price in US dollars, the original price and discount when it is on sale, the shop's name, star rating and review count, Star Seller, Etsy's Pick, Bestseller and free shipping flags, whether the result was a paid ad, and its position on the page. Sort by price, newest or top reviews and set a price range. No Etsy account and no API key.

Why choose this actor?

  • Product research numbers on every row. In our run of the live build on 29 September, water bottle returned 40 listings in 123 seconds, every one with its price, shop rating, shop review count, badges and ad flag, and 31 of them with an original price and discount percent.
  • See which results are paid. Every row has is_ad and position, so you can measure how much of a niche's first page is bought placement. In that run, 18 of the 40 listings were Etsy Ads.
  • One flat price, nothing for empty searches. $1.50 per 1,000 listings on every Apify plan, plus a $0.005 start fee per run. A listing found twice in one run is delivered and charged once, and the summary rows cost nothing. With monitorMode on, scheduled runs deliver only listings you have not received before.

Run it on Apify

Part of The Mine Works E-commerce and marketplaces family: Ozon.ru Scraper, Amazon Product Scraper, ⭐ Amazon Reviews Scraper, Carsales.com.au Scraper, AliExpress Scraper, Kleinanzeigen.de Scraper.

Try it in one minute

Paste this into the JSON tab of the input page and press Start:

{
"queries": ["water bottle"],
"maxItems": 10
}

You get the top 10 Etsy results for "water bottle" with prices, shop ratings and badges, usually in under a minute. Each Etsy page takes the proxy 20 to 60 seconds to return, so small runs are quick and big ones take a few minutes.

Give your searches in queries, one search term per line, exactly as you would type them on Etsy. Each term is searched on its own, results are merged, and maxItems caps the total across all terms. sort, minPrice and maxPrice apply to every term in the run.

Apify's free plan includes $5 of credit every month, which covers about 3,300 listings at this actor's price ($0.0015 per listing, plus the $0.005 start fee on each run).

Copy to your AI assistant

themineworks/etsy-search-scraper on Apify. Searches Etsy (US) by keyword and returns one row per listing with title, price, currency, original price and discount percent when on sale, shop name, shop ID, shop star rating and review count, Star Seller, Etsy's Pick, Bestseller and free shipping flags, badges, ad flag, position, image and listing URL. Call ApifyClient("TOKEN").actor("themineworks/etsy-search-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: queries (string[]). Optional: maxItems (default 50, max 2000, across all queries), sort ("relevance" default, "price_low", "price_high", "newest", "top_reviews"), minPrice and maxPrice (whole US dollars), monitorMode (default false; deliver only listings this account has not received from this actor before). Rows with _type "summary" or "info" are run reports and are never billed. Full spec: GET https://api.apify.com/v2/acts/themineworks~etsy-search-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • 22 fields per listing, including numeric price, original_price and discount_percent, the shop's shop_rating and shop_review_count, four badge flags (star_seller, etsys_pick, bestseller, free_shipping), the raw badges list, is_ad and position.
  • Etsy's own sort and price filters. Relevance, lowest price, highest price, most recent and top customer reviews, plus a minimum and maximum price in whole US dollars, sent to Etsy the way its own search page sends them.
  • US results in US dollars. Every request goes out through a US exit, so titles come back in English and prices in USD. All 52 listings in our five latest runs were priced in USD.
  • Several search terms in one run. Up to 25 result pages per term (Etsy shows 48 regular listings per page, plus ads), up to 2,000 listings per run, and up to 3 pages fetched at the same time.
  • Monitor mode for scheduled runs. monitorMode remembers the newest 50,000 listing IDs your account has received from this actor and skips them next time, so a daily schedule pays only for listings you have not seen.
  • Gives up before it wastes money. A term stops after two pages in a row with no new listing, and the whole run stops after four page failures in a row.

How to use it

Basic: one search term

{
"queries": ["personalized necklace"],
"maxItems": 200
}

Price band research, cheapest first

{
"queries": ["personalized necklace"],
"maxItems": 200,
"sort": "price_low",
"minPrice": 20,
"maxPrice": 80
}

Use this to see what the bottom of a price band looks like before you price a new listing. Prices are whole US dollars.

A whole niche across several terms

{
"queries": ["custom tumbler", "engraved tumbler", "personalized flask"],
"maxItems": 500
}

A listing that shows up under two terms is delivered once, under the first term that found it, and charged once.

Daily new-listing watch for a niche

{
"queries": ["wedding favors", "bridesmaid gifts"],
"maxItems": 300,
"sort": "newest",
"monitorMode": true
}

Save this as a task and schedule it daily (for example 0 8 * * *). The first run sets the baseline; later runs deliver and charge only listings your account has not received before, and the summary's already_delivered counts the ones skipped.

One monitor memory per account. The list of listing IDs that monitorMode remembers is shared by every monitor-mode run of this actor in your Apify account, whatever the search terms. If you watch several niches, put their terms in one run's queries rather than in separate monitor tasks, or a listing delivered to one task is skipped in the other.

Ad share and badge audit

{
"queries": ["water bottle"],
"maxItems": 100,
"sort": "relevance"
}

Group the rows by is_ad and count how many of the top position values are paid placements, then count star_seller, bestseller and etsys_pick among the organic ones. That tells you how hard a niche is to enter without ads.

Discount tracking

{
"queries": ["linen dress"],
"maxItems": 300,
"sort": "top_reviews"
}

Filter on on_sale and sort by discount_percent to see which top rated shops are running markdowns and how deep. Run it weekly to see the pattern.

Input parameters

ParameterTypeDefaultWhat it does
queriesarray of stringsrequired (form prefill: water bottle)Search terms, one per line. Each is searched on its own; repeated terms are removed.
maxItemsinteger (1 to 2,000)50 (form prefill: 60)Most listings to return across all terms.
sortstringrelevancerelevance, price_low, price_high, newest or top_reviews.
minPriceintegernoneLowest price in whole US dollars.
maxPriceintegernoneHighest price in whole US dollars.
monitorModebooleanfalseDeliver and charge only listings this account has not received from this actor before. See "One monitor memory per account" above.

"Form prefill" values fill the Console form for you but are not defaults: an API call that leaves maxItems out gets 50.

The run uses 256 MB of memory and a 900 second timeout by default. For runs near 2,000 listings, give the run a longer timeout; if a run reaches its timeout, it stops 15 seconds early and keeps every listing already delivered.

What data do you get?

One row per listing. Fields Etsy does not show for a listing are left out of that row rather than filled with null: a listing that is not on sale has no original_price or discount_percent.

The listing: listing_id, title, listing_url, image, position (its place in the results, counting ads), search_query (the term that found it).

Price: price (the current price as a number), currency (USD), original_price and discount_percent (when Etsy shows a struck through price), on_sale.

The shop: shop_name (without Etsy's "Ad by" prefix), shop_id, shop_rating (the shop's overall star rating from the result card), shop_review_count (Etsy rounds big counts on the card, so 84.5k becomes 84500).

Badges and placement: star_seller, etsys_pick, bestseller, free_shipping, badges (the badge labels as Etsy shows them, such as "Popular now" or "Bestseller"), is_ad.

Run data: scraped_at.

Each run also ends with a _type: "summary" row (terms searched, listings delivered, already_delivered for monitor mode, and per term the pages read, short_pages, listings_not_rendered and Etsy's total_results) and a _type: "info" row. Neither is a listing and neither is ever charged.

Why a page sometimes returns fewer listings

Etsy sends the first dozen listings of a results page with the page itself and loads the rest after it opens in a browser. The proxy this actor uses renders the page, but it often returns before the rest of the grid has loaded. When that happens the actor tries again (twice for page 1, with two copies in parallel), keeps the most complete copy, and moves on to the next page rather than stopping, so you still get the number of listings you asked for. The listings on that page it could not read are counted in listings_not_rendered. In our 29 September run, page 1 came back with 12 of its listings and the other 28 were filled from page 2. If the very top results matter to you, look at position and the summary.

Stable fields for automations

These 20 fields were present in every listing row we sampled (52 listings from five runs of the current build, 29 September to 2 October 2026):

FieldWhat it holds
listing_idEtsy's listing ID; the key for deduplication and monitor mode
titleListing title
priceCurrent price, a number
currencyCurrency code (USD)
on_saletrue when Etsy shows a struck through price
shop_nameShop name
shop_idEtsy's shop ID
shop_ratingShop star rating, such as 4.9
shop_review_countShop review count as a number
star_sellerStar Seller badge
free_shippingFree shipping badge
etsys_pickEtsy's Pick badge
bestsellerBestseller badge
badgesBadge labels as shown, possibly empty
is_adtrue for an Etsy Ads placement
imageListing image URL
listing_urlClean listing link
positionPlace in the results
search_queryThe term that found it
scraped_atISO timestamp when the row was captured

We will not rename these fields. New fields may be added over time; existing ones keep their names.

Output examples

Real rows from our run of the live build on 29 September 2026 (water bottle, titles trimmed).

A Bestseller from a Star Seller shop, not an ad, with a discount:

{
"listing_id": "964810525",
"title": "Engraved Water Bottles With Straw, Personalized Insulated Water Bottle, Name Water Bottle…",
"price": 11.7,
"currency": "USD",
"original_price": 13,
"discount_percent": 10,
"on_sale": true,
"shop_name": "FlowertownWeddings",
"shop_id": "12966850",
"shop_rating": 4.9,
"shop_review_count": 70800,
"star_seller": true,
"free_shipping": false,
"etsys_pick": false,
"bestseller": true,
"badges": ["Bestseller"],
"is_ad": false,
"image": "https://i.etsystatic.com/12966850/r/il/a0ab32/2879745940/il_372x296.2879745940_e6mb.jpg",
"listing_url": "https://www.etsy.com/listing/964810525",
"position": 7,
"search_query": "water bottle",
"scraped_at": "2026-09-29T09:23:09.026Z"
}

An Etsy's Pick from page 2, discounted 30 percent:

{
"listing_id": "4311161097",
"title": "Personalized Sport Water Bottle,Engraved Name Water Bottle,Insulated Water Bottle…",
"price": 9.74,
"currency": "USD",
"original_price": 13.91,
"discount_percent": 30,
"on_sale": true,
"shop_name": "TokoIda",
"shop_id": "57918472",
"shop_rating": 4.7,
"shop_review_count": 139,
"star_seller": true,
"free_shipping": false,
"etsys_pick": true,
"bestseller": false,
"badges": ["Etsy’s Pick"],
"is_ad": false,
"image": "https://i.etsystatic.com/57918472/r/il/9f7016/7295989490/il_372x296.7295989490_4hp4.jpg",
"listing_url": "https://www.etsy.com/listing/4311161097",
"position": 53,
"search_query": "water bottle",
"scraped_at": "2026-09-29T09:24:00.324Z"
}

A paid placement with free shipping and no discount (so no original_price or discount_percent):

{
"listing_id": "1655823329",
"title": "64 oz Glass Water Bottle with Straw, Leakproof Silicone Sleeve, Time Markers",
"price": 39.99,
"currency": "USD",
"on_sale": false,
"shop_name": "MIGHTYVESSEL",
"shop_id": "49558520",
"shop_rating": 4.9,
"shop_review_count": 46,
"star_seller": true,
"free_shipping": true,
"etsys_pick": false,
"bestseller": false,
"badges": ["Free shipping"],
"is_ad": true,
"image": "https://i.etsystatic.com/49558520/r/il/ed6a75/8064349415/il_372x296.8064349415_9qcf.jpg",
"listing_url": "https://www.etsy.com/listing/1655823329",
"position": 52,
"search_query": "water bottle",
"scraped_at": "2026-09-29T09:24:00.226Z"
}

The summary row from the same run (never charged). Page 1 came back short, and Etsy reported 918,017 results for the term:

{
"_type": "summary",
"queries": "water bottle",
"delivered": 40,
"already_delivered": 0,
"per_query": {
"water bottle": {
"delivered": 40,
"pages": 2,
"short_pages": 1,
"listings_not_rendered": 28,
"total_results": 918017
}
},
"requests": 6,
"scraped_at": "2026-09-29T09:24:05.054Z"
}

Pricing

Pay per event: one flat price per listing delivered, the same on every Apify plan, plus a small start fee per run.

EventFreeBronzeSilverGold and above
listing-scraped, per listing$0.0015$0.0015$0.0015$0.0015
listing-scraped, per 1,000 listings$1.50$1.50$1.50$1.50
apify-actor-start, per run$0.005 per GB of run memory, minimum one eventsamesamesame

The start fee, exactly. Apify's apify-actor-start event is charged once when a run starts, at $0.005 for each GB of memory the run uses, with a minimum of one event. This actor runs on 256 MB by default, so a default run pays the minimum, $0.005.

Worked examples: 100 listings cost $0.15 plus $0.005. 500 listings cost $0.75 plus $0.005. A full 2,000 listing run costs $3.00 plus $0.005. Our 29 September proof run (40 listings) cost $0.06 plus $0.005.

Never charged: a listing found under a second term in the same run (charged once), listings skipped by monitor mode because you already received them, listings on a page that did not render, failed or blocked page loads, and the summary and info rows. A search that finds nothing pays only the start fee. Proxy traffic is included in the price.

There is no scheduled price change for this actor. The Pricing tab on this page always shows the rate for your own plan; if it and this table ever differ, the Pricing tab is right.

FAQ

What is Etsy? Etsy is a large online marketplace for handmade, vintage and custom goods, with millions of independent shops. Its search results show each listing's price, the shop's rating and a set of badges, which is what this actor collects.

How many listings can I get? Up to 2,000 per run across all your search terms, and up to 25 result pages per term. A term ends early when Etsy runs out of results or when two pages in a row bring nothing new. For more, split the work into several runs by term, price band or sort order.

Why did I get fewer listings on page 1 than Etsy shows? See "Why a page sometimes returns fewer listings" above: Etsy loads most of each page after it opens, and the proxy often returns the page before that. The actor retries, keeps the fullest copy and fills your total from the next pages. The summary row tells you how many listings could not be read.

Is the rating the listing's or the shop's? The shop's. Etsy's search cards show the shop's overall star rating and review count next to the shop name, so shop_rating and shop_review_count describe the shop, not the single listing.

Which country and currency are the results for? The United States, in US dollars. Every request leaves through a US exit so that titles and prices are not translated or converted. Only if every US attempt for a page fails does the actor try an exit in another country.

How fresh is the data? Every run reads Etsy live; nothing is cached between runs. scraped_at records when each row was captured.

Do I need an Etsy account, cookies or an API key? No. You need only an Apify account. Everything comes from Etsy's public search pages.

Which proxy does it use? Apify's Web Unblocker proxy, chosen by the actor, with a US exit. Etsy answers plain datacenter requests with a short block page, so a stronger proxy is needed. There is nothing to configure, and the proxy cost is included in the price per listing.

Are sponsored listings included? Yes, they are part of what shoppers see, and each one has is_ad: true so you can filter them out or count them.

Can I run it on a schedule and get only new listings? Yes. Save your input as a task, add a schedule in Apify Console (Schedules, then Create new, then a time or a cron expression such as 0 8 * * *), and set monitorMode: true. Each run then delivers and charges only listings your account has not received from this actor before. The memory is shared by all monitor-mode runs of this actor in your account.

How do I export the data? From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. Remove rows that have a _type field if you want listings only.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/etsy-search-scraper.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http etsy-search-scraper "https://mcp.apify.com/?tools=themineworks/etsy-search-scraper".

Is it legal to scrape Etsy? The actor collects only public search results that anyone can see without logging in: listings, prices, public shop names and ratings. It collects no buyer data and no contact details. You are responsible for how you use the data, including Etsy's terms and data protection laws such as GDPR and CCPA. This is general information, not legal advice.

Integrations

  • Google Sheets: export a run straight to a sheet, or use Apify's Google Sheets integration to append new listings after each scheduled run.
  • Make, Zapier and n8n: use the Apify app or node to start a run and send new listings to Slack, email or a product research database.
  • Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
  • API and client libraries: start runs and read datasets from Python, JavaScript or any HTTP client. The "Copy to your AI assistant" block above has the exact call.
  • MCP clients: Claude, ChatGPT, Cursor, VS Code and other MCP clients can call the actor through https://mcp.apify.com.

More from The Mine Works

E-commerce and marketplaces

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a bug or need a field we do not return yet? Open an issue on the Issues tab of this page and we will reply there. To ask for a new marketplace or data source, email dmineworks@gmail.com.

Etsy Listings Scraper turns Etsy searches into clean rows with prices, discounts, shop ratings, badges and ad flags, at one flat price per listing.