DEV Community

publicrecords
publicrecords

Posted on Originally published at geminigeorge22.github.io

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

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, build 0.2.3
Run ID fB8Y28DNUy5kJ9xfg (Store / console origin, 2026-10-03)
Status SUCCEEDED, 10 rows
Cost actor-start $0.005 + 10 × listing-row $0.006 = $0.065

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

  • $6 per 1,000 listing rows, plus a $0.005 start fee per run.
  • 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 daily and 30-day sales counts.

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

Top comments (0)