DEV Community

publicrecords
publicrecords

Posted on Edited on Originally published at geminigeorge22.github.io

Scrape Etsy search results sorted by price: 10 rows for $0.04

Disclosure: I publish and maintain the Actor used here (publicrecords/etsy-search-scraper on Apify Store). This is the publisher account.

You have an Etsy search query and you want the results as rows you can sort and filter, not a screenshot of page one. Here's the shortest route I know, with a real run as proof.

What you get

Each Etsy search result comes back as one row with listing_id, title, price, currency, shop_name, shop_url, rating_value, review_count, badges (bestseller, star_seller, etsys_pick, popular_now, free_shipping), position and page. You can pass a keyword, a market, or a category URL.

The input (copy this)

This is the exact input from a Store-page run on 2026-10-03: the 10 cheapest "ceramic mug" listings priced $10–$40.

{
  "queries": ["ceramic mug"],
  "sort": "price_asc",
  "minPrice": 10,
  "maxPrice": 40,
  "maxItems": 10,
  "maxPages": 1,
  "fillLazyCards": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
Enter fullscreen mode Exit fullscreen mode
  • sort takes one of relevance, newest, price_asc, price_desc, top_reviews, the same options as Etsy's own sort menu.
  • minPrice / maxPrice are whole currency units.
  • maxItems and maxPages cap the run (Etsy itself stops at 20 pages).

Run it

In the browser: open the Actor in Apify Console, switch the input to JSON, paste the block above, and press Start.

From a terminal: save the block as input.json and run:

curl -s -X POST \
  "https://api.apify.com/v2/acts/publicrecords~etsy-search-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d @input.json > rows.json
Enter fullscreen mode Exit fullscreen mode

Or clone the one-command example repo, which has the same input.json and the full sample output: GeminiGeorge22/etsy-search-example.

Proof run

Field Value
Actor publicrecords/etsy-search-scraper
Run Started from the Store page, 2026-10-03
Status SUCCEEDED, 10 rows
Cost (current price) actor-start $0.00005 + 10 × listing-row $0.004 = $0.04005 (about $0.04), free plan, as of Oct 27, 2026 — pricing

The first 3 of the 10 rows:

# Title Price Shop Rating Reviews
1 1980's Christmas Coffee Mug $10 TheNostalgiaHunter 4.9 ~2,200*
2 Daisy a Day Coffee Mug, 11oz Ceramic Mug $10 SmugMugMugs 5.0 51
3 America 250th Birthday Mug, 1776 Bicentennial Style $10 SouthernRoyaltyUS 5.0 32

*Etsy shows "2.2k", so that row comes back with review_count_approx: true instead of a made-up exact number.

Pricing, plainly

  • $4 per 1,000 listing rows on the free plan (lower on paid plans, down to $3.40), plus a $0.00005 start fee per run — as of Oct 27, 2026; see the Store pricing page.
  • Runs on Apify residential proxy by default. That's passthrough: Apify bills proxy usage, and I add no markup.
  • A blocked page costs nothing. If a row comes back without a price, title or shop, you still get it, flagged incomplete: true, and you aren't charged for it.

Next step: who is selling?

Search rows tell you what ranks. If you also want to know how fast a shop is selling, feed the shop_name values into the companion Actor Etsy Shop Sales Tracker. It returns one row per shop with the public lifetime sales counter and the date it was read. The shop is read a few days apart; sales per day is the average over that gap.

Questions or a query that breaks it? Leave a comment. I maintain both Actors and I read the comments.

Top comments (0)