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, 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)