# Etsy Reviews Scraper (`piotrv1001/etsy-reviews-scraper`) Actor

Extract Etsy shop reviews with star ratings, review text, dates, buyer names, product links and photos. Collect multiple shops, explore review history and monitor new feedback using known review IDs. Export results to JSON, CSV or Excel.

- **URL**: https://apify.com/piotrv1001/etsy-reviews-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** E-commerce
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 shop reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Etsy Reviews Scraper

Collect **Etsy shop reviews** with star ratings, review text, dates, buyer names, product links and review photos. Compare customer feedback across shops, research product complaints and monitor new reviews without manually paging through storefronts.

#### Features

- Shop names, storefront URLs and shop-review URLs as input.
- Automatic review pagination with one dataset row per unique review.
- Ratings, displayed dates, buyer context, reviewed products and available photos.
- Multiple shops with total and per-shop result limits.
- Known review IDs for incremental monitoring.
- Resume support that deduplicates records already saved in the same run.

### How to use

1. Enter Etsy shop names or URLs, such as `HereafterLA` or `https://www.etsy.com/shop/HereafterLA`.
2. Set the maximum number of reviews and start the Actor.
3. Download results as JSON, CSV, Excel or another supported Apify dataset format.

Use Apify schedules for recurring collection and the API, webhooks or integrations to deliver reviews to your workflow.

```json
{
  "shopUrls": ["https://www.etsy.com/shop/HereafterLA"],
  "maxItems": 50
}
```

This Actor collects reviews across a shop’s products. Product listing URLs and product-specific review collection are not supported.

### Input

| Field               | Default      | Description                                                  |
| ------------------- | ------------ | ------------------------------------------------------------ |
| `shopUrls`          | Example shop | One or more Etsy shop names, storefront URLs or review URLs. |
| `maxItems`          | `50`         | Maximum total number of reviews to save.                     |
| `maxReviewsPerShop` | `1000`       | Maximum saved reviews from each shop.                        |
| `stopAtReviewIds`   | `[]`         | Stop each shop before a matching known review ID.            |

Shops are processed in input order. Set `maxReviewsPerShop` to spread the total limit across shops; otherwise an earlier shop may use the entire limit. Repeated shop URLs are deduplicated, including differences in letter case.

### Output

Each row represents one review. The following example illustrates the output shape:

```json
{
  "reviewId": "5126002929",
  "shopName": "HereafterLA",
  "shopUrl": "https://www.etsy.com/shop/HereafterLA",
  "rating": 5,
  "text": "Great quality and helpful customer service.",
  "dateText": "Sep 17, 2026",
  "buyerName": "Diana",
  "buyerProfileUrl": null,
  "listingId": "771549640",
  "listingTitle": "Wood Father's Day Card",
  "listingUrl": "https://www.etsy.com/listing/771549640",
  "listingImageUrl": null,
  "photos": [],
  "sellerResponse": null,
  "sourceUrl": "https://www.etsy.com/shop/HereafterLA/reviews?page=1",
  "scrapedAt": "2026-09-18T08:00:00.000Z"
}
```

| Fields                                                       | Meaning                                                                      |
| ------------------------------------------------------------ | ---------------------------------------------------------------------------- |
| `reviewId`                                                   | Stable source review identifier, useful for deduplication and monitoring.    |
| `shopName`, `shopUrl`                                        | Shop that received the review.                                               |
| `rating`, `text`                                             | Star rating and available review text. Rating-only reviews have null text.   |
| `dateText`                                                   | Date as displayed by Etsy; no timezone is inferred.                          |
| `buyerName`, `buyerProfileUrl`                               | Public buyer details when present; older or anonymous reviews may omit them. |
| `listingId`, `listingTitle`, `listingUrl`, `listingImageUrl` | Reviewed product context, when available.                                    |
| `photos`                                                     | Available review photo URLs. Images are not downloaded.                      |
| `sellerResponse`                                             | Text in the public seller-response section when present; may be null.        |
| `sourceUrl`, `scrapedAt`                                     | Review page URL and collection timestamp.                                    |

The `RUN-SUMMARY` key-value record contains saved counts, the shop’s reported review count when available and stopping reasons such as exhausted history, result limit or known review ID. It is included without an additional review charge.

### Pricing

**$2.00 per 1,000 saved reviews ($0.002 per review).** A 50-review run costs $0.10 in review charges. Product context, available photos and shop summaries are included. Any additional platform charges configured on the Pricing tab are separate.

Duplicates within a run are not charged twice. A separate new run that collects the same review again produces a new billable result. Set a maximum charge in the Apify run settings to control spending.

### Monitor new reviews

Keep review IDs from your previous run and pass recent ones in `stopAtReviewIds`. Collection stops for a shop before the first matching ID. The matching record is not saved again.

This follows Etsy’s displayed order. If Etsy reorders reviews or someone edits an older review, incremental collection may not capture every change. Use periodic broader collection when that matters.

### Limitations and FAQ

**Does it collect product reviews?** It collects shop-wide reviews with the reviewed product attached when available. It does not accept individual listing URLs.

**Can I filter by stars, photos or sort order?** These are not input options. Export the results and filter them afterward.

**Does it guarantee every historical review?** No. Collection depends on the public pages Etsy makes available. Pagination ends when the source provides no next page or a configured limit is reached.

**Why are some fields empty?** Some reviews contain only a rating, some buyers have no public profile, and not every review includes a photo or response. Seller responses are optional and their coverage is not guaranteed. Video extraction is not supported.

**What happens if a shop cannot be read?** The run reports the failure in `RUN-SUMMARY` and finishes with a failed status if any shop could not be processed. Previously saved reviews remain available. An unavailable page is not silently treated as a shop with zero reviews.

**Do I need an Etsy account?** No Etsy login is required. The Actor collects public shop-review pages. Use the data in accordance with applicable rules and Etsy’s terms.

### Support

Open an issue on the Actor’s Apify page with your run ID and the affected shop URL for help or feature requests.

# Actor input Schema

## `shopUrls` (type: `array`):

Enter shop names or storefront/review URLs. Product listing URLs are not supported.

## `maxItems` (type: `integer`):

Maximum total number of reviews saved.

## `maxReviewsPerShop` (type: `integer`):

Limit results from each shop. Shops are processed in input order.

## `stopAtReviewIds` (type: `array`):

Stop a shop before a previously collected review ID. Use recent IDs from an earlier run to monitor new reviews.

## Actor input object example

```json
{
  "shopUrls": [
    "https://www.etsy.com/shop/HereafterLA"
  ],
  "maxItems": 50,
  "maxReviewsPerShop": 1000,
  "stopAtReviewIds": []
}
```

# Actor output Schema

## `reviews` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "shopUrls": [
        "https://www.etsy.com/shop/HereafterLA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/etsy-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "shopUrls": ["https://www.etsy.com/shop/HereafterLA"] }

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/etsy-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "shopUrls": [
    "https://www.etsy.com/shop/HereafterLA"
  ]
}' |
apify call piotrv1001/etsy-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/etsy-reviews-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MOhEgeVuZW81avfN4/builds/ZsagCg20eatCH76WE/openapi.json
