# Etsy Scraper (`h4sh/etsy-scraper`) Actor

Scrape Etsy for product listings, prices, reviews, shop info and more. Extract handmade, vintage, and craft supply data at scale.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Etsy Scraper

🛒 **The most comprehensive Etsy scraper on Apify** — extract product listings, prices, reviews, and shop data from Etsy.com with anti-bot bypass built in.

### 🏆 Why This Actor?

| Feature | This Actor | Competitors |
|---------|-----------|-------------|
| **Price** | $2/1K results | $3-5/1K |
| **Anti-Bot Bypass** | ✅ Camoufox stealth | ❌ Often blocked |
| **Data Fields** | 15+ fields | 5-8 fields |
| **Search + Shop + Listing** | ✅ All 3 modes | Usually 1 mode |
| **JSON-LD Extraction** | ✅ Structured data | HTML scraping |
| **Free Shipping Badge** | ✅ Included | ❌ Missing |
| **Bestseller Badge** | ✅ Included | ❌ Missing |
| **Pagination** | ✅ Automatic | Manual setup |

### ✨ Key Features

- 🔍 **Keyword Search** — Search Etsy for any product keyword with automatic pagination
- 🏪 **Shop Scraping** — Extract all listings from any Etsy shop
- 📄 **Listing Details** — Deep extraction from individual product pages (ratings, reviews, tags, sales count)
- 🛡️ **Cloudflare Bypass** — Camoufox stealth browser defeats anti-bot protection
- 📊 **Rich Data** — 15+ fields including price, shop name, ratings, free shipping, bestseller badges
- 🔄 **Smart Pagination** — Automatically pages through all results up to your limit
- 💾 **Clean JSON Output** — Export to JSON, CSV, or Excel

### 📥 Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | Array of strings | `["handmade jewelry"]` | Keywords to search on Etsy |
| `shopUrls` | Array of strings | `[]` | Etsy shop URLs to scrape |
| `listingUrls` | Array of strings | `[]` | Individual listing URLs for detailed extraction |
| `maxResults` | Integer | `100` | Maximum results per query/shop (1-10,000) |
| `proxyConfiguration` | Object | Residential US | Proxy settings (residential recommended) |

### 📤 Sample Output

```json
{
  "listingId": "1156396477",
  "title": "Handmade Ceramic Coffee Mug - Artisan Pottery",
  "price": 24.99,
  "currency": "USD",
  "shopName": "QuiverCreekCeramic",
  "url": "https://www.etsy.com/listing/1156396477/",
  "image": "https://i.etsystatic.com/...",
  "rating": 4.9,
  "reviewCount": 1247,
  "freeShipping": true,
  "bestSeller": true,
  "position": 1,
  "searchQuery": "handmade jewelry",
  "source": "search"
}
````

### 💡 Use Cases

- **Market Research** — Analyze trending products, pricing patterns, and competition on Etsy
- **Price Monitoring** — Track competitor pricing across product categories
- **Seller Analytics** — Study top-performing shops and their product strategies
- **Product Sourcing** — Discover handmade and vintage items for resale or inspiration
- **SEO & Keyword Research** — Identify popular search terms and product tags on Etsy

### 💲 Pricing

- **$2.00 per 1,000 results** — the most affordable professional Etsy scraper on Apify
- Platform usage fee: $0.005 per GB of memory
- Typical run: 100 results in ~2 minutes using ~512MB RAM

### 🔗 Related Actors

- [Cars.com Scraper](https://apify.com/h4sh/carscom-scraper) — Automotive listing data
- [GoodRx Drug Price Scraper](https://apify.com/h4sh/goodrx-drug-price-scraper) — Prescription drug pricing
- [Poshmark Scraper](https://apify.com/h4sh/poshmark-scraper) — Fashion resale marketplace data
- [Anti-Bot Bypass Service](https://apify.com/h4sh/anti-bot-bypass) — Universal Cloudflare/PerimeterX bypass

### ⚙️ Technical Details

- **Engine**: Camoufox stealth browser (Firefox-based)
- **Extraction**: JSON-LD structured data with HTML enrichment fallback
- **Anti-Bot**: Cloudflare WAF bypass via browser fingerprint spoofing
- **Proxy**: Residential proxies required for reliable operation
- **Runtime**: Python 3.12 on Apify platform

# Actor input Schema

## `searchQueries` (type: `array`):

List of search keywords (e.g., handmade jewelry, vintage clothing)

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

Etsy shop URLs to scrape (e.g., https://www.etsy.com/shop/ShopName)

## `listingUrls` (type: `array`):

Specific listing URLs for detailed extraction

## `maxResults` (type: `integer`):

Maximum results per search query or shop (default: 100)

## `proxyConfiguration` (type: `object`):

Residential proxies recommended for Cloudflare bypass

## Actor input object example

```json
{
  "searchQueries": [
    "handmade jewelry"
  ],
  "shopUrls": [],
  "listingUrls": [],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `etsyListings` (type: `string`):

Dataset containing scraped Etsy product listings with pricing, seller, and review data.

# 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 = {
    "searchQueries": [
        "handmade jewelry"
    ],
    "shopUrls": [],
    "listingUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("h4sh/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 = {
    "searchQueries": ["handmade jewelry"],
    "shopUrls": [],
    "listingUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "handmade jewelry"
  ],
  "shopUrls": [],
  "listingUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call h4sh/etsy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=h4sh/etsy-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Etsy Scraper",
        "description": "Scrape Etsy for product listings, prices, reviews, shop info and more. Extract handmade, vintage, and craft supply data at scale.",
        "version": "0.1",
        "x-build-id": "BOuDmK33iDSfrYhEl"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/h4sh~etsy-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-h4sh-etsy-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/h4sh~etsy-scraper/runs": {
            "post": {
                "operationId": "runs-sync-h4sh-etsy-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/h4sh~etsy-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-h4sh-etsy-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Search Queries",
                        "type": "array",
                        "description": "List of search keywords (e.g., handmade jewelry, vintage clothing)",
                        "default": [
                            "handmade jewelry"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "shopUrls": {
                        "title": "Shop URLs",
                        "type": "array",
                        "description": "Etsy shop URLs to scrape (e.g., https://www.etsy.com/shop/ShopName)",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "Listing URLs",
                        "type": "array",
                        "description": "Specific listing URLs for detailed extraction",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum results per search query or shop (default: 100)",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Residential proxies recommended for Cloudflare bypass",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
