# Etsy Scraper (`omkar-cloud/etsy-scraper`) Actor

Scrape Etsy products by keyword, search URL, category, or listing URL — prices, sale discounts, ratings, shops & badges. Full-detail mode adds description, variations, stock & materials. 26 marketplaces, any currency. $1 per 1,000 listings — the lowest price on the Store, no start fee.

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

## Pricing

from $1.00 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

# README

## Etsy Scraper — Extract Etsy Product Prices, Ratings & Shop Data

Scrape Etsy listings by keyword — prices with sale discounts, ratings, shops, badges, and images. No coding required.

Type a keyword (or paste any Etsy URL), click Start, and get one clean JSON record per listing: current price plus the struck-through original price and discount percent when on sale, rating with review count, shop name and link, bestseller/"Popular now" badges, sponsored and free-shipping flags, image and video links, and the direct Etsy link.

Need everything? Turn on **Scrape Full Listing Details** and every listing also comes with its full description, **stock quantity**, variation options (colors, sizes, …), materials, highlights, category breadcrumbs, all images with alt text, delivery estimate, bestseller and Star Seller flags, shop sales stats, recent buyer reviews, and the shop's FAQ section.

It scrapes **Etsy search URLs** too — paste a search results URL straight from your browser and the keyword, price range, on-sale/free-shipping filters, and page embedded in the URL are applied automatically. Market pages (`etsy.com/market/…`) and category pages (`etsy.com/c/…`) work as searches, and listing page URLs always return the fully-detailed record.

Covers every Etsy market: **26 regional marketplaces** and any display currency, up to **12,000 listings per keyword**, at **$1 per 1,000 listings** — the lowest price on the Apify Store, with **no start fee**.

**Rated Excellent — 4.6 based on 25 reviews** on [Trustpilot](https://www.trustpilot.com/review/omkar.cloud).

### Output example: Etsy product data in JSON

Each listing becomes one dataset item. Here is a search result row:

```json
{
  "query": "jewelry",
  "id": "550059739",
  "title": "14k Gold Diamond Solitaire Necklace: Dainty Bridal Jewelry",
  "link": "https://www.etsy.com/listing/550059739/14k-gold-diamond-solitaire-necklace",
  "image": {
    "link": "https://i.etsystatic.com/7003748/r/il/febe6d/4441477806/il_255x319.4441477806_h0w5.jpg",
    "large_link": "https://i.etsystatic.com/7003748/r/il/febe6d/4441477806/il_794xN.4441477806_h0w5.jpg"
  },
  "video_link": "https://v.etsystatic.com/video/upload/ac_none,du_15,q_auto:good/file_audee1.mp4",
  "pricing": {
    "amount": 80.08,
    "original_amount": 114.4,
    "discount_percent": 30,
    "currency": "USD"
  },
  "rating": { "value": 5.0, "review_count": 20700 },
  "badge": "Popular now",
  "shop": {
    "id": "7003748",
    "name": "DIAMONDFORLOVE",
    "link": "https://www.etsy.com/shop/DIAMONDFORLOVE"
  },
  "is_sponsored": false,
  "has_free_shipping": true
}
```

With **Scrape Full Listing Details** on (and always for listing page URLs), the same record grows into the full product profile:

```json
{
  "description": "Delicate gold body chain with a minimal Y-shaped design. Adjustable and lightweight...",
  "pricing": {
    "amount": 39.5,
    "currency": "USD",
    "is_in_stock": true,
    "quantity_available": 46
  },
  "is_bestseller": false,
  "is_star_seller": true,
  "accepts_returns": true,
  "estimated_delivery": "Order today to get by Sep 1-24",
  "images": [
    {
      "link": "https://i.etsystatic.com/48159131/r/il/f4bde5/7854608778/il_fullxfull.7854608778_5lyu.jpg",
      "alt": "Gold body chain necklace worn on front, delicate waist chain jewelry on model"
    }
  ],
  "variations": [{ "name": "Primary color", "options": ["Silver", "Gold"] }],
  "highlights": ["Made by UtopiaJewelleryStore", "Materials: Stainless steel", "Closure: Lobster claw"],
  "materials": ["Stainless Steel", "Gold Plated", "18k"],
  "categories": [
    { "name": "Jewelry", "link": "https://www.etsy.com/c/jewelry" },
    { "name": "Body Jewelry", "link": "https://www.etsy.com/c/jewelry/body-jewelry" }
  ],
  "shop": {
    "id": "48159131",
    "name": "UtopiaJewelleryStore",
    "link": "https://www.etsy.com/shop/UtopiaJewelleryStore",
    "sales_count": 534,
    "review_count": 81
  },
  "reviews": [
    {
      "author": "Shabana",
      "rating": 5.0,
      "date": "2026-04-30",
      "text": "Absolutely worth every penny! Love this soo much! Quality is great."
    }
  ],
  "faqs": [{ "question": "Custom and personalized orders", "answer": "We're delighted to offer customization options..." }]
}
```

*Trimmed for readability.* You can download the dataset as JSON, CSV, Excel, XML, or an HTML table.

### What data does the Etsy Scraper extract?

| Data group | Fields |
|------------|--------|
| Listing | Title, direct Etsy link, listing id, image + large image, video link, badge ("Popular now", "Bestseller", …) |
| Price | Current price, struck-through original price and discount percent when on sale, in your currency |
| Reputation | Rating value and review count, sponsored flag, free-shipping flag |
| Shop | Shop id, name, and direct shop link |
| Full details (detailed mode) | Description, stock quantity, variation options, materials, highlights, category breadcrumbs, all images with alt text, delivery estimate, returns policy |
| Seller signals (detailed mode) | Bestseller flag, Star Seller flag, shop sales count and review count, shop logo |
| Social proof (detailed mode) | Recent buyer reviews with author, rating, date, and text; shop FAQ section |

### How to scrape Etsy product data

1. Click **Try for free**.
2. Type one or more **keywords** — exactly what you would type into the Etsy search box. Or paste **Etsy URLs**: search results, market, and category URLs are scraped as listings, listing page URLs return one detailed record each.
3. Optionally set filters — price range, on-sale only, free shipping only, exclude sponsored — and pick your **marketplace** (26 regional Etsy sites) and display **currency**.
4. Click **Start** and wait for the run to finish.
5. Open the **Dataset** tab to preview your data, then download it as **JSON, CSV, Excel, XML, or an HTML table**.

No proxies, no browser setup, no CAPTCHA solving — you type a keyword and get structured data back.

### Input

```json
{
  "searchQueries": ["jewelry", "wall art"],
  "startUrls": [
    "https://www.etsy.com/search?q=gold+necklace&free_shipping=true",
    "https://www.etsy.com/listing/4447282937/gold-body-chain-necklace-adjustable"
  ],
  "maxResultsPerSearch": 100,
  "scrapeListingDetails": false,
  "minPrice": 10,
  "maxPrice": 100,
  "onSaleOnly": false,
  "freeShippingOnly": false,
  "excludeSponsored": false,
  "locale": "us",
  "currency": "USD"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `searchQueries` | array | Keywords to search — each returns up to 12,000 listings. |
| `startUrls` | array | Etsy URLs — search results URLs (their embedded keyword, filters, and page override the fields below), market pages, category pages, and/or listing page URLs (always scraped with full details). |
| `maxResultsPerSearch` | integer | Max listings per keyword or search URL (default 100, up to 12,000). Controls your cost. |
| `scrapeListingDetails` | boolean | Off by default. When enabled, every search result also gets the full product profile — description, stock, variations, materials, images, shop stats, reviews, FAQs. |
| `minPrice` / `maxPrice` | integer | Price range in your currency. Filtered-out listings are never billed. |
| `onSaleOnly` | boolean | Only listings with an active discount. |
| `freeShippingOnly` | boolean | Only listings that ship free. |
| `excludeSponsored` | boolean | Skip Etsy ads — organic results only. |
| `locale` | string | One of 26 regional Etsy marketplaces (default `us`). |
| `currency` | string | Display currency code — USD, EUR, GBP, INR, … Empty = the marketplace's home currency. |

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

Scraping Etsy costs **$1 per 1,000 listings** ($0.001 per listing) — the lowest price on the Apify Store, with **no Actor start fee**.

With **Scrape Full Listing Details** on (and for listing page URLs), each listing — description, stock, variations, materials, images, shop stats, reviews, FAQs — is billed at **$2.50 per 1,000 detailed listings** in total. Every row is billed at exactly one rate — standard or detailed — and the detailed rate applies only when the full details are actually returned.

Apify gives you **$5 in free credits** every month, so you can scrape your first **5,000 listings** (or 2,000 fully-detailed listings) free and test the Etsy Scraper before paying anything.

### FAQs

#### Why scrape Etsy?

- **Price monitoring & repricing** — track competitor prices, sale discounts, and stock levels for your niche, in any of 26 markets and currencies.
- **Product research** — find what sells: bestseller badges, review counts, and shop sales stats show demand before you invest in a product line.
- **Trend analysis** — pull thousands of listings per keyword and map price distributions, sale depth, and free-shipping coverage across categories.
- **Lead generation** — every row carries the shop name and link, so you can build lists of active sellers in any niche.

#### Can I scrape listings from an Etsy search URL?

Yes. Paste any `etsy.com/search?q=…` URL from your browser and the Actor reads everything embedded in it — keyword, price range (`min`/`max`), on-sale and free-shipping filters, regional site, and page — and applies it automatically. URL parameters take priority over the form fields, so the results match what you saw in your browser. Market pages (`etsy.com/market/gold_necklace`) and category pages (`etsy.com/c/jewelry/…`) are scraped as the matching search.

#### What does "Scrape Full Listing Details" add?

The full product profile: description, **live stock quantity**, variation options (colors, sizes, personalization), materials, highlights, category breadcrumbs, every image with alt text, delivery estimate, returns policy, bestseller and **Star Seller** flags, shop sales and review counts, recent buyer reviews, and the shop's FAQs. Listing page URLs pasted into `startUrls` always include these details.

#### Can I scrape multiple keywords in one run?

Yes — add as many keywords and URLs as you like. Every row carries a `query` field (or `input_url` for listing pages) so you can tell them apart in one dataset.

#### Will I be charged twice if the same listing appears in two searches?

No. Listings are deduplicated per run — a listing ranking under several keywords or pasted twice is scraped and billed only once. Every row is billed at exactly one rate: $1/1,000 standard or $2.50/1,000 detailed. Filtered-out listings are never billed, and if a full-details fetch fails, you keep the search result card and pay only the standard rate for it.

#### How accurate is the scraped Etsy data?

It comes straight from live Etsy pages — real prices and discounts, real ratings, real stock, in the same structure you see on the site.

#### Is it legal to scrape Etsy?

The Actor extracts publicly available data only — listings, prices, and ratings visible to any visitor. It collects no personal data behind logins. You are responsible for how you use the data; consult a lawyer if unsure about your use case.

### Support

Built by developers, for developers — when you reach out, you talk to the engineers who built the Actor, not a support script. Message us anytime and we'll resolve your query within 1 working day.

[![Contact Us on WhatsApp about Etsy Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/whatsapp-us.png)](https://api.whatsapp.com/send?phone=918178804274\&text=I%20have%20a%20question%20about%20the%20Etsy%20Scraper.)

Email: [happy.to.help@omkar.cloud](mailto:happy.to.help@omkar.cloud?subject=Etsy%20Scraper%20Question)

[![Email Us about Etsy Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/ask-on-email.png)](mailto:happy.to.help@omkar.cloud?subject=Etsy%20Scraper%20Question)

### Love It? Star It! ⭐

From one business owner to another: if this Actor saved you hours of copying product prices off Etsy, please [rate the Etsy Scraper on Apify](https://apify.com/omkar-cloud/etsy-scraper/reviews).

Here's why it matters: most people judge an Actor by its reviews before trying it. Your rating helps the next person — someone deciding whether this Actor really delivers clean Etsy data — hit "Try for free" with confidence, and it helps the Actor rank higher in the Apify Store.

It takes only 1 second, and means the world to me.

# Actor input Schema

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

Keywords to search — each is searched separately and returns up to 12,000 listings. Rows carry a `query` field so you can tell keywords apart.

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

Search results, market, category, and/or listing page URLs — you can mix them. Listing pages are always scraped with full details (billed at the detailed-listing rate).

## `maxResultsPerSearch` (type: `integer`):

Maximum number of listings to scrape per keyword or search URL (up to 12,000 — Etsy's own ceiling of 250 pages × 48). Use this to control your cost (1,000 listings ≈ $1). Ignored for listing page URLs.

## `scrapeListingDetails` (type: `boolean`):

When enabled, every search result is also scraped in full — description, stock quantity, variation options, materials, highlights, category breadcrumbs, all images with alt text, delivery estimate, bestseller/Star Seller flags, shop sales stats, recent buyer reviews, and shop FAQs. Still one dataset row per listing, billed once at the detailed-listing rate instead of the standard rate (1,000 detailed listings ≈ $2.50 vs $1 standard). Runs take longer because each listing page is fetched individually.

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

Only include listings priced at or above this, in the display currency.

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

Only include listings priced at or below this, in the display currency.

## `onSaleOnly` (type: `boolean`):

Only include listings with an active discount — rows then always carry the original price and discount percent.

## `freeShippingOnly` (type: `boolean`):

Only include listings that ship free.

## `excludeSponsored` (type: `boolean`):

Skip listings Etsy shows as ads — keep only organic results.

## `locale` (type: `string`):

Regional Etsy site — titles and labels are returned in its language, and prices default to its home currency.

## `currency` (type: `string`):

3-letter display currency code (USD, EUR, GBP, INR, …) all prices are converted to. Leave empty for the marketplace's home currency.

## Actor input object example

```json
{
  "searchQueries": [
    "jewelry",
    "wall art"
  ],
  "startUrls": [
    "https://www.etsy.com/search?q=gold+necklace&free_shipping=true",
    "https://www.etsy.com/listing/4447282937/gold-body-chain-necklace-adjustable"
  ],
  "maxResultsPerSearch": 100,
  "scrapeListingDetails": false,
  "onSaleOnly": false,
  "freeShippingOnly": false,
  "excludeSponsored": false,
  "locale": "us"
}
```

# Actor output Schema

## `results` (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 = {
    "searchQueries": [
        "jewelry",
        "wall art"
    ],
    "maxResultsPerSearch": 100
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "searchQueries": [
        "jewelry",
        "wall art",
    ],
    "maxResultsPerSearch": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("omkar-cloud/etsy-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": [
    "jewelry",
    "wall art"
  ],
  "maxResultsPerSearch": 100
}' |
apify call omkar-cloud/etsy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,omkar-cloud/etsy-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/UeUcaydbdQZrmKvpI/builds/AhncuucW7gBQvQEku/openapi.json
