# Etsy Scraper 🔥 $0.7/1K | Listings, Category, Sellers & Reviews (`azzouzana/etsy-scraper`) Actor

From $0.70/1K 💰 Extract an Etsy search, category, shop, or listing. All the data: listings, sellers, full product pages, product reviews, and seller reviews. Titles, prices, photos, ratings, descriptions, shipping, and shops land in seconds. JSON, CSV, Excel, or API. Start now! 🚀

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

## Pricing

from $0.60 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper - Listings, Shops & Sellers

Copying Etsy by hand means opening page after page. Paste a search, category, shop, or listing link and the rows land in your dataset in seconds.

### Engineering Excellence & Reliability 🚀

- **Search, category, shop, or listing link**: Listings, shop profiles, and the full product. A single listing link works too. Price filters already in the link stay on later pages.
- **High-velocity collection**: Pagination is handled for you. Large searches and whole shops keep going up to your `maxItems`. Results land as each page is ready.
- **We bypass the website limitation and go beyond it.** Duplicates are skipped.
- **Cards carry the buying signals**: Price, sale price, currency, photos, free shipping, whether the listing has variations, the shop rating, and the shop's review count.
- **Full listing when you want it**: Leave `fetchFullDetails` off for the card. Turn it on, or choose **details**, and each row is the full listing: description, all seller tags, materials, favorites, every photo, quantity, and shipping origin.
- **Product reviews or seller reviews**: Product reviews are the reviews for an item. Seller reviews are the reviews for a shop. Each review is one row, with the buyer, the star rating, the text, item and shipping subratings, and the seller's reply. Later pages are included up to your `maxItems`.
- **Shop profile**: Sales, active listings, rating, headline, and the owner name.
- **Clean exports**: JSON, CSV, Excel, or API. One listing, one shop, or one review is one row.

### 🛠️ How to Play

Open Etsy, set the search, category, shop, or listing, then copy the address bar. Paste that link as **startUrl**. Filters already in the link stay in place on later pages.

| Field | Type | Description |
|-------|------|-------------|
| `startUrl` | String | **(Required)** Etsy search, category, shop, or listing URL. |
| `maxItems` | Number | Maximum rows for the data type you picked. Default: 100. |
| `fetchFullDetails` | Boolean | With **listings**, `false` = the card and `true` = the full listing. |
| `dataTypes` | String | One of `listings`, `sellers`, `details`, `productReviews`, `sellerReviews`. Default: listings. |

**full-listing-detail-fetched** applies once per full listing that is saved. That is a listing link, the `details` data type, or `fetchFullDetails`. It does not apply to listing cards, seller profiles, or review rows. A listing that fails to load is not included. Every saved row is still a result.

#### Example 1: Ceramic mugs

```json
{
    "startUrl": "https://www.etsy.com/search?q=ceramic+mug&explicit=1",
    "maxItems": 100,
    "fetchFullDetails": false,
    "dataTypes": "listings"
}
```

#### Example 2: A shop's listings

```json
{
    "startUrl": "https://www.etsy.com/shop/AnaArtBoutiquestudio",
    "maxItems": 100,
    "fetchFullDetails": false,
    "dataTypes": "listings"
}
```

#### Example 3: Product reviews for one listing

```json
{
    "startUrl": "https://www.etsy.com/listing/4317740783/handmade-ceramic-large-coffee-mug-rustic",
    "maxItems": 20,
    "fetchFullDetails": false,
    "dataTypes": "productReviews"
}
```

#### Example 4: Seller reviews for a shop

```json
{
    "startUrl": "https://www.etsy.com/shop/AnaArtBoutiquestudio",
    "maxItems": 50,
    "fetchFullDetails": false,
    "dataTypes": "sellerReviews"
}
```

#### Example 5: One listing, full page

```json
{
    "startUrl": "https://www.etsy.com/listing/4317740783/handmade-ceramic-large-coffee-mug-rustic",
    "maxItems": 10,
    "fetchFullDetails": true,
    "dataTypes": "details"
}
```

#### Example 6: Find shops selling ceramic mugs

```json
{
    "startUrl": "https://www.etsy.com/search?q=ceramic+mug",
    "maxItems": 50,
    "fetchFullDetails": false,
    "dataTypes": "sellers"
}
```

### 🆓 Free tier limitations

We want you to see how this actor works before you commit. To keep things fair for everyone, the **free tier** includes these trial limits:

- **Sample data:** up to **5 items** per run.
- **Daily cap:** **5 runs** per calendar day (UTC).
- **Between runs:** at least **60 seconds** before you can start another run.

#### Upgrade when you're ready!

Use the free tier to decide if this actor fits your project. Paid Apify plans remove these wait times and caps so you can run at full volume—[**upgrade to a paid plan**](https://apify.com/pricing?fpr=cbgdsf).

### 📦 What’s in the Box?

The output sample has four complete rows, with every field that was returned. Nothing is removed.

- A search card: price, sale price, currency, photos, free shipping, variations, shop rating, and the shop on the card.
- A full listing: description, 13 seller tags, materials, 20 photos with their image records, favorites, quantity, and shipping origin.
- One product review: the buyer, the text, the star rating, item and shipping subratings, and the seller reply.
- One shop: sales, active listings, rating, headline, story, and owner.

A listing card stays the card until `details` or `fetchFullDetails` replaces it with the full listing. A review row is one review. A seller row is the shop.

### Contact 📬

**Need a custom solution? Have a feature request or just want to chat?**
We'd love to hear from you!

- 💬 **Discord**: `@azzouzana`
- 📧 **Email**: <labs@azzouzana.com>

### ⚠️ Disclaimer

This actor is not affiliated with Etsy. It collects publicly available listings. You are responsible for complying with Etsy terms and applicable laws. Read more about the legality of web scraping on the [Apify blog](https://blog.apify.com/is-web-scraping-legal?fpr=cbgdsf).

### Keywords

Etsy, Etsy scraper, Etsy listings, Etsy shops, Etsy sellers, handmade, vintage, product research, shop profile, listing data, JSON, CSV, Excel

# Actor input Schema

## `startUrl` (type: `string`):

Paste an Etsy search, category, shop, or listing link from your browser.

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

Maximum rows to save for the data type you picked. The effective limit also respects the run budget and the free-tier cap (5 for free users).

## `fetchFullDetails` (type: `boolean`):

Used when the data type is Listings. Save the full listing instead of the card: description, tags, materials, favorites, every photo, and shipping origin. Slower. The full-listing-detail-fetched event applies once per full listing that is saved. It also applies to a listing link and to the Details data type. It does not apply to seller profiles or review rows. A listing that fails to load is not included.

## `dataTypes` (type: `string`):

One kind of row per run. Listings are search or shop cards. Sellers are shop profiles. Details are the full listing. Product reviews are reviews of the item. Seller reviews are reviews of the shop. full-listing-detail-fetched applies to Details, to Fetch full listing details, and to a listing link. It does not apply to Listings, Sellers, Product reviews, or Seller reviews.

## Actor input object example

```json
{
  "startUrl": "https://www.etsy.com/search?q=ceramic+mug&explicit=1",
  "maxItems": 100,
  "fetchFullDetails": false,
  "dataTypes": "listings"
}
```

# Actor output Schema

## `results` (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 = {
    "startUrl": "https://www.etsy.com/search?q=ceramic+mug&explicit=1",
    "maxItems": 100,
    "fetchFullDetails": false,
    "dataTypes": "listings"
};

// Run the Actor and wait for it to finish
const run = await client.actor("azzouzana/etsy-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 = {
    "startUrl": "https://www.etsy.com/search?q=ceramic+mug&explicit=1",
    "maxItems": 100,
    "fetchFullDetails": False,
    "dataTypes": "listings",
}

# Run the Actor and wait for it to finish
run = client.actor("azzouzana/etsy-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 '{
  "startUrl": "https://www.etsy.com/search?q=ceramic+mug&explicit=1",
  "maxItems": 100,
  "fetchFullDetails": false,
  "dataTypes": "listings"
}' |
apify call azzouzana/etsy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,azzouzana/etsy-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/A7ozisHch4WABMzJ7/builds/sZtrlCpBJQBgWjG4w/openapi.json
