# Etsy Scraper — Product Research, Shops & Listings (`umararshad2/etsy-search-listings-scraper`) Actor

Etsy scraper for product research: scrape Etsy search results, categories, shops and listings to JSON/CSV. Titles, prices, shops, badges, ad flags, plus optional favorites, variations, category and description. No login. $1.20/1k.

- **URL**: https://apify.com/umararshad2/etsy-search-listings-scraper.md
- **Developed by:** [Umar Arshad](https://apify.com/umararshad2) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 6 total users, 2 monthly users, 94.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 listing scrapeds

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Etsy Scraper — Search, Shop & Listing Data

Scrape **Etsy search results, categories, shops and individual listings** into clean JSON, CSV or Excel. Get titles, prices, currencies, shop names, images, badges (Bestseller, Free shipping, Sale…) and ad flags for every listing — and switch on **full listing details** to add description, category, favorites, all images, variations, shop rating and ships-from location.

**$1.20 per 1,000 listings.** No login, no Etsy API key, no browser extension. Public data only.

> Unofficial tool. Not affiliated with, endorsed by, or sponsored by Etsy, Inc.

#### What you get in one run

Every run saves the listing rows (**Output** tab, CSV/Excel/JSON) **plus a free market snapshot** in the key-value store record `OUTPUT`: listing count, price min/median/max and quartiles, unique shops, top 5 shops, ad share and badge counts. The run's status line sums it up too.

Real result of the prefilled input (`handmade candles`, 20 listings, ship to US, details off) on **2026-10-20**. It took 34 s and cost **$0.024** at FREE-tier prices (20 × $0.0012):

> Scraped 20 Etsy listings. Prices 5.83–79.9 USD (median 20.95) across 19 shops; top shop: TheThriftyWick.

| Snapshot field | Value |
|---|---|
| Price range / median | $5.83 – $79.90 / $20.95 (p25 $11.65, p75 $30.00) |
| Unique shops | 19 (top: TheThriftyWick, 2 listings) |
| Ad (sponsored) share | 35% |
| Badges | Sale 10 · Bestseller 5 · Free Shipping 1 |

First 5 listing rows from that run (titles shortened; every row also has `listingId`, `url`, `shopUrl`, `imageUrl`, `searchQuery`, `sourceUrl`, `scrapedAt`):

| title | price | currency | shopName | badges | isAd |
|---|---|---|---|---|---|
| Brown Red Burgundy Gold Tan Summer Fall Pillar Candle… | 22.5 | USD | SeafrontCandles | Bestseller, Sale | true |
| Handmade Soy Candle in Jesmonite Bowl, Neutral Marbled Decor… | 36 | USD | UpsideDownOwlFarm | – | true |
| JUMBO CANDLE 100 oz Extra Large Candle… | 72.1 | USD | EliteCandlez | Bestseller, Sale | true |
| Personalized Peony Candle Wedding Favors: Custom Scented Soy… | 79.9 | USD | AngelBornGifts | – | true |
| Fall Dough Bowl Candle, Orange Spice Botanical Decor… | 23.99 | USD | FlameCozy | Bestseller, Sale | false |

📥 **Download the full 20-row CSV from this run:** https://api.apify.com/v2/datasets/LlzzBsDWwKaig6LqT/items?format=csv\&clean=1

**Want more per listing?** Switch on **Include listing details** to add description, tags, materials, category, favorites, all images, variations, shop rating and ships-from. That's $4 per 1,000 extra, charged only for listings whose details were actually fetched. Try it on 3–5 listings first.

#### How does the price compare?

| Etsy Actor on Apify Store | Price per 1,000 listings |
|---|---|
| **This Actor (umararshad2/etsy-search-listings-scraper)** | **$1.20** search listings · **+$4.00** only if you turn on full details |
| epctex/etsy-scraper | $3.40 |
| cirkit/etsy-shop-product-scraper | $3.50 |
| astravalabs/etsy-listings-scraper | $4.00 |
| yumitori/etsy-search-scraper | $6.00 |
| yumitori/etsy-listings-scraper | $8.00 |

<sub>Competitor prices are their per-result Store prices as listed on Apify Store on 2026-10-08. Check each Actor's pricing page for current rates.</sub>

### What can this Etsy scraper do?

- 🔎 **Search Etsy by keyword**: one or many keywords, each paged automatically.
- 🔗 **Paste any Etsy URL**: search (`/search?q=…`), category (`/c/…`), market (`/market/…`), **shop** (`/shop/Name`) or **single listing** (`/listing/123…`).
- 🧾 **Full listing details (optional)**: description, category path, favorites count, all full-size images, variations (size/color/scent options), shop rating & review count, ships-from location, listed date, availability, price range and buyer review highlights.
- 🎯 **Etsy filters built in**: min/max price, free shipping, on sale, digital downloads, Star Sellers, ship-to country, sort by relevancy/newest/price.
- 💸 **Pay only for results**: $1.20 per 1,000 listings, plus $4 per 1,000 for details only when you turn them on.
- 🛡️ **Built to keep working**: Apify's UNBLOCKER proxy handles Etsy's anti-bot. Blocked pages are retried automatically, and you get partial results instead of a failed run.

### Who uses it?

| Use case | What you get |
|---|---|
| **Etsy product research / niche finding** | Prices, badges, favorites and categories for any keyword, so you can spot gaps and proven demand |
| **Print-on-demand (POD) trend research** | Newest listings for a niche (`sort: newest`), digital-only filter, price bands |
| **Price monitoring** | Schedule daily runs on keywords or shops and track price, sale badge and availability changes |
| **Competitor shop analysis** | Paste a shop URL to pull its whole catalog plus shop rating, reviews and sales |
| **Etsy ads research** | `isAd` shows which listings are sponsored placements for a keyword |
| **Catalog / dataset building** | Full descriptions, images and variations for ML, analytics or price-comparison sites |

### How to scrape Etsy

1. Click **Try for free**. The input is prefilled with `handmade candles`, 20 listings and details off, so your first run takes about a minute (most of it is Etsy's anti-bot proxy loading the first page).
2. Enter your keywords **or** paste Etsy URLs (search, category, shop or listing).
3. Optional: set filters, or tick **Include full listing details**.
4. Click **Start**, then download the results as JSON, CSV, Excel or HTML, or pull them via API / integrations (Google Sheets, Make, Zapier, n8n, webhooks).

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

Pay-per-event pricing. You pay only for listings delivered to your dataset.

| Event | Price | When |
|---|---|---|
| `listing-scraped` | **$0.0012** ($1.20 / 1,000) | every listing row |
| `listing-detail-scraped` | **$0.004** ($4 / 1,000) | only if details are on **and** the listing page loaded |
| Actor start | $0.00005 | once per run |

**Examples**

| Job | Cost |
|---|---|
| 100 listings for one keyword | **~$0.12** |
| 1,000 listings across 10 keywords | **~$1.20** |
| 100 listings **with full details** | **~$0.52** |
| 1,000 listings with full details | **~$5.20** |

Apify's free plan includes monthly platform credit, enough for several thousand search listings. No proxy or compute charges are passed on to you. If a listing page can't be loaded, you still get the search data for that listing and are **not** charged the detail event.

### Use cases with ready-to-copy inputs

Paste any of these into the **JSON** tab of the input form and click **Start**.

**1. Track a competitor's shop (catalog + prices).** Schedule it daily to see price changes, new listings and sale badges. Shop rating, reviews and total sales are included.

```json
{
  "startUrls": ["https://www.etsy.com/shop/TopWosk"],
  "maxItems": 100,
  "includeDetails": false
}
```

**2. Niche price tracking.** Pull a price band for a niche and compare averages over time.

```json
{
  "searchQueries": ["personalized necklace"],
  "minPrice": 15,
  "maxPrice": 80,
  "sort": "price_asc",
  "shipTo": "US",
  "maxItems": 100
}
```

**3. Trending product research.** Get the newest listings in a niche, with favorites and category from full details, to spot what's taking off.

```json
{
  "searchQueries": ["digital planner", "printable wall art"],
  "sort": "newest",
  "digitalOnly": true,
  "includeDetails": true,
  "maxItems": 50
}
```

**4. Sale / discount watch.** See which Star Sellers are discounting in your category right now.

```json
{
  "searchQueries": ["soy candle gift"],
  "onSale": true,
  "starSellerOnly": true,
  "shipTo": "US",
  "maxItems": 50
}
```

### Input

Prefilled example (fast first run, ~20 listings, no details):

```json
{
  "searchQueries": ["handmade candles"],
  "maxItems": 20,
  "includeDetails": false,
  "sort": "relevancy",
  "shipTo": "US"
}
```

Bigger keyword job:

```json
{
  "searchQueries": ["handmade candles", "soy candle gift"],
  "maxItems": 200,
  "sort": "relevancy",
  "shipTo": "US"
}
```

Shop + listing URLs, with filters and details:

```json
{
  "startUrls": [
    "https://www.etsy.com/shop/YourCompetitorShop",
    "https://www.etsy.com/search?q=personalized+necklace&order=date_desc",
    "https://www.etsy.com/listing/1847202972"
  ],
  "includeDetails": true,
  "minPrice": 15,
  "maxPrice": 80,
  "onSale": true,
  "maxItems": 100
}
```

| Field | Description |
|---|---|
| `searchQueries` | Etsy keywords. Each is searched and paged independently |
| `startUrls` | Etsy search / category / market / shop / listing URLs |
| `maxItems` | Max listings in the dataset (deduplicated by listing ID). Default 50; the form is prefilled with 20 |
| `maxPages` | Max result pages per keyword / URL (default 10) |
| `includeDetails` | Open each listing page for description, category, favorites, images, variations, shop rating… |
| `sort` | `relevancy`, `newest`, `price_asc`, `price_desc` |
| `minPrice` / `maxPrice` | Price range in the ship-to country's currency |
| `freeShipping`, `onSale`, `digitalOnly`, `starSellerOnly` | Etsy's own search filters |
| `shipTo` | Buyer country (US, GB, CA, AU, DE…), which controls the listings and currency Etsy shows |

### Output

Search / shop row:

```json
{
  "listingId": "4450791179",
  "title": "Soy Wax Candles",
  "url": "https://www.etsy.com/listing/4450791179/soy-wax-candles",
  "price": 10.8,
  "currency": "USD",
  "shopName": "CameronRoseCandles",
  "shopUrl": "https://www.etsy.com/shop/CameronRoseCandles",
  "imageUrl": "https://i.etsystatic.com/64321913/r/il/0ed6a2/8204721261/il_340x270.8204721261_o4ie.jpg",
  "badges": ["Free Shipping", "Sale"],
  "isAd": false,
  "searchQuery": "soy candle",
  "sourceUrl": "https://www.etsy.com/search?q=soy+candle&min=10&max=30&free_shipping=true",
  "scrapedAt": "2026-10-05T04:33:45.752Z",
  "source": "etsy"
}
```

With `includeDetails: true` (or a listing URL) these fields are added:

```json
{
  "detailStatus": "ok",
  "description": "3 Wick Pure Beeswax Candle… hand poured in small batches…",
  "category": "Home & Living > Home Decor > Candles & Home Fragrances > Candles",
  "favorites": 2248,
  "listedOn": "2026-10-04",
  "shopRating": 4.9,
  "shopReviewCount": 350,
  "shipsFrom": "Waterford, MI",
  "lowPrice": 24,
  "highPrice": 24,
  "availability": "InStock",
  "materials": ["Beeswax"],
  "images": ["https://i.etsystatic.com/…/il_fullxfull.7385134836_1z2r.jpg", "…"],
  "variations": [
    { "label": "Scent", "options": ["unscented", "Vanilla Chai Latte", "Ocean Mist", "…"] },
    { "label": "Color of Jar", "options": ["Purple", "Grey", "Pink", "White"] }
  ],
  "reviewHighlights": ["Smells amazing", "Great quality", "Well packaged"],
  "isDigitalDownload": false,
  "tags": null
}
```

Shop URLs also add `shopRating`, `shopReviewCount` and `shopSales` to every row.

### FAQ

**How many listings per search page?** Etsy renders ~12 listings per search page in HTML and loads the rest with JavaScript. Search-only mode pages deeper to reach your `maxItems`. With details on, the Actor also picks up the lazy-loaded listings (~48 per page) and fetches each one's listing page.

**Does it return Etsy tags?** Only when Etsy includes them in the public page (it usually doesn't on English pages), so `tags` is often `null`. Category, materials and description are returned reliably.

**Why are some detail fields null?** Etsy doesn't show every field on every listing. For example, favorites and ships-from appear on most listings but not all. Fields that aren't shown are returned as `null`, never guessed.

**Which currency are prices in?** The currency Etsy shows for your `shipTo` country (default US → USD). Every row has a `currency` field.

**Can I monitor prices over time?** Yes. Save your input as a task, schedule it daily or weekly, and connect a Google Sheets or webhook integration.

**Is scraping Etsy legal?** This Actor collects only publicly visible data, doesn't log in, and doesn't access private or personal account data. Make sure your use complies with applicable laws and Etsy's terms, and don't use personal data without a lawful basis.

**A run returned fewer items than expected?** Etsy's anti-bot occasionally blocks a page even after retries. The run still succeeds with the listings it got, and the status message says how many pages were skipped. Re-running usually fills the gap.

### Related

- **Validate niche demand before researching listings:** [Google Trends Scraper](https://apify.com/umararshad2/google-trends-scraper) — keyword interest over time, peak months, and rising related searches.
- **Job market research:** [LinkedIn Jobs Scraper](https://apify.com/umararshad2/linkedin-jobs-scraper) — public LinkedIn job cards (no login) with optional full descriptions.
- **Multi-country job listings:** [Adzuna Jobs Scraper](https://apify.com/umararshad2/adzuna-jobs-scraper) — Adzuna search across 18 countries.
- Need help or a custom field? Open an issue on the Actor's **Issues** tab.

***

Etsy is a trademark of Etsy, Inc. This Actor is an independent tool and is not affiliated with Etsy.

# Actor input Schema

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

One or more Etsy search keywords, e.g. `handmade candles`, `personalized necklace`, `wedding invitations`. Each keyword is paged independently. Provide keywords and/or Start URLs.

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

Paste public Etsy URLs: search (`https://www.etsy.com/search?q=mug`), category (`/c/...`), market (`/market/...`), shop (`https://www.etsy.com/shop/ShopName`) or a single listing (`https://www.etsy.com/listing/123456789`). Listing URLs always return full details. Login, cart and /api/ URLs are ignored.

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

Maximum number of listings in the dataset (deduplicated by listing ID). Default and form prefill are 20 for a cheap first run (about a minute). Raise it for bigger jobs. You only pay for listings delivered.

## `maxPages` (type: `integer`):

Max result pages per keyword, search URL or shop. Etsy server-renders ~12 listings per search page (the rest load via JavaScript); with “Include full listing details” on, the Actor also collects those lazy-loaded listings (~48 per page). Default 10.

## `includeDetails` (type: `boolean`):

Open each listing page and add description, tags, materials, category, all images, favorites, listing rating & review count, variations, ships-from and availability. Slower, and charged as an extra `listing-detail-scraped` event per listing. If a listing page can't be loaded, you still get (and only pay for) the search-card data.

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

Etsy search sort order (applies to keywords and search URLs without their own order).

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

Only listings priced at or above this amount (in the ship-to country's currency, e.g. USD for US).

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

Only listings priced at or below this amount.

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

Only listings with free shipping to the ship-to country.

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

Only discounted listings.

## `digitalOnly` (type: `boolean`):

Only instant-download (digital) listings — printables, SVGs, patterns, templates.

## `starSellerOnly` (type: `boolean`):

Only listings from Etsy Star Sellers.

## `shipTo` (type: `string`):

Two-letter country code (US, GB, CA, AU, DE, FR, …). Etsy shows listings and prices for buyers in this country.

## `country` (type: `string`):

Alias for Ship-to country; used only when Ship-to is empty.

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

Etsy blocks datacenter IPs. Keep the default UNBLOCKER group (recommended). Blocked pages are retried automatically with fresh sessions and alternate exit countries.

## `useMockData` (type: `boolean`):

Developer option: parse bundled fixture HTML instead of calling Etsy.

## `debugSaveHtml` (type: `boolean`):

Developer option: store the first few fetched pages in the key-value store.

## Actor input object example

```json
{
  "searchQueries": [
    "handmade candles"
  ],
  "maxItems": 20,
  "maxPages": 10,
  "includeDetails": false,
  "sort": "relevancy",
  "freeShipping": false,
  "onSale": false,
  "digitalOnly": false,
  "starSellerOnly": false,
  "shipTo": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  },
  "useMockData": false,
  "debugSaveHtml": false
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset of Etsy listings: title, price, currency, shop, image, badges, ad flag; with details: description, category, favorites, images, variations, shop rating, ships-from.

## `snapshot` (type: `string`):

Run summary: listing count, price min/median/max, top shops, ad share and badges.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "handmade candles"
    ],
    "maxItems": 20,
    "includeDetails": false,
    "shipTo": "US",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("umararshad2/etsy-search-listings-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["handmade candles"],
    "maxItems": 20,
    "includeDetails": False,
    "shipTo": "US",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "handmade candles"
  ],
  "maxItems": 20,
  "includeDetails": false,
  "shipTo": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call umararshad2/etsy-search-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,umararshad2/etsy-search-listings-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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