Etsy Scraper - Extract Product Data, Prices & Reviews avatar

Etsy Scraper - Extract Product Data, Prices & Reviews

Pricing

from $2.60 / 1,000 results

Go to Apify Store
Etsy Scraper - Extract Product Data, Prices & Reviews

Etsy Scraper - Extract Product Data, Prices & Reviews

Scrape Etsy product listings by category, collection, or search. Get price, rating, reviews, shop & stock data, export to CSV/JSON or push to Notion, Slack.

Pricing

from $2.60 / 1,000 results

Rating

0.0

(0)

Developer

Techforce Global

Techforce Global

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

Etsy Product Scraper & MCP Connector

Pull every product listing off any Etsy category page, curated collection, or search results page — title, price, rating, reviews, shop name, image, and stock/shipping status — with no coding and no Etsy account required.

Built for anyone tracking competitor pricing, monitoring a niche, sourcing product data for dropshipping, or feeding a price-comparison tool or BI dashboard.

Paste an Etsy listing-grid URL → get every product on it, paginated → deliver it straight into Notion, Slack, Airtable, or your own tools.


⭐ Why This Actor?

  • Just paste an Etsy URL — category page, curated collection, or search results page. No API key, no login, no keyword-to-URL guesswork.
  • Three ways in, one grid parser — Start URLs, Search result URLs, or Category URLs all take full URLs copied straight from your browser and are scraped the same way.
  • Auto-paginates — follows the page query parameter across as many result pages as you allow, per start URL.
  • Never guesses at hidden APIs — Etsy has no public product-search API; this Actor reads the same listing grid a shopper sees and extracts every card on it.
  • Complete product cards — price, original price and discount %, star rating, review count, free-shipping flag, low-stock warnings, and the primary image.
  • Anti-bot resilient — runs through Apify Proxy (residential group by default) with a browser-impersonating HTTP client, because Etsy blocks datacenter IPs within milliseconds.
  • Deliver anywhere via MCP connectors — push scraped products straight into Notion, Slack, Airtable, Google Sheets, and more.
  • Export-ready — JSON, CSV, Excel, or HTML, or consume the dataset directly via the Apify API.

📝 Use Cases & ROI

Use CaseTime SavedWhat You Get
Competitor price monitoring2–5 hrs/categoryEvery competitor listing's price, discount, and stock status in one table
Niche & trend research3–6 hrs/nicheA full snapshot of what's selling, at what price, and how well-reviewed it is
Sourcing / dropshipping leads4–8 hrs/searchShop names, prices, and ratings across hundreds of candidate products
Price-comparison toolsOngoingStructured JSON/CSV feed ready to plug into your own comparison engine
BI dashboards & reporting2–4 hrs/refreshClean tabular data ready for Sheets, a warehouse, or a BI tool

🚀 How to Use

  1. Open the Actor on Apify.
  2. Paste one or more Etsy listing-grid URLs into any (or all) of:
    • Start URLs — a category, curated collection, or search results page.
    • Search result URLs — an Etsy /search?q=... results page.
    • Category URLs — an Etsy /c/... category-browse page. At least one of the three must be filled in — all three take full URLs, not keywords or category paths.
  3. (Optional) Set Max products (default 100, 0 = unlimited) and Max pages per start URL (default 3).
  4. (Optional) Tune Max concurrency for speed (default 5 — keep it low to avoid rate limits).
  5. (Optional) Pick an MCP connector to deliver each scraped product into Notion, Slack, Airtable, etc.
  6. Click Start — results stream into the dataset as each page is parsed.
  7. Download from the Dataset tab as JSON, CSV, Excel, or HTML — or let the connector push them into your tools automatically.

🌐 Proxy: requests run through Apify Proxy (residential group by default) because Etsy blocks datacenter IPs almost instantly (HTTP 403 within milliseconds). Don't switch this off. 💡 First time with a connector? Run once with a connector selected and no Connector tool name — the run log prints the connector's available tool names.


🧩 Input Configuration

FieldTypeRequiredDescription
startUrlsArrayOne of the threeEtsy category, curated collection, or search results page URLs. Product/listing pages are not accepted as a starting point.
searchQueriesArrayOne of the threeFull Etsy search-results URLs (e.g. https://www.etsy.com/search?q=statement+necklace) copied directly from your browser — keywords alone are not accepted.
categoriesArrayOne of the threeFull Etsy category-browse URLs (e.g. https://www.etsy.com/c/jewelry/necklaces) copied directly from your browser — category paths alone are not accepted.
maxItemsIntegerOptionalOverall cap on products collected across all URLs. 0 = unlimited. Default: 100.
maxPagesPerStartUrlIntegerOptionalHow many result pages to paginate through per start URL. Curated collection pages may ignore pagination. Default: 3.
maxConcurrencyIntegerOptionalParallel page requests (1–20). Keep low to reduce blocking risk. Default: 5.
proxyConfigurationObjectOptionalApify Proxy settings. Defaults to the RESIDENTIAL group — required for reliable access.
mcpConnectorConnectorOptionalDeliver each scraped product into a connector you've authorized (Notion, Slack, Airtable, Google Sheets, or any MCP-compatible connector).
deliveryModeEnumOptionalperItem (one call per product), batch (group several products per call), summary (one call at the end listing everything scraped), or none. Default: none.
mcpToolStringOptionalTool to call on the connector (e.g. create-pages for Notion).
mcpArgumentsObjectOptionalFixed, top-level arguments for the call — everything except the products themselves. String values support {placeholders}.
mcpItemTemplateObjectOptionalShape of one product entry, rendered once per product and collected into mcpArrayField.
mcpArrayFieldStringOptionalKey inside mcpArguments that receives the array of rendered product entries. Default: pages.
mcpBatchSizeIntegerOptionalOnly used in batch mode: how many products go into one call. Default: 10.
mcpMessageTemplateStringOptionalOptional template rendered per product/run, exposed as the {message} placeholder.

Example — Scrape a curated collection

{
"startUrls": [{ "url": "https://www.etsy.com/in-en/r/curated/statement-jewelry?sections=1483190913703" }],
"maxItems": 100,
"maxPagesPerStartUrl": 3
}

Example — Scrape a search page and a category page together

{
"searchQueries": ["https://www.etsy.com/search?q=statement+necklace"],
"categories": ["https://www.etsy.com/c/jewelry/necklaces"],
"maxItems": 200,
"maxPagesPerStartUrl": 5,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Example — Scrape and create a Notion page per product

{
"startUrls": [{ "url": "https://www.etsy.com/in-en/r/curated/statement-jewelry" }],
"mcpConnector": "<your-notion-connector>",
"deliveryMode": "perItem",
"mcpTool": "create-pages",
"mcpArguments": {
"parent": { "page_id": "3a0e5ea6-3f43-8060-8fce-fe7061855e75" }
},
"mcpItemTemplate": {
"properties": { "title": "{title} — {shopName}" },
"content": "Price: {currency} {price}\nRating: {rating} ({reviewsCount} reviews)\n{url}"
},
"mcpArrayField": "pages"
}

Example — Scrape and post batched updates to Slack

{
"categories": ["https://www.etsy.com/c/jewelry/necklaces"],
"maxItems": 50,
"mcpConnector": "<your-slack-connector>",
"deliveryMode": "batch",
"mcpBatchSize": 10,
"mcpTool": "send_message",
"mcpArguments": { "channel": "#etsy-deals", "text": "{message}" },
"mcpMessageTemplate": "New batch of {reviewsCount} products scraped"
}

Placeholders available in mcpArguments / mcpItemTemplate / mcpMessageTemplate

{listingId} · {title} · {shopName} · {price} · {currency} · {originalPrice} · {discountPercent} · {rating} · {reviewsCount} · {freeShipping} · {stockWarning} · {imageUrl} · {url} · {message} Summary mode adds: {totalPushed} · {summaryText}


📦 Output Fields

Each scraped product is stored as one dataset item:

FieldDescription
listingIdEtsy's numeric listing ID
titleProduct title
urlCanonical listing URL (tracking parameters stripped)
shopNameName of the Etsy shop selling the item
price / currencyCurrent price and its currency
originalPrice / discountPercentPre-sale price and discount %, if the item is on sale
rating / reviewsCountStar rating and number of reviews
freeShippingWhether free delivery is advertised on the card
sponsoredWhether the card is marked as an Etsy ad
stockWarningLow-stock message (e.g. "Only 2 left"), if shown
imageUrlPrimary product image URL
scrapedAtUTC timestamp the item was scraped

Example Output

{
"listingId": "1850339988",
"title": "Gaia Bead Necklace",
"url": "https://www.etsy.com/in-en/listing/1850339988/gaia-bead-necklace",
"shopName": "GemBlue",
"price": 7854.0,
"currency": "INR",
"originalPrice": null,
"discountPercent": null,
"rating": 4.9,
"reviewsCount": 2500,
"freeShipping": false,
"sponsored": false,
"stockWarning": null,
"imageUrl": "https://i.etsystatic.com/.../il_794xN.jpg",
"scrapedAt": "2026-07-17T00:00:00+00:00"
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.


🔌 Integrations & Delivery

Deliver scraped products into any MCP connector you've authorized in Apify — no glue code, no webhooks:

  • Notion — create a page per product (or batch several into fewer calls)
  • Slack / Discord — post new listings or price drops to a channel
  • Airtable / Google Sheets — append a structured row per product
  • …or any other MCP-compatible connector

Credentials stay private — delivery runs through the Apify MCP Proxy, so the Actor never sees your connector tokens. This is configured entirely from the Delivery (optional) section of the Input tab and never affects what's saved to the dataset. You can also consume the dataset directly via the Apify API, or wire it into n8n, Zapier, and Make.

⚙️ Delivery modes: perItem sends one call per product as it's found, batch groups several products into one call (see Batch size), summary sends a single call at the end listing everything scraped, and none saves to the dataset only.


🛠️ How It Works

my_actor/main.py reads the input, merges Start/Search/Category URLs into one list of listing-grid pages, and configures the crawler:

  1. crawlee's BeautifulSoupCrawler fetches each URL through a Firefox-impersonating HTTP client (ImpitHttpClient) over Apify's residential proxy group, since Etsy blocks plain datacenter clients almost instantly.
  2. my_actor/routes.py's default handler parses every a[href*="/listing/"] card on the page — title, price, rating, shop, image, stock/shipping — and pushes each as one dataset item.
  3. If more pages remain (up to Max pages per start URL), it builds the next page's URL and re-queues it.
  4. If an MCP connector is configured, each pushed product is also routed to perItem, batch, or summary delivery via my_actor/connector.py, which opens a session through the Apify MCP Proxy and calls your chosen tool.

Built with: Apify SDK for Python · Crawlee for Python · BeautifulSoup · MCP


🆘 Support

For issues, custom scraping requests, or feature suggestions:

Email: bhavin.shah@techforceglobal.com


Need a Custom Pipeline?

Want other marketplaces, scheduled monitoring, deeper enrichment, or a full data-warehouse integration?

📅 Book a Free 15-min Consultation


Made with ❤️ by Techforce Specialists in High-Performance Web Scrapers and AI Automation.


Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Etsy, Inc. Etsy® is a trademark of Etsy, Inc.; all trademarks are property of their respective owners. The Actor only reads publicly visible pages on Etsy — it does not log in, bypass paywalls, or access private data. Scraping is subject to Etsy's Terms of Service; please review them and use this tool responsibly, particularly around request rate and personal-data handling. Etsy's page layout and anti-bot measures can change at any time, which may temporarily affect field extraction or require proxy adjustments.