Scrape Etsy search results into listing rows

2026-10-02

Disclosure: I publish and maintain the Actor this tutorial uses (publicrecords/etsy-search-scraper on Apify).

You have a search query — a niche keyword, a product type, a competitor phrase — and you need structured listing rows (title, price, shop, badges), not a screenshot of page one. Opening tabs by hand does not leave a dataset you can filter, score, or join to a shop tracker.

The method

  1. Run on Apify residential proxy (default). Search HTML is challenged often; plain datacenter egress from Apify cloud commonly fails. The Actor defaults to Apify Proxy RESIDENTIAL (billed by Apify as proxy usage — no markup on our PPE). You can also plug in your own residential proxy. If every page is challenged, the Actor exits blocked_on_your_proxy and charges no listing rows for those pages.
  2. Parse listing cards into one row per listing. Fields include listing_id, url, title, price, currency, shop_name / shop_url, rating / review counts, and badges (bestseller, popular_now, free_shipping, etc.), plus page, position, and query.
  3. Paginate under a hard cap. Set maxPages (and optionally maxItems) so a warm hang cannot run forever. Incomplete cards (missing price/title/shop) are pushed free and never billed.
  4. Bill only delivered complete rows. PPE is actor-start once + listing-row per complete listing. Blocked pages charge nothing. Proxy usage is Apify’s bill, separate from our event prices.
  5. Join to shop velocity when you care about the seller, not only the card. Listing rows give you the shop name; the companion Actor publicrecords/etsy-shop-velocity turns shop names into sales counters and rates (no proxy on that path).

Doing it for real (measured run)

Etsy Search Scraper (publicrecords/etsy-search-scraper) returns one dataset row per listing card from public Etsy search HTML. It works out of the box on Apify residential proxy (passthrough — Apify bills proxy usage to your account; our PPE is only actor-start + listing-row). Or plug in your own residential proxy if you prefer.

Proof run (2026-10-02)

FieldValue
Actorpublicrecords/etsy-search-scraper
Package / buildpackage 0.1.11; Apify buildNumber 0.1.10; buildId 0a3gEUM7nBFBabCvl (candidate); commit 4f902ed7277471c93111468ea476883c91a50bc2
Run IDpRpdAMmfeMHdmuRXA
StatusSUCCEEDED
Runtime52.561 s
DatasetqzksphWvgq6TBnFcg (36 items)
RUN_SUMMARYquery ceramic mug: pages=3, rows=36, stopped=max_pages_reached; rows_served=36, pages_fetched=4
Fill (complete rows)price 36/36, shop_name 36/36, title 36/36; missing fields: none
Charged eventsactor-start 1, listing-row 36 (no listing-row-bulk event)
Console pricing (PPE)actor-start $0.005 + listing-row $0.006 each → $0.221 for this 36-row run

Input used (S1 audit input — default Apify RESIDENTIAL passthrough):

{
  "queries": ["ceramic mug"],
  "maxPages": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  },
  "maxItems": 0,
  "is_best_seller": false,
  "is_star_seller": false,
  "free_shipping": false,
  "is_discounted": false,
  "instant_download": false
}

Output rows (abbreviated; first three of 36 from the dataset — no invented fields):

[
  {
    "listing_id": "4296141840",
    "url": "https://www.etsy.com/listing/4296141840/coffee-mug-kj-pottery",
    "title": "Coffee Mug - KJ Pottery",
    "price": 57,
    "currency": "$",
    "shop_id": "7825028",
    "shop_name": "KJPottery",
    "shop_url": "https://www.etsy.com/shop/KJPottery",
    "rating_value": 4.9,
    "review_count": 3500,
    "review_count_approx": true,
    "bestseller": true,
    "popular_now": false,
    "star_seller": false,
    "etsys_pick": false,
    "free_shipping": true,
    "is_ad": null,
    "position": 1,
    "surface": "neu",
    "page": 1,
    "query": "ceramic mug"
  },
  {
    "listing_id": "837615700",
    "url": "https://www.etsy.com/listing/837615700/handmade-ceramic-coffee-mug-large",
    "title": "Handmade Ceramic Coffee Mug: Porcelain Espresso Cup",
    "price": 35.5,
    "currency": "$",
    "shop_id": "18265806",
    "shop_name": "BZceramics",
    "shop_url": "https://www.etsy.com/shop/BZceramics",
    "rating_value": 4.9,
    "review_count": 1600,
    "review_count_approx": true,
    "bestseller": false,
    "popular_now": true,
    "star_seller": false,
    "etsys_pick": false,
    "free_shipping": false,
    "is_ad": null,
    "position": 2,
    "surface": "neu",
    "page": 1,
    "query": "ceramic mug"
  },
  {
    "listing_id": "1371848548",
    "url": "https://www.etsy.com/listing/1371848548/handmade-ceramic-mug-large-size",
    "title": "Handmade Ceramic Mug - Large Size",
    "price": 35,
    "currency": "$",
    "shop_id": "5855415",
    "shop_name": "Neherpottery",
    "shop_url": "https://www.etsy.com/shop/Neherpottery",
    "rating_value": 5,
    "review_count": 3800,
    "review_count_approx": true,
    "bestseller": true,
    "popular_now": false,
    "star_seller": false,
    "etsys_pick": false,
    "free_shipping": true,
    "is_ad": null,
    "position": 3,
    "surface": "neu",
    "page": 1,
    "query": "ceramic mug"
  }
]

When a page is challenged (measured)

An earlier attempt with the same input (9RfVZjBbBvCvbs8JX) ended after ~620 s with blocked_on_your_proxy — every page challenged on that proxy path, so zero listing-row charges. Retry on Apify RESIDENTIAL US (pRpdAMmfeMHdmuRXA) succeeded in ~53 s with 36 complete rows. Occasional challenges and a retry are normal; prefer the default RESIDENTIAL group, and you only pay listing-row for rows actually delivered.

Cost math you can recompute

Prices are Console PPE as of the audit read on 2026-10-02 (actor-start $0.005, listing-row $0.006 only — no listing-row-bulk, no proxy markup). Quote Console if they change. Apify residential proxy usage is billed separately by Apify.

Store + MCP

Actor (Store): https://apify.com/publicrecords/etsy-search-scraper

MCP for Claude Desktop / Cursor / any MCP client: https://mcp.apify.com/?tools=publicrecords/etsy-search-scraper

Companion (shop counters, no proxy): https://apify.com/publicrecords/etsy-shop-velocity · MCP https://mcp.apify.com/?tools=publicrecords/etsy-shop-velocity

Disclaimer

Etsy® is a trademark of Etsy, Inc. This post and the Actor are not affiliated with, endorsed by, or sponsored by Etsy. Rows come from publicly visible search pages via Apify residential proxy (default) or a proxy you configure. Data is as-is; use it within Etsy’s Terms of Use.

Disclosure (again): published by the maintainer of publicrecords/etsy-search-scraper (Public Records / publicrecords on Apify).

Try Etsy Search Scraper on Apify →