# Etsy Scraper: Prices, Sale Prices, Shop Ratings & Star Sellers (`atlasdataworks/etsy-scraper`) Actor

Scrape Etsy search results for any keyword, or category pages, into one flat table: price, original price, discount, shop, shop rating and review count, Star Seller, Bestseller and Popular now badges, free shipping, ad flag and rank. No login.

- **URL**: https://apify.com/atlasdataworks/etsy-scraper.md
- **Developed by:** [Atlas Dataworks](https://apify.com/atlasdataworks) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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: prices, sale prices, shop ratings and Star Sellers for any keyword or category

Scrape **Etsy listing data** from etsy.com search results or category pages into one flat table:
price, **original price and discount**, currency, shop name and id, **shop rating and review
count**, **Star Seller**, **Bestseller and Popular now badges**, free shipping, ad flag and rank. Type a keyword or paste a category URL;
no login, no proxy setup. **$3.00 per 1,000 listings**, and you pay only for listings delivered.

### What does this Etsy scraper do?

- **Searches Etsy by keyword** (`ceramic mug`, `personalized necklace`), up to 1,000 listings per
  keyword in Etsy's relevance order, about 60 per page.
- **Reads Etsy category pages** you paste from your browser (`https://www.etsy.com/c/...`), up to
  1,000 listings per URL, about 48 to 64 per page. The URL's own filters and sort order are kept;
  only the page number changes.
- **Gets past Etsy's bot protection** for you: every run goes through residential IPs and a real,
  fingerprinted browser, included in the price.
- **Removes duplicates.** Etsy shows some listings both as an ad and as an organic result, and a
  listing can turn up under two keywords or categories. The max you set counts unique listings, and you are charged once
  per listing.
- **Leaves ads out** by default. Include them with one switch and they come flagged
  `sponsored: true`.

### Who uses it

- **Etsy sellers.** See who ranks first for the keyword your buyers type, at what price and
  discount, and which shops are Star Sellers with free shipping.
- **Price and discount monitoring.** Schedule a daily run on a keyword or category and track price,
  original price and discount over time.
- **Product and niche research.** Pull a whole category with shop ratings and review counts to size
  demand before you make or source a product.
- **AI agents.** Call it as an MCP tool and get typed JSON back (see below).

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

Pay per event: **$0.003 per listing delivered** (`product-scraped`), plus Apify's platform rows
(about $0.00005 per run start and per result). You do not pay for run time, proxies or the browser.

| What you scrape | Listings | Cost |
|---|---|---|
| One keyword, first results (the prefilled run) | 40 | $0.12 |
| One keyword or category, 500 listings | 500 | $1.50 |
| **1,000 listings** from any mix of keywords and categories | 1,000 | **$3.00** |
| Ten keywords, 300 listings each | 3,000 | $9.00 |

The table shows the Free-plan price. On Apify's paid plans each listing costs less: **$2.75 per
1,000 on Bronze, $2.50 on Silver, $2.25 on Gold and above.**

To cap a run, set **Max cost per run** in the run options: the run delivers what fits and stops,
and never charges past it.

### How to scrape Etsy listings

1. Click **Try for free** (or **Start**). The input is prefilled with the keyword `ceramic mug` and
   40 listings, so one click returns data.
2. Type your own keywords, one per line. Or open Etsy in your browser, go to the category you want,
   set any filters, and paste the URL.
3. Run it, then download the results as **JSON, CSV, Excel, XML or HTML**, or read them through the
   Apify API, a schedule, or an integration (Make, Zapier, n8n, Google Sheets, webhooks).

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords to search on Etsy, one per line, e.g. `ceramic mug`. |
| `categoryUrls` | Etsy category URLs copied from your browser, e.g. `https://www.etsy.com/c/jewelry/necklaces`. Listing and shop pages are not accepted; for a search, use `searchQueries`. |
| `maxItemsPerQuery` | Most unique listings per keyword or URL, 1 to 1,000. |
| `includeSponsored` | Include Etsy Ads placements, always flagged `sponsored: true`. Default off. |

Example input:

```json
{
  "searchQueries": ["ceramic mug", "personalized necklace"],
  "categoryUrls": [{ "url": "https://www.etsy.com/c/art-and-collectibles/prints" }],
  "maxItemsPerQuery": 200
}
```

### Output

One record per unique listing (a real row from a run on 2026-10-30):

```json
{
  "listingId": "1095910732",
  "url": "https://www.etsy.com/listing/1095910732/family-birthstone-necklace-personalized",
  "title": "Family Birthstone Necklace, Personalized Initial Leaf Charm Necklace",
  "imageUrl": "https://i.etsystatic.com/17285845/r/il/9dec06/8592277692/il_fullxfull.8592277692_6rr2.jpg",
  "price": 36.4,
  "wasPrice": 56,
  "discountPct": 35,
  "currency": "USD",
  "shopRating": 4.78,
  "shopReviewCount": 5644,
  "shopName": "BedrockBijoux",
  "shopId": "17285845",
  "starSeller": false,
  "freeShipping": true,
  "sponsored": false,
  "badge": null,
  "position": 1,
  "page": 1,
  "source": "url:https://www.etsy.com/c/jewelry/necklaces",
  "scrapedAt": "2026-10-30T07:04:54.108Z"
}
```

- `price` is what a signed-out US visitor sees, the sale price when there is one. `wasPrice` is the
  struck-through price, filled only when it is above `price`; `discountPct` is the percentage Etsy
  prints.
- `shopRating` and `shopReviewCount` are the **shop's** stars and review total, which is what Etsy
  shows on a category card (one necklace from a large shop read `753460` reviews). Etsy cards carry
  no per-listing rating.
- `badge` is Etsy's own signal as a search card prints it (`Bestseller`, `Popular now`, `Etsy's Pick`),
  so you can see what is selling for a keyword without opening each listing: 32 of 40 rows carried one
  in our test on 2026-11-04. `null` when the card shows none.
- `position` and `page` are the rank as Etsy ordered the results. `source` is `search:<keyword>` or
  `url:<category URL>`.
- On search results Etsy prints large review totals rounded (`16.9k`), so `shopReviewCount` from a
  keyword reads `16900`; category pages give the exact number.
- Unknown values are `null`, never `0`: a listing with no rating shown is not a listing rated 0.

Each run also writes a **summary** to the key-value store under `OUTPUT`: `priceCompleteness`
(share of listings that came back with a price), `degradedSources` (any keyword or URL that failed,
so an empty result is told apart from a failed one), `rejectedUrls` (pasted URLs that are not Etsy
category pages), `pagesFetched` and counts per keyword and URL.

### Why this Etsy scraper

- **Measured.** Price completeness is reported on every run. In our test run on the platform
  (2026-11-04): five keywords plus one category at 100 listings each, 600 unique listings over 22
  pages in under 5 minutes, 100% priced, no keyword or URL degraded.
- **Unique listings, charged once.** Ad copies of organic listings, and repeats across pages and
  URLs, are removed before delivery and before charging.
- **Same schema as our Amazon and Walmart Actors.** Field names match where they overlap (`price`,
  `wasPrice`, `discountPct`, `position`, `sponsored`), so one pipeline reads all three.

### Use it from an AI agent (MCP) or the API

Add it to Claude, Cursor or any MCP client through [Apify's MCP server](https://mcp.apify.com),
with only this actor loaded:

- **Claude Code:** `claude mcp add --transport http apify "https://mcp.apify.com/?tools=atlasdataworks/etsy-scraper"`
- **Cursor, Claude Desktop and other clients:** add this to the client's MCP config:

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

On first use a browser window opens to sign in to Apify (OAuth), so no token goes into the config.
Runs are billed to your Apify account at the prices above. Then ask in plain words, for example:

> "Search Etsy for 'personalized necklace' and list the top 100 with their sale price, discount and whether the shop is a Star Seller."

From code, one HTTP call runs it and returns the listings:

```bash
curl -X POST "https://api.apify.com/v2/acts/atlasdataworks~etsy-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["ceramic mug"], "maxItemsPerQuery": 40}'
```

### FAQ

**Is it legal to scrape Etsy?** This actor reads only public search and category pages that anyone
can open without signing in, and collects listing data and the shop's public business name, not personal
data: no owner names, avatars, review text or contact details. Whether your use is allowed depends
on your jurisdiction and purpose; check with a lawyer if you are unsure.

**Can I search by keyword?** Yes: put keywords in `searchQueries`. Results come in Etsy's default
relevance order as a signed-out US visitor sees them. For your own filters (price range, shipping
country, sort), set them on a category page in your browser and paste that URL.

**Does it return listing detail, variations or reviews?** Not yet: this actor reads search and
category results. Listing detail is the next feature. Review text is not collected: it carries reviewer
names, and this actor collects no personal data.

**Which Etsy site and currency?** etsy.com as a US visitor sees it, prices in USD.

**Do I need a proxy, cookies or an Etsy account?** No. Residential access is included in the price.

**Can I monitor prices on a schedule?** Yes. Save your input as a task and add an Apify schedule;
each run is a new dataset you can compare with the last.

**Something broke or a field is missing.** Open an issue on the actor's Issues tab. Etsy changes
its pages; reports get fixed.

### Also from Atlas DataWorks

- [Amazon Product Scraper](https://apify.com/atlasdataworks/amazon-unified-extractor): search, Best
  Sellers and ASIN detail in one run, the same $3.00 per 1,000.
- [Walmart Scraper](https://apify.com/atlasdataworks/walmart-scraper): prices, was-prices, ratings
  and sellers for any keyword or category, $3.00 per 1,000.
- [AliExpress Search Scraper](https://apify.com/atlasdataworks/aliexpress-search-scraper): prices,
  exact orders and delivery dates for any keyword, $3.00 per 1,000.

### Limits

- **Search and category results only**: no listing detail, variations or reviews yet (see the FAQ).
- Up to 1,000 listings per keyword or URL, and at most 20 result pages (Etsy's own cap on a
  search); for more, use narrower keywords or split by subcategory or filters.
- etsy.com only; prices are what a signed-out US visitor sees at run time.

# Actor input Schema

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

Keywords to search on Etsy, one per line, e.g. ceramic mug. Each keyword returns up to 20 pages of about 60 listings, in Etsy's relevance order, with prices as a US visitor sees them.

## `categoryUrls` (type: `array`):

Etsy category URLs (https://www.etsy.com/c/...) copied from your browser, e.g. https://www.etsy.com/c/jewelry/necklaces. Filters in the URL are kept. About 48 to 64 listings per page. Listing and shop pages are not accepted; for a search, use Search keywords.

## `maxItemsPerQuery` (type: `integer`):

Upper bound on listings returned per keyword or category URL. A listing found under two of them is delivered and billed once.

## `includeSponsored` (type: `boolean`):

Etsy Ads placements are excluded by default. Included ads are flagged sponsored=true.

## Actor input object example

```json
{
  "searchQueries": [
    "ceramic mug"
  ],
  "maxItemsPerQuery": 40,
  "includeSponsored": false
}
```

# Actor output Schema

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

One record per unique Etsy listing across every keyword and category URL, billed once. Prices are numbers; unknown values are null, never zero.

## `runSummary` (type: `string`):

Per-run counts and health: priceCompleteness, per-source counts, pagesFetched, degradedSources and chargeLimitReached.

# 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": [
        "ceramic mug"
    ],
    "maxItemsPerQuery": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("atlasdataworks/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": ["ceramic mug"],
    "maxItemsPerQuery": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("atlasdataworks/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": [
    "ceramic mug"
  ],
  "maxItemsPerQuery": 40
}' |
apify call atlasdataworks/etsy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atlasdataworks/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/JRYnzfr8NsgEM54uX/builds/86uENYxij1SdDTaiX/openapi.json
