# Etsy Product Scraper (`sian.agency/etsy-product-scraper`) Actor

Scrape Etsy products by keyword or search URL. Fast overview (title, price, shop, rating, reviews, thumbnail) or full detail (full image gallery, tags, favorites, category, availability, description). Clean JSON/CSV, no code.

- **URL**: https://apify.com/sian.agency/etsy-product-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.80 / 1,000 overview product extracteds

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 Product Scraper — Listings, Prices, Shops & Reviews 🛍️

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-AliExpress Product Scraper](https://img.shields.io/badge/Store-AliExpress%20Product%20Scraper-FF4747)](https://apify.com/sian.agency/aliexpress-product-scraper?fpr=sian) [![Store-1688 Wholesale Scraper](https://img.shields.io/badge/Store-1688%20Wholesale%20Scraper-FF6A00)](https://apify.com/sian.agency/alibaba-1688-wholesale-scraper?fpr=sian) [![Store-Amazon ASIN Lookup](https://img.shields.io/badge/Store-Amazon%20ASIN%20Lookup-FF9900)](https://apify.com/sian.agency/amazon-asin-lookup?fpr=sian)

#### 🎉 Turn any Etsy search into a clean product dataset — prices, shops, ratings, reviews, favorites & images
##### Built for e-commerce sellers, sourcing teams, and market researchers who need Etsy data at scale

---

### 📋 Overview

**Need Etsy data without copy-pasting listings one by one?** This scraper turns any Etsy keyword search or search URL into a structured dataset — perfect for price monitoring, competitor research, and product sourcing.

**Why thousands of professionals choose us:**
- ✅ **Two modes, one tool**: a fast, cheap *overview* for big catalogs, or *full detail* with the complete image gallery, tags, favorites and description
- ⚡ **Search by keyword or URL**: type a term or paste a filtered Etsy search — your filters and sort carry through automatically
- 🎯 **Rich, clean fields**: title, price, currency, shop, star rating, review count, favorites, category, tags, images — ready for Excel, Sheets or your database
- 💰 **Pay only for results**: per-product pricing with a free tier to try it risk-free
- 💎 **Dual-currency**: every price is mirrored to USD using a live daily exchange rate
- ✨ **No code, no account**: run it from the dashboard, API, or your favorite automation tool

---

### ✨ Features

- 🔎 **Keyword & URL search** — search any term, or paste an Etsy search URL with filters and sort baked in
- ⚡ **Overview mode** — one row per search card: title, price, shop, rating, reviews, thumbnail
- 📄 **Detail mode** — open each product for the full image gallery, tags, favorites, category, availability and description
- 🎯 **Listing targeting** — in detail mode, scrape specific listing URLs or IDs directly
- 💲 **Built-in filters** — price range, sort order, free-shipping only
- 💵 **Dual-currency** — automatic USD conversion with a live FX rate stamped on every row
- 🖼️ **Thumbnail-first rows** — a ready-to-display hero image on every product
- 📦 **Clean exports** — JSON, CSV and Excel straight from the dataset

---

### 🎬 Quick Start

Pick a scrape mode, enter a keyword (or paste a search URL), and run. Results stream into the dataset as products are found. Export to JSON, CSV or Excel when it finishes.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~etsy-product-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "overview", "query": "leather wallet", "maxResults": 100}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your mode

Pick **Overview** for a fast, cheap product list, or **Detail** for the full data on each item.

#### Step 2: Enter your search

Type a keyword and set optional filters (price, sort, free shipping), or paste an Etsy search URL.

#### Step 3: Run and export

Start the actor and watch products fill the dataset. Download as JSON, CSV or Excel.

**That's it! In a few minutes, you'll have:**

- A clean table of Etsy products
- Prices, shops, ratings and reviews
- Images, tags and categories ready to analyze

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast list) or `detail` (full product data) |
| searchMode | string | No | `byQuery` (keyword) or `bySearchUrl` (paste a search URL) |
| query | string | No | Keyword to search Etsy for |
| searchUrls | array | No | One or more Etsy search URLs (with `?q=`) |
| listingUrls | array | No | Specific listing URLs to scrape (detail mode) |
| listingIds | array | No | Specific numeric listing IDs to scrape (detail mode) |
| order | string | No | Sort: most relevant, price, newest, highest reviews |
| minPrice / maxPrice | integer | No | Price range filter (USD) |
| freeShipping | boolean | No | Only products with free shipping |
| maxResults | integer | No | Max products to return (FREE: 25, PAID: unlimited) |

**Example — keyword overview:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byQuery",
  "query": "ceramic mug",
  "order": "highest_reviews",
  "maxPrice": 50,
  "maxResults": 200
}
```

**Example — full detail by search URL:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://www.etsy.com/search?q=leather+wallet&order=price_asc"],
  "maxResults": 50
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **20+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| thumbnail | string | Hero product image |
| listing\_id | number | Etsy listing ID |
| title | string | Product title |
| url | string | Canonical product URL |
| price | number | Current price |
| currency | string | Currency code (e.g. USD) |
| price\_usd | number | Price converted to USD |
| shop\_name | string | Seller / shop name |
| rating | number | Average star rating |
| review\_count | number | Number of reviews |
| num\_favorers | number | Favorites count (detail) |
| category | string | Breadcrumb category (detail) |
| tags | array | Product tags (detail) |
| images | array | Full image gallery |
| description | string | Product description (detail) |

**Example:**

```json
{
  "thumbnail": "https://i.etsystatic.com/.../il_fullxfull.jpg",
  "listing_id": 1207159171,
  "title": "Personalized Leather Wallet, Custom Engraved Mens Wallet",
  "url": "https://www.etsy.com/listing/1207159171/personalized-leather-wallet-custom",
  "price": 29.99,
  "currency": "USD",
  "price_usd": 29.99,
  "shop_name": "LeatherCraftCoShop",
  "rating": 4.8,
  "review_count": 1432,
  "num_favorers": 2847,
  "category": "Bifold Wallets",
  "tags": ["leather wallet", "personalized gift", "mens wallet"],
  "image_count": 3,
  "source": "detail"
}
```

***

### 💼 Use Cases & Examples

#### 1. Price Monitoring

**E-commerce sellers tracking competitor pricing across a niche.**

**Input:** A keyword like `personalized jewelry` in overview mode, on a schedule.
**Output:** Daily price + rating snapshots for the whole category.
**Use:** Spot price moves, undercut competitors, time your promotions.

#### 2. Competitor & Shop Research

**Brand owners studying top sellers in their category.**

**Input:** A filtered search URL sorted by highest reviews.
**Output:** Shops, ratings, review counts and pricing for the leaders.
**Use:** Benchmark your shop and learn what's winning.

#### 3. Product Sourcing

**Dropshippers and resellers finding trending handmade products.**

**Input:** A trend keyword sorted by newest, with a price ceiling.
**Output:** Fresh listings with images, tags and prices.
**Use:** Build a sourcing shortlist in minutes.

#### 4. Market & Trend Analysis

**Analysts measuring demand and price distribution.**

**Input:** Broad keyword overview across hundreds of results.
**Output:** A dataset to chart price bands, ratings and review volume.
**Use:** Quantify a niche before you enter it.

#### 5. Catalog Enrichment

**Teams enriching a product list with live Etsy detail.**

**Input:** A list of listing URLs or IDs in detail mode.
**Output:** Full descriptions, tags, galleries and categories.
**Use:** Fill gaps in your own catalog or feed a recommender.

#### 6. Gift & Trend Discovery

**Content creators rounding up the best handmade finds.**

**Input:** A seasonal keyword sorted by relevance.
**Output:** Curated products with images and shop links.
**Use:** Publish gift guides and trend roundups fast.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/etsy-product-scraper').call({
  scrapeMode: 'overview',
  query: 'leather wallet',
  maxResults: 100
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/etsy-product-scraper').call(
    run_input={'scrapeMode': 'overview', 'query': 'leather wallet', 'maxResults': 100}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~etsy-product-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "overview", "query": "leather wallet"}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a sheet, notify a channel, or update your store

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 products** per run — full feature access, same quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** products per run
- Faster throughput, no caps
- Pay-per-result: you're only charged for products actually delivered

💰 **Fair, transparent pricing** — a low per-product rate with a free tier to start.

🔗 [View current pricing](https://apify.com/sian.agency/etsy-product-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many products can I scrape?**
A: FREE tier: 25 per run. PAID tier: unlimited.

**Q: Can I use my own Etsy search filters?**
A: Yes — paste a search URL and its filters and sort are carried through every page, or use the price/sort/shipping fields.

**Q: What's the difference between overview and detail mode?**
A: Overview is a fast, cheap list (price, shop, rating). Detail opens each product for the full gallery, tags, favorites, category and description.

**Q: What output formats are available?**
A: JSON, CSV and Excel — export directly from the Apify dataset.

**Q: Does it work with private or sold-out listings?**
A: It scrapes publicly accessible listings only.

**Q: Is this legal?**
A: Yes — we only extract publicly available data. See the legal section below.

***

### 🐛 Troubleshooting

**No results returned**

- Check your keyword spelling, or open the search URL in a browser to confirm it has results
- Loosen any price or free-shipping filters

**Fewer results than expected on the FREE tier**

- The FREE tier caps each run at 25 products — upgrade for unlimited

**Detail rows missing some fields**

- A few fields (favorites, tags, category) only exist in detail mode and depend on the listing; overview rows carry the core fields

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

### 🏷️ Trademark Disclaimer

This is an independent tool and is **not affiliated with, endorsed by, or sponsored by Etsy, Inc.** "Etsy" is a registered trademark of Etsy, Inc., used here under nominative fair use solely to describe the publicly available data this tool helps you collect. Use this actor responsibly and in accordance with applicable laws and the target site's terms.

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `scrapeMode` (type: `string`):

⚙️ **OVERVIEW vs DETAIL:**

- **Overview** (fast & cheap): one row per search-result card — title, price, shop, rating, review count, thumbnail. Best for price monitoring and large catalogs.
- **Detail** (full data): opens each product page — full image gallery, tags, favorites, breadcrumb category, availability and description. Best when you need the rich fields.

## `searchMode` (type: `string`):

🔎 **HOW TO REACH THE PRODUCTS:**

- **By Query** — type a keyword and use the filter fields below.
- **By Search URL** — paste one or more Etsy search URLs (filters and sort are carried over exactly).

💡 In Detail mode you can instead provide specific listing URLs or IDs below.

## `query` (type: `string`):

🔎 **KEYWORD SEARCH:** The free-text term to search Etsy for, e.g. `leather wallet`, `ceramic mug`, `personalized gift`.

Used when **Search Mode = By keyword query**. Combine with the price, sort and shipping filters below.

## `searchUrls` (type: `array`):

🔗 **SEARCH URL PROCESSING:** Paste one or more Etsy search URLs (each must contain a `?q=` term). Filters and sort in the URL are carried through every page.

💡 **TIP:** Set up your filters on etsy.com, then copy the address-bar URL.

📋 Use **Bulk edit** to paste multiple URLs (one per line).

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

📄 **SPECIFIC PRODUCTS:** Paste exact Etsy listing URLs (e.g. `https://www.etsy.com/listing/1207159171/...`). Each is opened and fully parsed. Only used in **Detail** scrape mode.

📋 Use **Bulk edit** to paste multiple URLs (one per line).

## `listingIds` (type: `array`):

🔢 **SPECIFIC PRODUCT IDS:** Numeric Etsy listing IDs (e.g. `1207159171`). Each is opened and fully parsed. Only used in **Detail** scrape mode.

## `order` (type: `string`):

↕️ **SORT:** Etsy's own sort order for keyword searches.

## `minPrice` (type: `integer`):

💲 **MIN PRICE:** Only return products at or above this price (USD). Leave empty for no minimum.

## `maxPrice` (type: `integer`):

💲 **MAX PRICE:** Only return products at or below this price (USD). Leave empty for no maximum.

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

🚚 **FREE SHIPPING:** Only return products that ship for free.

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

🔢 **RESULT CAP:** Maximum number of products to return.

**TIER-BASED LIMITS:**

- **FREE users:** up to 25 products per run
- **PAID users:** unlimited

The actor stops once this many products are collected.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byQuery",
  "query": "leather wallet",
  "order": "most_relevant",
  "freeShipping": false,
  "maxResults": 100
}
```

# Actor output Schema

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

The scraped Etsy product dataset (one row per listing).

## `scrapingSummary` (type: `string`):

HTML summary showing extracted and failed results with key run metrics.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/etsy-product-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/etsy-product-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 '{}' |
apify call sian.agency/etsy-product-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Etsy Product Scraper",
        "description": "Scrape Etsy products by keyword or search URL. Fast overview (title, price, shop, rating, reviews, thumbnail) or full detail (full image gallery, tags, favorites, category, availability, description). Clean JSON/CSV, no code.",
        "version": "1.0",
        "x-build-id": "NBD86EzfdO4ApuGX1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~etsy-product-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-etsy-product-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/sian.agency~etsy-product-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-etsy-product-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/sian.agency~etsy-product-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-etsy-product-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": {
                    "scrapeMode": {
                        "title": "⚙️ Scrape Mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "⚙️ **OVERVIEW vs DETAIL:**\n\n- **Overview** (fast & cheap): one row per search-result card — title, price, shop, rating, review count, thumbnail. Best for price monitoring and large catalogs.\n- **Detail** (full data): opens each product page — full image gallery, tags, favorites, breadcrumb category, availability and description. Best when you need the rich fields.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔎 Search Mode",
                        "enum": [
                            "byQuery",
                            "bySearchUrl"
                        ],
                        "type": "string",
                        "description": "🔎 **HOW TO REACH THE PRODUCTS:**\n\n- **By Query** — type a keyword and use the filter fields below.\n- **By Search URL** — paste one or more Etsy search URLs (filters and sort are carried over exactly).\n\n💡 In Detail mode you can instead provide specific listing URLs or IDs below.",
                        "default": "byQuery"
                    },
                    "query": {
                        "title": "🔎 Search Query",
                        "type": "string",
                        "description": "🔎 **KEYWORD SEARCH:** The free-text term to search Etsy for, e.g. `leather wallet`, `ceramic mug`, `personalized gift`.\n\nUsed when **Search Mode = By keyword query**. Combine with the price, sort and shipping filters below.",
                        "default": "leather wallet"
                    },
                    "searchUrls": {
                        "title": "🔗 Etsy Search URLs",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "🔗 **SEARCH URL PROCESSING:** Paste one or more Etsy search URLs (each must contain a `?q=` term). Filters and sort in the URL are carried through every page.\n\n💡 **TIP:** Set up your filters on etsy.com, then copy the address-bar URL.\n\n📋 Use **Bulk edit** to paste multiple URLs (one per line).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "listingUrls": {
                        "title": "📄 Listing URLs (Detail mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "📄 **SPECIFIC PRODUCTS:** Paste exact Etsy listing URLs (e.g. `https://www.etsy.com/listing/1207159171/...`). Each is opened and fully parsed. Only used in **Detail** scrape mode.\n\n📋 Use **Bulk edit** to paste multiple URLs (one per line).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "listingIds": {
                        "title": "🔢 Listing IDs (Detail mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "🔢 **SPECIFIC PRODUCT IDS:** Numeric Etsy listing IDs (e.g. `1207159171`). Each is opened and fully parsed. Only used in **Detail** scrape mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "order": {
                        "title": "↕️ Sort Order",
                        "enum": [
                            "most_relevant",
                            "price_asc",
                            "price_desc",
                            "date_desc",
                            "highest_reviews"
                        ],
                        "type": "string",
                        "description": "↕️ **SORT:** Etsy's own sort order for keyword searches.",
                        "default": "most_relevant"
                    },
                    "minPrice": {
                        "title": "💲 Minimum Price (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💲 **MIN PRICE:** Only return products at or above this price (USD). Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "💲 Maximum Price (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💲 **MAX PRICE:** Only return products at or below this price (USD). Leave empty for no maximum."
                    },
                    "freeShipping": {
                        "title": "🚚 Free Shipping Only",
                        "type": "boolean",
                        "description": "🚚 **FREE SHIPPING:** Only return products that ship for free.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "🔢 Max Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "🔢 **RESULT CAP:** Maximum number of products to return.\n\n**TIER-BASED LIMITS:**\n- **FREE users:** up to 25 products per run\n- **PAID users:** unlimited\n\nThe actor stops once this many products are collected.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
