Etsy Reviews Scraper
Pricing
$19.99/month + usage
Etsy Reviews Scraper
Etsy Reviews Scraper extracts customer reviews from Etsy product listings and shops. Collect reviewer names, ratings, review text, dates, and product details to analyze customer feedback, track sentiment, study competitors, or gather insights for product and market research. 🛍️📊
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
24
Total users
4
Monthly active users
6 days ago
Last modified
Categories
Share
Etsy Reviews Scraper — Ratings, Review Text and Buyer Details
Etsy Reviews Scraper pulls every buyer review from any public Etsy shop — star rating, review text, buyer name and login, review photos, seller responses, and the listing each review is attached to — and returns one flat JSON row per review. Paste a shop URL or plain shop name; no Etsy account or developer key needed. Brand-monitoring teams, Etsy sellers, and market researchers use it to track shop reputation, benchmark competitor ratings, and mine review text for sentiment, across as many shops as one run needs.
What is Etsy Reviews Scraper?
Etsy Reviews Scraper is an Apify Actor that collects every public review posted to one or more Etsy shops and returns them as structured, ready-to-analyze records — no scraping code, no Etsy developer account, no manual copy-pasting from storefront pages.
- 🔗 Discovery by shop, not by search — add Etsy shop URLs (
https://www.etsy.com/shop/ShopName) or plain shop names; the actor scrapes each shop and combines all reviews into one dataset. - 👤 Buyer identity resolved, not just referenced —
buyer_real_name,buyer_login_name,buyer_user_id, andbuyer_imageare extracted and attached to every row. - ⭐ Ratings and feedback text as the core secondary data —
product_rating,review,response(the seller's reply), andappreciation_image(the buyer's uploaded photo, when present). - 📦 Listing context included —
listing_title,product_url,listing_image_full, andlisting_imagestie every review back to the exact product it was left on. - 📊 Shop-level stats on every row —
shop_average_ratingandshop_total_rating_count, so you don't need a second call to know how the shop looks overall. - 📤 Standard Apify dataset export — results land in an Apify Dataset and can be downloaded as JSON, CSV, Excel, XML, or RSS, or read via the API/SDK.
What data can I extract with Etsy Reviews Scraper?
Every review comes back as one flat record — buyer, rating, review text, seller response, and listing context all on the same row.
| Field | Example Value | Use Case |
|---|---|---|
receipt_id | 4934801880 | Ties the review back to Etsy's internal order/receipt |
buyer_user_id | 84577298 | Track the same reviewer across shops, when resolvable |
buyer_real_name | "Therese" | Attribute a quote in a report or case study |
buyer_login_name | "b8ddtlb335qm713s" | The buyer's Etsy username/handle |
buyer_image | "https://i.etsystatic.com/…" | Avatar for a review-wall UI |
listing_title | "Desert Garden Wooden Birthday Card" | Identify which product the review is about |
review | "I ordered two cards and love them both!" | Sentiment analysis, keyword mining |
appreciation_image | null | Buyer-uploaded photo of the received item, or null if none |
product_rating | 5 | Per-review star rating, 1–5 |
response | null | The seller's reply text, or null if unanswered |
reviews_count | 10481 | Shop's total review count at scrape time |
date | "2026-02-08 00:00:00" | Trend ratings/sentiment over time |
shop_average_rating | 4.9 | Shop-wide average rating for benchmarking |
shop_total_rating_count | 10481 | Shop-wide total rating count |
product_url | "https://www.etsy.com/listing/629949817/…" | Link straight back to the reviewed listing |
seller_name | "HereafterLA" | Group and filter reviews by shop |
seller_url | "https://www.etsy.com/shop/HereafterLA" | Link back to the shop's storefront |
listing_image_full | full-resolution photo URL | Full-size listing image for display |
listing_images | array of URLs | The listing's photo at every Etsy CDN size variant |
scrapedAt | "2026-07-30T09:12:00Z" | Freshness check / incremental-load cursor |
Ratings and seller responses
product_rating carries the 1–5 star score, review the free-text feedback, and response the seller's reply — null when the seller hasn't answered. A buyer can also attach a photo of the item they received, captured in appreciation_image (null if they didn't upload one). A common workflow: filter rows where product_rating is 1 or 2 and response is null to surface negative reviews a shop hasn't followed up on yet — the exact rows a seller or agency would want to escalate first.
Shop and listing identifiers
seller_name/seller_url identify which shop a row belongs to when startUrls contains several shops in one run, and listing_title/product_url identify which product the review was left on. date lets you sort or bucket reviews by time. There's no built-in category, price, or location field — Etsy shop reviews don't carry them — so segmentation happens on these identifying fields plus product_rating and date after export.
How does Etsy Reviews Scraper differ from the official Etsy API?
Etsy's Open API v3 does expose a reviews endpoint (GET /application/shops/{shop_id}/reviews, per Etsy's official API reference, checked 2026-07-30), but it needs a numeric shop_id — not the shop's URL or name — and returns bare TransactionReview records: shopId, listingId, buyerUserId, rating, review, and imageUrlFullxfull as raw IDs and text, with no buyer name, no buyer avatar, no listing title or image, and no shop-wide rating stats.
| Feature | Etsy Open API v3 | Etsy Reviews Scraper |
|---|---|---|
| Setup | Register a developer app, obtain an API key | Paste a shop URL or name |
| Shop identification | Numeric shop_id (needs a separate lookup call to resolve) | Shop URL or plain shop name |
| Buyer identity | buyerUserId only, a numeric reference | buyer_real_name, buyer_login_name, buyer_user_id, buyer_image resolved on every row |
| Listing context | listingId only, a numeric reference | listing_title, product_url, listing_image_full, listing_images resolved on every row |
| Seller response text | Not part of the TransactionReview schema | response field carries the seller's reply |
| Shop-wide rating stats | Not returned by the reviews endpoint | shop_average_rating, shop_total_rating_count on every row |
| Pagination | limit/offset, 25 results per call by default | maxReviewsPerShop up to 5,000; the actor paginates automatically |
| Rate limits | Per-app queries-per-day/queries-per-second, set in Etsy's Developer Portal | Handled by the actor's own retry and proxy logic |
Why does Etsy's API return only numeric IDs for the buyer and listing?
Etsy's TransactionReview schema (per the official Open API v3 reference, checked 2026-07-30) exposes shopId, listingId, and buyerUserId as bare numeric references, not resolved names, avatars, or listing photos. Pulling that same context — who wrote the review and what product it was about — means chaining a separate getListing call and a user lookup per review, on top of first resolving the shop's numeric ID from its URL or name. At the scale of dozens of shops that multiplies quickly. Etsy Reviews Scraper covers the gap by resolving buyer_real_name, buyer_login_name, buyer_image, listing_title, listing_image_full, and product_url directly from the shop's storefront pages, so every row already carries them.
Use Etsy's official API when you already have a developer account and just need the raw review record to slot into your own app's existing user/listing tables. Use Etsy Reviews Scraper when you want rows that already carry buyer and listing context, without registering a developer app first.
How to use data extracted from Etsy?
Etsy sellers and brand teams
Point startUrls at your own shop (or a competitor's) and pull every review with product_rating and response. Filter for low ratings with a null response to find unanswered negative feedback that needs a reply, or track shop_average_rating over successive runs to see whether recent changes moved the needle.
Agencies and reputation-management services
Run the same startUrls list across a portfolio of client shops on a recurring Apify schedule, and diff shop_average_rating/shop_total_rating_count run over run to flag any client whose rating is sliding, or to benchmark a client against named competitor shops in the same report.
Market research and intelligence
Add a basket of shops in one category to startUrls and aggregate product_rating and review text across listing_titles to see which product types or phrasing patterns draw the strongest (or weakest) buyer feedback — useful groundwork before entering a new product category.
AI agents and automated pipelines
Feed the review field into a sentiment-classification or summarization pipeline, or index it for RAG so a customer-support or seller-assistant agent can answer questions like "what do buyers say about shipping speed" using real review text tied back to listing_title and date.
🔼 Input sample
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | YES | array | Etsy shop URLs (e.g. https://www.etsy.com/shop/ShopName) or plain shop names. Add multiple shops — the actor scrapes each one and combines all reviews into a single dataset. | ["https://www.etsy.com/shop/HereafterLA"] |
maxReviewsPerShop | no | integer | Maximum number of reviews to fetch per shop (1–5000). The actor paginates through review pages until this limit or until no more reviews are available. Default is 100. | 100 |
maxRetries | no | integer | How many times to retry a single request before moving on (e.g. after a network error or a temporary block). Default is 3. Min 0, max 20. | 3 |
retryDelaySeconds | no | integer | Base delay in seconds between retries; the delay increases with each attempt. Default is 5. Min 1, max 120. | 5 |
proxyConfiguration | no | object | Proxy used to fetch shop pages and reviews. Defaults to Apify's residential proxy group, which gives the most reliable results against Etsy's anti-bot protections. You can pick a different proxy group or disable proxy entirely, but non-residential or no-proxy setups are more likely to get blocked. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
{"startUrls": ["https://www.etsy.com/shop/HereafterLA","AnotherEtsyShop"],"maxReviewsPerShop": 200,"maxRetries": 3,"retryDelaySeconds": 5,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
⚠️ Common pitfall: startUrls needs the shop's URL (containing /shop/ShopName) or its URL slug — not a listing URL, a category-tab URL, or the shop's human-readable display name shown at the top of the page, which can differ from the slug in the address bar. Pasting the wrong one means the actor either finds no reviews or scrapes the wrong shop.
🔽 Output sample
Every review lands as one flat record in the Apify Dataset — typed fields, no nested objects to unpack, except listing_images, which is a plain array of that listing's photo URLs. Export it as JSON, CSV, Excel, XML, or RSS straight from the Console, or pull it via the API/SDK.
{"receipt_id": 4934801880,"buyer_user_id": 84577298,"buyer_real_name": "Therese","buyer_login_name": "b8ddtlb335qm713s","buyer_image": "https://i.etsystatic.com/site-assets/images/avatars/default_avatar.png?width=75","listing_title": "Desert Garden Wooden Birthday Card","review": "I ordered two cards and love them both! Beautiful quality.","appreciation_image": null,"product_rating": 5,"response": null,"reviews_count": 10481,"date": "2026-02-08 00:00:00","shop_average_rating": 4.9,"shop_total_rating_count": 10481,"product_url": "https://www.etsy.com/listing/629949817/desert-garden-wooden-birthday-card","seller_name": "HereafterLA","seller_url": "https://www.etsy.com/shop/HereafterLA","listing_image_full": "https://i.etsystatic.com/12345678/r/il/abcdef/1234567890/il_fullxfull.1234567890_abcd.jpg","listing_images": ["https://i.etsystatic.com/12345678/r/il/abcdef/1234567890/il_570xN.1234567890_abcd.jpg","https://i.etsystatic.com/12345678/r/il/abcdef/1234567890/il_680x540.1234567890_abcd.jpg"],"scrapedAt": "2026-07-30T09:12:00Z"}
Each pushed review is one charged row_result event — you pay per review returned, not per shop or per run.
How do you filter and target specific reviews?
Etsy Reviews Scraper has one real targeting control besides which shops you pick: maxReviewsPerShop caps how deep the actor paginates into each shop's review history (1–5000, default 100), and it stops earlier if the shop simply has fewer reviews than that. There's no built-in rating, date-range, or keyword filter in the input — those apply after export by filtering the dataset on product_rating, date, or review text. What you do control precisely is scope: add exactly the shops you need to startUrls (one, or dozens in the same run) and set maxReviewsPerShop low for a quick reputation snapshot or high (up to 5,000) for a full historical pull.
▶️ Want to try other Etsy scrapers?
| Scraper Name | What it extracts |
|---|---|
| eBay Search Scraper | eBay search results with buyer reviews and ratings |
| eBay Product Details Scraper | eBay product details, sold price, and deal analytics |
| Shein Search Products Scraper | Shein products by category, store, and product URL |
How to extract Etsy data programmatically
Etsy Reviews Scraper runs like any Apify Actor: one API call starts the run, and the results come back as structured JSON from the Apify Dataset — no scraping code of your own to maintain.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<store-username>/etsy-reviews-scraper").call(run_input={"startUrls": ["https://www.etsy.com/shop/HereafterLA"],"maxReviewsPerShop": 200,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["seller_name"], item["product_rating"], item["review"])
Export to spreadsheets or CRM
Every dataset supports a one-click CSV export from the Console (or apify_client's .dataset().download_items()), so seller_name, product_rating, review, response, and date drop straight into columns for a spreadsheet or a CRM import — no reshaping needed.
Is it legal to scrape Etsy?
Yes — Etsy Reviews Scraper only collects reviews already displayed publicly on a shop's storefront page, information Etsy shows to any visitor without login. Because that output includes personal data about real individuals — buyer_real_name, buyer_login_name, buyer_user_id, and buyer_image — GDPR and CCPA considerations apply to how you store and use it, not just Etsy's own Terms of Use. Scraping public pages is generally permissible, but storing personal data at scale requires a lawful basis and reasonable safeguards (retention limits, access controls, honoring deletion requests). Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
What happens if a listing referenced in a review is no longer for sale?
The actor returns whatever listing_title, product_url, and listing_image_full were shown next to the review at scrape time — it doesn't verify that the listing is still active, so product_url can lead to a delisted or renamed page later.
Can I get the seller's response along with the review?
Yes — response carries the seller's reply text on every row, and is null when the seller hasn't answered. There's no separate call or extra input needed to include it.
How accurate is the buyer identity data?
buyer_real_name and buyer_login_name come straight from the reviewer's own Etsy profile link, so they're accurate as displayed. buyer_user_id is resolved on a best-effort basis (from Etsy's own page data, the reviewer's profile link, or their avatar URL) and can be null when none of those expose it for a given review.
How many reviews can I get per run?
Up to maxReviewsPerShop (1–5000, default 100) per shop listed in startUrls, and the actor stops earlier per shop once it has collected however many reviews that shop actually has. Add more shops to startUrls to scale total volume in one run.
Can I scrape reviews for more than one Etsy shop in a single run?
Yes — startUrls accepts any number of shop URLs or names, and every review from every shop lands in the same dataset, with seller_name/seller_url identifying which shop each row came from.
How does Etsy Reviews Scraper compare to pulling reviews via Etsy's own API?
Etsy's Open API v3 reviews endpoint returns raw numeric IDs (buyerUserId, listingId) and requires a registered developer app plus a numeric shop ID; Etsy Reviews Scraper needs only a shop URL or name and returns buyer and listing details already resolved into the row. See the full comparison above.
Does Etsy Reviews Scraper work with Claude, ChatGPT, and AI agent frameworks?
There's no dedicated MCP server for this actor. It's callable as a standard Apify Actor run via apify_client or the REST API, so any agent framework that can make an HTTP call or shell out to the Apify CLI can trigger a run and read back the resulting JSON.
Can I use Etsy Reviews Scraper without an Etsy API key or developer account?
Yes. You only need an Apify account to run the actor — no Etsy developer registration, API key, or login is required, since it reads the same public storefront pages any shopper can see.
Conclusion
Etsy Reviews Scraper turns any public Etsy shop's review history into flat, structured JSON — buyer identity, star rating, review text, seller response, and listing context on every row, without an Etsy developer account or any scraping code to maintain. It's built for sellers watching their own reputation, agencies benchmarking clients, researchers mining review sentiment, and AI pipelines that need real customer feedback as context. Add your shop URLs to startUrls and run it from the Apify Console to get your first dataset.