# Etsy Scraper (`automation-lab/etsy-scraper`) Actor

Scrape Etsy product listings by keyword, category, or shop URL. Extract titles, prices, ratings, review counts, shop names, shipping info, and product images. Process thousands of listings in a single run. Export to JSON, CSV, or Excel for market research and competitive analysis.

- **URL**: https://apify.com/automation-lab/etsy-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 24 total users, 13 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## 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

Scrape [Etsy](https://www.etsy.com) product listings at scale. Extract product names, prices, shop names, ratings, images, availability, and more from Etsy search results — no API keys, no login, no manual copying required.

This actor searches Etsy through category pages and market URLs, bypassing DataDome anti-bot protection that blocks standard `/search` endpoints. It uses lightweight HTTP requests with Cheerio (no browser) and parses LD+JSON structured data embedded in every Etsy page, giving you clean, structured product data in seconds.

### What does Etsy Scraper do?

**Etsy Scraper** extracts product listing data from [Etsy](https://www.etsy.com) search results. You provide a search query (like `handmade leather wallet` or `vintage engagement ring`), optionally select a category, and the scraper returns structured data for every matching product — ready to export in JSON, CSV, or Excel.

🔍 **Search any Etsy query** — from `boho wedding decor` to `custom pet portrait`
📦 **Up to 5,000 products per run** — paginate through dozens of result pages automatically
🏷️ **Filter by price, shipping, and sale status** — narrow results before scraping
⚡ **Fast and lightweight** — HTTP-only with Cheerio, no browser overhead
🛡️ **Bypasses DataDome** — uses category and market URL patterns that avoid anti-bot blocks
💰 **Pay per result** — $0.003 per product extracted, no monthly subscription

### Who is Etsy Scraper for?

**🛒 Handcraft sellers and Etsy shop owners**
You're running your own Etsy shop and need competitive intelligence to price and position your products.
- Monitor competitor pricing in your niche (jewelry, decor, apparel, etc.)
- Track which keywords and product titles competitors are ranking for
- Identify pricing sweet spots and gaps in the market

**📊 Dropshippers and product sourcers**
You're building a store and looking for trending handmade or vintage products to resell.
- Find top-selling products by scraping with `sort: recently_listed` or `sort: most_relevant`
- Identify prolific shops to approach as suppliers
- Track which categories have the best sale-to-stock ratio

**📈 Market researchers and competitive analysts**
You're studying Etsy as a marketplace — pricing trends, category demand, or niche saturation.
- Extract pricing distributions across entire categories
- Measure listing density and competition for specific search terms
- Build time-series datasets by scheduling daily runs

**🤖 Data engineers and developers**
You need Etsy product data piped into your application, database, or analytics pipeline.
- Integrate via Apify API with Node.js, Python, or cURL
- Schedule automated daily or weekly runs without writing any scraping code
- Feed results into Google Sheets, Airtable, Notion, or any webhook endpoint

### Why use Etsy Scraper?

🚫 **No Etsy API limitations** — Etsy's official API requires OAuth approval, has strict rate limits, and restricts access to search results. This scraper extracts the same data directly from public pages with no API key needed.

⚙️ **No browser required** — unlike Playwright-based scrapers, Etsy Scraper uses pure HTTP requests with Cheerio parsing. Lower compute costs, faster execution, and higher reliability.

🛡️ **DataDome bypass built in** — Etsy's `/search` endpoint is protected by DataDome bot detection. This scraper routes through `/c/{category}` and `/market/{query}` paths that return full product data without triggering blocks.

📋 **LD+JSON extraction** — product data is parsed from Google-structured LD+JSON embedded in the HTML, not fragile CSS selectors. Consistent, reliable output even when Etsy updates their page design.

🔄 **Automatic retry and rotation** — failed requests are retried up to 5 times with exponential backoff and fresh residential proxy sessions on each attempt.

🌐 **256 MB footprint** — HTTP-only actor with minimal memory use, keeping platform costs extremely low and runs fast.

💵 **Transparent pay-per-result pricing** — you pay only for products actually extracted, plus a tiny $0.005 startup fee. No upfront credits, no monthly lock-in.

### What data can you extract from Etsy?

Each scraped product includes **17 fields** covering listing identity, pricing, seller info, and shipping status:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | String | Unique Etsy listing identifier |
| `name` | String | Product title as shown on Etsy |
| `url` | String | Direct link to the product listing |
| `imageUrl` | String | Main product image URL |
| `shop` | String | Seller shop name |
| `shopId` | String | Unique shop identifier |
| `price` | String | Current listing price |
| `originalPrice` | String | Pre-sale price (if discounted), else `null` |
| `currency` | String | Price currency code (e.g., USD, EUR, AUD) |
| `onSale` | Boolean | Whether the item is currently on sale |
| `freeShipping` | Boolean | Whether free shipping is offered |
| `rating` | Number | Star rating (1.0–5.0), `null` if unrated |
| `availability` | String | Stock status (e.g., "In Stock") |
| `position` | Number | Result position in search results |
| `query` | String | The search query that produced this listing |
| `page` | Number | Which results page this listing came from |
| `scrapedAt` | String | ISO 8601 timestamp of extraction |

### How much does it cost to scrape Etsy listings?

Etsy Scraper uses **pay-per-event** pricing — you pay only for what you scrape. No monthly subscription. All platform costs are included.

| | Free | Starter ($29/mo) | Scale ($199/mo) | Business ($999/mo) |
|---|---|---|---|---|
| **Per run** | $0.005 | $0.005 | $0.005 | $0.005 |
| **Per product** | $0.00345 | $0.003 | $0.00234 | $0.0018 |
| **1,000 products** | $3.45 | $3.00 | $2.34 | $1.80 |

Higher-tier plans (PLATINUM, DIAMOND) receive additional volume discounts for enterprise-scale usage.

**Real-world cost examples (Starter plan):**

| Use case | Products | Duration | Cost |
|---|---|---|---|
| Quick niche check | 20 products | ~5 sec | ~$0.065 |
| Single category page | 64 products | ~15 sec | ~$0.197 |
| Competitor analysis | 200 products | ~45 sec | ~$0.605 |
| Market research snapshot | 500 products | ~2 min | ~$1.505 |
| Large-scale extraction | 1,000 products | ~4 min | ~$3.005 |
| Full category deep-dive | 5,000 products | ~20 min | ~$15.005 |

💡 The **free tier** includes $5 of monthly usage — enough to scrape ~1,400 products at no cost.

### How to scrape Etsy products step by step

1. **Go to [Etsy Scraper](https://apify.com/automation-lab/etsy-scraper) on Apify Store** and click **"Try for free"**. Sign up for an Apify account if you don't have one — the free tier includes $5 of monthly usage.

2. **Enter your search query** in the "Search Query" field. Use the same terms you'd type into Etsy's search bar, for example: `handmade leather journal`, `vintage gold ring`, or `custom pet portrait`.

3. **Select a category** (recommended). Choosing a category like "Jewelry & Accessories" or "Home & Living" enables full pagination with up to 64 results per page. Without a category, results are limited to approximately 16 products via Etsy's `/market/` path.

4. **Set the maximum number of products** you want. The default is 64 (one page). Increase up to 5,000 for large-scale extraction.

5. **Apply optional filters** — set a price range with `minPrice` / `maxPrice`, restrict to free shipping only, or filter to on-sale items only. Choose a sort order: Most Relevant, Lowest Price, Highest Price, or Recently Listed.

6. **Configure proxy settings.** Residential proxy is pre-selected and required. Etsy actively blocks datacenter IPs — do not change the proxy group unless you have your own residential proxy provider.

7. **Click "Start"** and wait for the run to complete. A typical 64-product run finishes in under 30 seconds.

8. **Download your data** from the Dataset tab in JSON, CSV, Excel, or other formats. You can also connect results directly to Google Sheets, Slack, Airtable, or any webhook endpoint.

**Example input for a basic search:**

```json
{
    "searchQuery": "handmade necklace",
    "category": "jewelry-and-accessories",
    "maxItems": 100,
    "sort": "most_relevant"
}
````

**Example input for sale + free shipping filter:**

```json
{
    "searchQuery": "vintage leather bag",
    "category": "bags-and-purses",
    "maxItems": 200,
    "sort": "lowest_price",
    "onSale": true,
    "freeShipping": true,
    "maxPrice": 80
}
```

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchQuery` | String | ✅ Yes | — | What to search for on Etsy (e.g., `handmade necklace`) |
| `category` | String | No | All Categories | Etsy category to filter results. Options: `jewelry-and-accessories`, `clothing-and-shoes`, `home-and-living`, `wedding-and-party`, `toys-and-entertainment`, `art-and-collectibles`, `craft-supplies-and-tools`, `vintage`, `gifts`, `electronics-and-accessories`, `bags-and-purses`, `bath-and-beauty` |
| `maxItems` | Integer | No | 64 | Maximum number of products to scrape (1–5,000) |
| `sort` | String | No | `most_relevant` | Sort order: `most_relevant`, `lowest_price`, `highest_price`, `recently_listed` |
| `minPrice` | Number | No | — | Minimum price filter in USD |
| `maxPrice` | Number | No | — | Maximum price filter in USD |
| `freeShipping` | Boolean | No | `false` | Only return products with free shipping |
| `onSale` | Boolean | No | `false` | Only return products currently on sale |
| `proxyConfiguration` | Object | No | Residential | Proxy settings. Residential proxy strongly recommended for Etsy |

### Output example

Each product in the dataset looks like this:

```json
{
    "listingId": "1284957302",
    "name": "Handmade Gold Filled Necklace, Dainty Chain Necklace, Gift for Her",
    "url": "https://www.etsy.com/listing/1284957302/handmade-gold-filled-necklace-dainty",
    "imageUrl": "https://i.etsystatic.com/12345678/r/il/abc123/4567890123/il_300x300.4567890123_example.jpg",
    "shop": "GoldenChainCo",
    "shopId": "34521890",
    "price": "24.99",
    "originalPrice": null,
    "currency": "USD",
    "onSale": false,
    "freeShipping": true,
    "rating": 4.8,
    "availability": "In Stock",
    "position": 1,
    "query": "handmade necklace",
    "page": 1,
    "scrapedAt": "2026-03-22T14:30:00.000Z"
}
```

**Sale item with original price:**

```json
{
    "listingId": "4428738695",
    "name": "Orchid Pearl Necklace, Real Orchid Pendant, Handmade Botanical Jewellery",
    "url": "https://www.etsy.com/listing/4428738695/orchid-pearl-necklace-real-orchid",
    "imageUrl": "https://i.etsystatic.com/63062527/r/il/d7e81d/7578438711/il_fullxfull.7578438711_7a2q.jpg",
    "shop": "ZivaJewelleryArt",
    "shopId": "63062527",
    "price": "49.64",
    "originalPrice": "62.05",
    "currency": "AUD",
    "onSale": true,
    "freeShipping": false,
    "rating": 5,
    "availability": "In Stock",
    "position": 3,
    "query": "handmade necklace",
    "page": 1,
    "scrapedAt": "2026-03-23T00:50:47.547Z"
}
```

### Tips for best results

🏷️ **Always specify a category** — without a category, the scraper uses Etsy's `/market/` URL which returns only ~16 results per page. With a category selected, you unlock full pagination with up to 64 products per page and can scrape thousands of listings.

🔑 **Use specific search terms** — `vintage leather messenger bag` returns far more relevant results than just `bag`. Etsy's search engine rewards specificity with better product matches.

💰 **Combine price filters with sort order** — to find the cheapest items in a niche, set `sort: lowest_price` and `maxPrice: 50`. This is the most effective setup for competitive pricing analysis.

📦 **Filter free shipping for buyer-perspective research** — many Etsy shoppers filter for free shipping. Use the `freeShipping: true` filter to see exactly what those buyers see — useful for optimizing your own listings.

🔄 **Schedule daily runs for price monitoring** — use Apify Schedules to run this scraper automatically. Export to Google Sheets and track price changes over time in any niche.

⚠️ **Start small to validate your query** — run 20–100 products first to confirm the search term returns what you expect. Then scale up to 500–5,000 once you're satisfied with the data quality.

🌐 **Residential proxy is non-negotiable** — Etsy blocks datacenter and shared proxy IPs. The actor is pre-configured with `RESIDENTIAL` proxy group. Do not change this unless you have a specific residential proxy provider configured.

📅 **Use `recently_listed` sort for trend spotting** — set sort to `recently_listed` to catch new products in a category as soon as they appear. Combine with a scheduled run to monitor emerging trends.

### Integrations

Etsy Scraper works with Apify's full integration ecosystem. Here are concrete workflow patterns:

📊 **Google Sheets price tracker** — connect the dataset output to Google Sheets via Apify's native integration. Run the scraper on a daily schedule to build a rolling price history for any Etsy niche. Spot price trends without touching a spreadsheet.

💬 **Slack alerts for new listings** — combine `sort: recently_listed` with a Slack notification. Get automatically pinged when new products appear in your target category — useful for dropshippers and sourcing teams.

📧 **Email reports to your team** — use Apify's email integration to send a daily CSV export of competitor product data directly to stakeholders — no manual downloads.

🗄️ **Database sync** — push results to PostgreSQL, MySQL, MongoDB, or Airtable via Apify webhooks. Build a product intelligence database that updates on a schedule.

📁 **Amazon S3 / Google Cloud Storage** — archive datasets automatically to cloud storage for long-term trend analysis or compliance.

🔗 **Zapier and Make** — trigger downstream workflows in 5,000+ apps. Examples: automatically add new Etsy products to a Notion database, update a CRM with competitor listings, or push data to a Slack channel on schedule.

🐍 **Python and Node.js** — use the Apify SDK to call this actor programmatically and process results in your own pipeline (see API usage below).

### Using the Apify API

You can call Etsy Scraper programmatically using the Apify API. Here are examples in Node.js, Python, and cURL.

#### Node.js

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('automation-lab/etsy-scraper').call({
    searchQuery: 'handmade ceramic mug',
    category: 'home-and-living',
    maxItems: 100,
    sort: 'most_relevant',
    freeShipping: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Found ${items.length} products`);
items.forEach((item) => {
    console.log(`${item.name} — $${item.price} by ${item.shop}`);
});
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("automation-lab/etsy-scraper").call(run_input={
    "searchQuery": "vintage engagement ring",
    "category": "jewelry-and-accessories",
    "maxItems": 200,
    "sort": "lowest_price",
    "minPrice": 50,
    "maxPrice": 500,
})

dataset = client.dataset(run["defaultDatasetId"]).list_items().items
for product in dataset:
    print(f"{product['name']} — ${product['price']} ({product['shop']})")
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~etsy-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQuery": "custom wedding invitation",
    "category": "wedding-and-party",
    "maxItems": 50,
    "sort": "most_relevant"
  }'
```

Retrieve results after the run completes:

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_APIFY_TOKEN&format=json"
```

### Use with AI agents via MCP

Etsy Scraper is available as a tool for AI assistants that support the [Model Context Protocol (MCP)](https://docs.apify.com/platform/integrations/mcp).

Add the Apify MCP server to your AI client — this gives you access to all Apify actors, including this one:

#### Setup for Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/etsy-scraper"
```

#### Setup for Claude Desktop, Cursor, or VS Code

Add this to your MCP config file:

```json
{
    "mcpServers": {
        "apify": {
            "url": "https://mcp.apify.com?tools=automation-lab/etsy-scraper"
        }
    }
}
```

Your AI assistant will use OAuth to authenticate with your Apify account on first use.

#### Example prompts

Once connected, try asking your AI assistant:

- "Use automation-lab/etsy-scraper to find the 50 most relevant handmade silver rings under $100 with free shipping and export results as a table."
- "Search Etsy for vintage denim jackets in the clothing category, sorted by lowest price, and summarize the price range and top shops."
- "Find the 20 most recently listed custom wedding invitations on Etsy and list each product name, shop, and price."

Learn more in the [Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp).

### Is it legal to scrape Etsy?

Etsy Scraper accesses only publicly available product listing data from Etsy search results — the same information any visitor sees when browsing [etsy.com](https://www.etsy.com). No login, no authentication, and no private data access is involved.

Scraping publicly available web data is generally legal based on the 2022 US Ninth Circuit ruling in *hiQ Labs v. LinkedIn*, which established that scraping public data does not violate the Computer Fraud and Abuse Act (CFAA). The European Court of Justice has similarly held that publicly available data can be lawfully collected.

However, you should:

⚖️ **Review Etsy's Terms of Service** before scraping at scale — while public data extraction is broadly legal, Etsy's ToS may restrict automated access. Compliance with ToS is your responsibility.

🔒 **Never collect personal data without lawful basis** — this actor extracts only product and shop data, not buyer or payment information.

📏 **Be respectful with volume** — the scraper includes built-in delays between pages (1.5 seconds) and respects rate limits. Avoid running dozens of concurrent large-scale scrapes.

🏢 **Consult legal counsel** if you plan to use scraped data commercially at scale, especially across jurisdictions with varying data protection regulations.

For more details, see Apify's guide on [web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### FAQ

**Why am I getting only ~16 results instead of 64+?**
You likely didn't select a category. Without a category, the scraper uses Etsy's `/market/` path which returns a limited number of results. Select a specific category (e.g., "Jewelry & Accessories") to unlock full pagination with up to 64 products per page and thousands of results across pages.

**Can I scrape individual Etsy product detail pages?**
No. This scraper extracts data from Etsy search result pages only. Individual listing pages (`/listing/123456`) use heavy JavaScript rendering and more aggressive DataDome protection that requires a browser-based approach. The search results provide comprehensive product data including price, rating, shop, and availability — sufficient for most research use cases.

**Why do some products have `null` for rating?**
Products that have not yet received any reviews don't display a rating on Etsy. The scraper returns `null` for these items rather than a misleading zero — this is the correct representation of an unrated listing.

**The scraper returned "blocked" warnings. What should I do?**
Ensure you're using residential proxies (the default configuration). If blocks persist, try reducing `maxItems` or waiting a few minutes before retrying. Etsy's anti-bot detection can be more aggressive during peak traffic hours. The scraper automatically retries each request up to 5 times with fresh proxy sessions — occasional blocks are handled transparently.

**How is this different from the official Etsy API?**
The official Etsy API requires an approved OAuth application, enforces strict rate limits, and does not expose search result pages. This scraper extracts the same data any browser visitor sees from public search pages, with no API key required, no rate limit approvals, and no OAuth setup.

**How often can I run this scraper?**
There's no run frequency limit from the scraper side. Use Apify Schedules to run hourly, daily, or weekly. For price monitoring, daily runs are typically sufficient and keep costs low. You can also trigger runs via API as part of a larger pipeline.

### Other e-commerce scrapers

🛒 [Amazon Scraper](https://apify.com/automation-lab/amazon-scraper) — Extract product data, prices, ratings, and seller info from Amazon search results

🏷️ [eBay Scraper](https://apify.com/automation-lab/ebay-scraper) — Scrape eBay product listings, prices, bids, and seller information

🛒 [Walmart Scraper](https://apify.com/automation-lab/walmart-scraper) — Scrape Walmart product data, prices, and availability

📋 [Craigslist Scraper](https://apify.com/automation-lab/craigslist-scraper) — Scrape Craigslist listings by keyword and city

🛍️ [Shopify Store Scraper](https://apify.com/automation-lab/shopify-scraper) — Extract products, collections, and reviews from any Shopify-powered store

👗 [Poshmark Scraper](https://apify.com/automation-lab/poshmark-scraper) — Extract fashion and resale listings from Poshmark

💻 [Newegg Scraper](https://apify.com/automation-lab/newegg-scraper) — Scrape electronics and tech products from Newegg

🔎 [Google Shopping Scraper](https://apify.com/automation-lab/google-shopping-scraper) — Scrape Google Shopping results for cross-marketplace price comparison

🎯 [Fiverr Scraper](https://apify.com/automation-lab/fiverr-scraper) — Extract Fiverr gig listings, seller info, and pricing for service marketplace research

# Actor input Schema

## `searchQuery` (type: `string`):

What to search for on Etsy (e.g., 'handmade jewelry', 'vintage dress', 'custom gift').

## `category` (type: `string`):

Etsy category to search within. Leave empty for all categories.

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

Maximum number of products to scrape.

## `sort` (type: `string`):

How to sort search results.

## `minPrice` (type: `number`):

Minimum price filter in USD.

## `maxPrice` (type: `number`):

Maximum price filter in USD.

## `freeShipping` (type: `boolean`):

Only show products with free shipping.

## `onSale` (type: `boolean`):

Only show products that are on sale.

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

Proxy settings. Residential proxies recommended for Etsy.

## Actor input object example

```json
{
  "searchQuery": "handmade necklace",
  "maxItems": 20,
  "sort": "most_relevant",
  "freeShipping": false,
  "onSale": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `products` (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 = {
    "searchQuery": "handmade necklace",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/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 = {
    "searchQuery": "handmade necklace",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/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 '{
  "searchQuery": "handmade necklace",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call automation-lab/etsy-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Etsy Scraper",
        "description": "Scrape Etsy product listings by keyword, category, or shop URL. Extract titles, prices, ratings, review counts, shop names, shipping info, and product images. Process thousands of listings in a single run. Export to JSON, CSV, or Excel for market research and competitive analysis.",
        "version": "0.1",
        "x-build-id": "H5YdQbLdcDr8m0GEp"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~etsy-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-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/automation-lab~etsy-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-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/automation-lab~etsy-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-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",
                "required": [
                    "searchQuery"
                ],
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "What to search for on Etsy (e.g., 'handmade jewelry', 'vintage dress', 'custom gift')."
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "",
                            "jewelry-and-accessories",
                            "clothing-and-shoes",
                            "home-and-living",
                            "wedding-and-party",
                            "toys-and-entertainment",
                            "art-and-collectibles",
                            "craft-supplies-and-tools",
                            "vintage",
                            "gifts",
                            "electronics-and-accessories",
                            "bags-and-purses",
                            "bath-and-beauty"
                        ],
                        "type": "string",
                        "description": "Etsy category to search within. Leave empty for all categories."
                    },
                    "maxItems": {
                        "title": "Max Products",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of products to scrape.",
                        "default": 64
                    },
                    "sort": {
                        "title": "Sort Order",
                        "enum": [
                            "most_relevant",
                            "lowest_price",
                            "highest_price",
                            "recently_listed"
                        ],
                        "type": "string",
                        "description": "How to sort search results.",
                        "default": "most_relevant"
                    },
                    "minPrice": {
                        "title": "Min Price (USD)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Minimum price filter in USD."
                    },
                    "maxPrice": {
                        "title": "Max Price (USD)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Maximum price filter in USD."
                    },
                    "freeShipping": {
                        "title": "Free Shipping Only",
                        "type": "boolean",
                        "description": "Only show products with free shipping.",
                        "default": false
                    },
                    "onSale": {
                        "title": "On Sale Only",
                        "type": "boolean",
                        "description": "Only show products that are on sale.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential proxies recommended for Etsy."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
