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"
}
}
-
sorttakes one ofrelevance,newest,price_asc,price_desc,top_reviews, the same options as Etsy's own sort menu. -
minPrice/maxPriceare whole currency units. -
maxItemsandmaxPagescap 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
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)