# Etsy Scraper — Search Listings, Shop Analytics & Reviews (`crawloop/etsy-scraper`) Actor

Etsy scraper for search listings, shop profiles (sales, rating, location), and listing/shop reviews. All-in-one handmade & POD research Actor. Camoufox + Apify Residential DataDome bypass.

- **URL**: https://apify.com/crawloop/etsy-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 listings

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 — Search Listings, Shop Analytics & Reviews

> **Disclaimer:** Unofficial tool for publicly accessible Etsy marketplace pages. **Etsy** and related names are trademarks of Etsy, Inc. or its affiliates. Not affiliated with, sponsored by, or endorsed by Etsy. Provided for informational and research use only; users must comply with applicable terms and laws.

**Etsy scraper** for Apify — extract **search listings**, **shop profiles** (sales, rating, location, featured items), and **listing / shop reviews** in one Actor. Built for **handmade & POD niche research**, **competitor shop analytics**, and **review / sentiment mining**. Export clean JSON for Python, Node.js, Sheets, and AI / MCP workflows. DataDome bypass via **Camoufox + Apify Residential**.

**Best for:** sellers, agencies, and data teams who need Etsy product search, shop intel, and buyer reviews without juggling multiple scrapers.

> **Crawloop Marketplace & E-commerce Suite** — marketplace scrapers for product discovery and pricing intelligence.

| **Etsy Scraper** ◄── *you are here* | [Shopee Search Scraper](https://apify.com/crawloop/shopee-search-scraper) | [eBay Active Listings Scraper](https://apify.com/crawloop/ebay-active-listings-scraper) | [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) |
| :---: | :---: | :---: | :---: |
| Etsy search, shops & reviews | Shopee SERP across SEA locales | Live eBay listings | Completed eBay sold comps |

Also see: [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) · [Mobile.de Scraper](https://apify.com/crawloop/mobile-de-scraper)

### When to use this Actor

- **Etsy product search scraping** — keyword SERP with title, price, shop, badges, and listing URLs
- **Etsy shop scraper** — sales volume, ratings, location, slogan, featured catalog snapshot
- **Etsy reviews scraper** — buyer comments and star ratings from shops or listings
- **Competitor & niche intel** — handmade, vintage, and print-on-demand research at scale
- **Etsy API alternative** — public-page dataset for pipelines when you need structured rows, not a browser

### When not to use this Actor

- **Private / authenticated Etsy data** — public pages only
- **Historical price charts** — current page snapshot, not full price-history APIs
- **eBay or Shopee catalogs** — use the sibling scrapers linked above
- **Huge unlimited crawls without caps** — set `maxItems` / review caps to control spend

### Key Features

- **All-in-one Etsy data** — search SERP, shop profiles, and reviews without juggling multiple Actors
- **Keyword & URL inputs** — `searchQueries`, shop names, or paste `/search`, `/shop`, `/listing`, `/reviews` URLs
- **Shop analytics** — sales count, rating, review total, location, slogan, featured listings
- **Reviews at scale** — shop review pagination + listing-page reviews with rating, comment, buyer, item link
- **Typed dataset rows** — `recordType`: `listing` | `shop` | `review` for easy filtering
- **Auto mode** — detect target type from URLs and keywords
- **Caps that save budget** — `maxItems`, `maxSearchPages`, `maxReviewsPerEntity`
- **DataDome-ready transport** — Camoufox anti-detect Firefox + US residential sticky sessions
- **Session pool** — rotate Apify Residential sessions when a challenge page appears

### Modes

| Mode | What it does |
| :--- | :--- |
| `auto` | Detects search / shop / listing / shop-reviews from inputs (default) |
| `search` | Paginated Etsy search result cards |
| `shop` | Shop profile (+ optional featured listing summaries) |
| `reviews` | Listing reviews and/or shop review pages |

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `mode` | String | `auto` | `auto` / `search` / `shop` / `reviews` |
| `startUrls` | Array | — | Etsy search, shop, listing, or shop-reviews URLs |
| `searchQueries` | Array | — | Keywords converted to Etsy search URLs |
| `shopNames` | Array | — | Shop slugs (e.g. `Oakywood`) |
| `maxItems` | Integer | `100` | Hard dataset row cap (`0` = unlimited) |
| `maxSearchPages` | Integer | `5` | Search pagination cap per query |
| `maxReviewsPerEntity` | Integer | `50` | Review cap per listing/shop (`0` = unlimited) |
| `includeShopProfile` | Boolean | `true` | Emit shop row in reviews mode |
| `includeFeaturedListings` | Boolean | `true` | Attach featured listings on shop rows |
| `browserEngine` | String | `camoufox` | `camoufox` (recommended) or `patchright` |
| `sessionPoolSize` | Integer | `3` | Residential sticky sessions to rotate |
| `browserWaitMs` | Integer | `8000` | Extra wait for challenge / JS render |
| `useZenrowsFallback` | Boolean | `false` | Optional last-resort unlock API |
| `proxyConfiguration` | Object | Residential US | **Apify RESIDENTIAL + US required** |

#### Input Example — search

```json
{
  "mode": "search",
  "searchQueries": ["handmade silver ring"],
  "maxItems": 48,
  "maxSearchPages": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Input Example — shop reviews

```json
{
  "mode": "reviews",
  "shopNames": ["Oakywood"],
  "maxReviewsPerEntity": 40,
  "includeShopProfile": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Input Example — listing URL (auto)

```json
{
  "mode": "auto",
  "startUrls": [
    { "url": "https://www.etsy.com/listing/949905096/oakywood-dual-laptop-stand-wood-vertical" }
  ],
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Output Format

Each dataset item includes `recordType` plus fields for that type.

| Field | Description |
| :--- | :--- |
| `recordType` | `listing`, `shop`, or `review` |
| `listingId` / `shopId` / `reviewId` | Entity IDs when present |
| `title` / `url` | Listing title and clean URL |
| `price` / `priceValue` / `currency` | Display price + numeric + currency |
| `shopName` / `location` / `rating` / `totalSales` | Shop analytics fields |
| `comment` / `reviewerName` / `reviewDate` | Review body and metadata |
| `query` / `page` / `scrapedAt` | Provenance |

#### Listing (`recordType: "listing"`)

```json
{
  "recordType": "listing",
  "listingId": "828141911",
  "shopId": "11956698",
  "shopName": "MasteRetsaM",
  "title": "925 Sterling Silver Hammered Ring - Wide Band (3-8mm)",
  "url": "https://www.etsy.com/listing/828141911/925-sterling-silver-hammered-ring-wide",
  "price": "$27.60",
  "priceValue": 27.6,
  "currency": "USD",
  "imageUrl": "https://i.etsystatic.com/11956698/r/il/686d6e/3161699197/il_255x319.3161699197_i4vu.jpg",
  "isAd": true,
  "hasFreeShipping": false,
  "query": "handmade silver ring",
  "page": 1,
  "scrapedAt": "2026-08-03T10:50:30+00:00"
}
```

#### Shop (`recordType: "shop"`)

```json
{
  "recordType": "shop",
  "shopId": "13285848",
  "shopName": "Oakywood",
  "ownerName": "Mateusz",
  "url": "https://www.etsy.com/shop/Oakywood",
  "location": "Zakopane, Poland",
  "rating": 5.0,
  "reviewsCount": 8497,
  "totalSales": 46268,
  "slogan": "Your workspace. Reinvented.",
  "featuredListings": [],
  "scrapedAt": "2026-08-03T10:52:27+00:00"
}
```

#### Review (`recordType: "review"`)

```json
{
  "recordType": "review",
  "reviewId": "5139232025",
  "rating": 5,
  "comment": "Rapid delivery, second time purchasing as excellent quality",
  "reviewerName": "christina",
  "reviewDate": "Aug 1, 2026",
  "listingId": "982915831",
  "title": "Oakywood Dual Monitor Stand: Solid Wood Desk Shelf Organizer",
  "url": "https://www.etsy.com/listing/982915831/oakywood-dual-monitor-stand-solid-wood",
  "shopName": "Oakywood",
  "page": 1,
  "scrapedAt": "2026-08-03T10:53:09+00:00"
}
```

### Use Cases

| Use case | What you get | Why it helps |
| :--- | :--- | :--- |
| **Niche & POD research** | Keyword SERP: title, price, shop, badges | Spot bestsellers and pricing bands fast |
| **Competitor shop tracking** | Sales, rating, location, featured items | Benchmark shops without manual browsing |
| **Review / sentiment mining** | Stars, comment, reviewer, linked listing | Product R\&D and QA signal from real buyers |
| **Listing monitoring** | Listing metadata + on-page reviews | Watch a product URL on a schedule |
| **Data pipelines** | Clean JSON rows per record type | Feed Sheets, BI tools, or ML workflows |
| **AI / MCP workflows** | Run via Apify API, clients, or MCP | Summarize niches and shops from assistants |

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/etsy-scraper').call({
  mode: 'search',
  searchQueries: ['handmade silver ring'],
  maxItems: 48,
  maxSearchPages: 2,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'US',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/etsy-scraper").call(
    run_input={
        "mode": "reviews",
        "shopNames": ["Oakywood"],
        "maxReviewsPerEntity": 40,
        "includeShopProfile": True,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "US",
        },
    }
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(len(items), items[:3])
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~etsy-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "search",
    "searchQueries": ["handmade silver ring"],
    "maxItems": 48,
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["RESIDENTIAL"],
      "apifyProxyCountry": "US"
    }
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/etsy-scraper`.

Example prompts:

- "Run Etsy Scraper in search mode for handmade silver ring, max 48 listings, and return title, price, shopName as JSON"
- "Scrape the Oakywood Etsy shop profile and the latest 40 reviews, then summarize rating themes"
- "Chain Etsy Scraper search for wooden desk organizer then eBay Sold Listings Scraper for the same niche comps"

### Suite next step

For SEA marketplace SERP, run [Shopee Search Scraper](https://apify.com/crawloop/shopee-search-scraper). For resale comps on another marketplace, use [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) or live competition via [eBay Active Listings Scraper](https://apify.com/crawloop/ebay-active-listings-scraper).

### Tips for reliable runs

1. Always enable **Apify Residential** with country **US**.
2. Use memory **4096 MB** (default) — Camoufox needs headroom.
3. Keep `sessionPoolSize` at 2–4; raise `browserWaitMs` if challenges persist.
4. Start with modest `maxItems` to validate unlock, then scale.

### FAQ

#### What can this Etsy scraper extract?

Search listing cards, shop profiles (sales, rating, location, featured items), and buyer reviews from listing or shop review pages — typed as `listing`, `shop`, or `review` rows.

#### Do I need proxies?

Yes — **Apify Residential** with country **US** is required for reliable DataDome unlock. Datacenter-only runs typically fail.

#### Can I scrape by keyword and by URL?

Yes — use `searchQueries` / `shopNames`, or paste Etsy `/search`, `/shop`, `/listing`, and shop-reviews URLs in `startUrls`. `mode: auto` detects the target type.

#### Is this an official Etsy API?

No. It parses publicly accessible pages. It is an unofficial **Etsy API alternative** for research datasets, not an official partner integration.

#### How do I filter results by type?

Filter the default dataset on `recordType` (`listing` | `shop` | `review`), or run a dedicated mode (`search`, `shop`, `reviews`).

#### Can I use this from Python or Node.js?

Yes — see the integration examples above, or call the Actor via [Apify MCP](https://docs.apify.com/platform/integrations/mcp) from an AI assistant.

### Related Actors

| Actor | Link |
| :--- | :--- |
| Shopee Search Scraper | [apify.com/crawloop/shopee-search-scraper](https://apify.com/crawloop/shopee-search-scraper) |
| eBay Active Listings Scraper | [apify.com/crawloop/ebay-active-listings-scraper](https://apify.com/crawloop/ebay-active-listings-scraper) |
| eBay Sold Listings Scraper | [apify.com/crawloop/ebay-sold-listings-scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) |
| eBay Sold Price Intelligence | [apify.com/crawloop/ebay-sold-price-intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) |
| Mobile.de Scraper | [apify.com/crawloop/mobile-de-scraper](https://apify.com/crawloop/mobile-de-scraper) |

# Actor input Schema

## `mode` (type: `string`):

auto = detect from URLs/queries; search = SERP listings; shop = shop profiles; reviews = listing/shop reviews.

## `startUrls` (type: `array`):

Etsy search, shop, listing, or shop-reviews URLs.

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

Keyword searches (e.g. handmade silver ring). Converted to Etsy search URLs.

## `shopNames` (type: `array`):

Etsy shop names or /shop/Name paths (e.g. Oakywood).

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

Hard cap on pushed dataset rows across all record types. 0 = unlimited.

## `maxReviewsPerEntity` (type: `integer`):

Cap reviews collected per listing or shop. 0 = unlimited (bounded by available pages).

## `maxSearchPages` (type: `integer`):

Pagination cap for each search query/URL.

## `includeShopProfile` (type: `boolean`):

In reviews mode, also push a shop profile row when scraping shop reviews.

## `includeFeaturedListings` (type: `boolean`):

Attach featured listing summaries on shop profile rows (no extra PPE events).

## `browserEngine` (type: `string`):

camoufox = anti-detect Firefox (recommended for DataDome); patchright = patched Chromium.

## `sessionPoolSize` (type: `integer`):

Number of Apify Residential sticky sessions to rotate on DataDome blocks.

## `browserWaitMs` (type: `integer`):

Extra wait for DataDome / JS render before parsing HTML.

## `useZenrowsFallback` (type: `boolean`):

If Playwright+Residential still gets blocked, retry via ZenRows JS render. Off by default.

## `zenrowsApiKey` (type: `string`):

Only used when useZenrowsFallback is enabled (or ZENROWS\_API\_KEY secret).

## `proxyCountry` (type: `string`):

ISO country for optional ZenRows premium proxy.

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

Required for DataDome bypass: Apify Residential, country US recommended.

## Actor input object example

```json
{
  "mode": "auto",
  "startUrls": [
    {
      "url": "https://www.etsy.com/search?q=handmade+silver+ring"
    },
    {
      "url": "https://www.etsy.com/shop/Oakywood"
    }
  ],
  "searchQueries": [
    "handmade silver ring"
  ],
  "maxItems": 100,
  "maxReviewsPerEntity": 50,
  "maxSearchPages": 5,
  "includeShopProfile": true,
  "includeFeaturedListings": true,
  "browserEngine": "camoufox",
  "sessionPoolSize": 3,
  "browserWaitMs": 8000,
  "useZenrowsFallback": false,
  "proxyCountry": "us",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items (listing, shop, review).

# 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 = {
    "startUrls": [
        {
            "url": "https://www.etsy.com/search?q=handmade+silver+ring"
        },
        {
            "url": "https://www.etsy.com/shop/Oakywood"
        }
    ],
    "searchQueries": [
        "handmade silver ring"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "startUrls": [
        { "url": "https://www.etsy.com/search?q=handmade+silver+ring" },
        { "url": "https://www.etsy.com/shop/Oakywood" },
    ],
    "searchQueries": ["handmade silver ring"],
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "startUrls": [
    {
      "url": "https://www.etsy.com/search?q=handmade+silver+ring"
    },
    {
      "url": "https://www.etsy.com/shop/Oakywood"
    }
  ],
  "searchQueries": [
    "handmade silver ring"
  ]
}' |
apify call crawloop/etsy-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6zdhbMoQrN7MpWZhU/builds/qSuJGVCllK86ZBqZa/openapi.json
