# Etsy Product Scraper — Full Listing, Variations & Demand (`astravalabs/etsy-product-scraper`) Actor

Scrape up to 1,000 Etsy product URLs or listing IDs into complete 56-field records with descriptions, pricing, variations, images and video, personalization, demand signals, shop data, shipping, policies, and verified localization.

- **URL**: https://apify.com/astravalabs/etsy-product-scraper.md
- **Developed by:** [astravalabs](https://apify.com/astravalabs) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 4 total users, 3 monthly users, 97.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.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/platform/actors/running/actors-in-store#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 Product Scraper — Full Listing, Variations & Demand

Turn Etsy listing URLs or numeric IDs into clean, typed product records with 56
top-level fields. Capture the full description, every image and listing video,
structured variations with per-option pricing, personalization, materials and
tags, shop signals, shipping, return policies, and live demand indicators. No
proxy or captcha setup.

### Why use this actor?

- **Deep variation data:** option-level availability and price ranges, not just a base price.
- **Live commercial signals:** favorites, cart activity, recent-purchase demand text, shop sales, and badges when Etsy exposes them.
- **Fulfillment and policy data:** shipping origin, delivery estimates, processing windows, returns, exchanges, and cancellations.
- **Verified localization:** choose from 32 markets and compare the requested country with what Etsy actually rendered.
- **Predictable records:** one stable schema for active, sold-out, and recognizable unavailable listings; missing optional values use typed defaults.
- **Transparent failures:** invalid, blocked, and exhausted inputs stay out of the billed dataset and appear in `RUN_REPORT`.

### Quick start

```json
{
  "listings": [
    "4382740432",
    "https://www.etsy.com/listing/4471608480/sculptural-mushroom-lamp"
  ],
  "country": "US"
}
```

Pass listings as bare numeric IDs or full Etsy URLs — both work, and duplicates
are fetched once.

At the current $0.007 result price, 100 successfully returned products cost at
most $0.70 in product-result charges and the 1,000-input maximum costs at most
$7.00. Invalid inputs and exhausted requests do not create billed product
rows.

### What you get

One comprehensive 56-field row per product in the default dataset, including:

- **Identity & status** — `listing_id`, canonical `url`, `title`, full
  `description`, `status` (active / sold\_out / unavailable), `listed_on`.
- **Taxonomy** — `category`, full `category_path` breadcrumb, `tags`,
  `materials`, and `is_digital` / `is_handmade` / `is_made_to_order` flags.
- **Pricing** — `price`, `price_min` / `price_max`, `original_price`,
  `discount_pct`, `currency`, `is_on_sale`, plus `availability` and `quantity`.
- **Variations** — every option group with `value`, availability, and
  **per-option price / price\_min / price\_max**.
- **Media** — all `images` (full + thumbnail + alt text) and the listing
  `video` with thumbnails and duration.
- **Personalization** — enabled/required, buyer instructions, character limit.
- **Demand signals** — `favorites_count`, the live `demand_signal` badge
  (e.g. "In demand. 57 people bought this in the last 24 hours."), `in_cart_count`
  when Etsy surfaces the cart signal, and Bestseller / Etsy's Pick / Star Seller
  `badges`.
- **Shop** — `shop_name`, `shop_id`, `shop_url`, logo, location, total sales,
  age, rating and review count.
- **Ratings & reviews** — listing-level `listing_rating` / `listing_review_count`
  and shop-level equivalents, plus a `reviews` sample: the **up to 4** most recent
  reviews (rating, text, date, author) Etsy embeds in the page — not the listing's
  full review history.
- **Shipping** — origin country/region, processing time, and destination
  estimates, with `is_free_shipping`.
- **Policies** — returns / exchanges / cancellations accepted and the return
  window.

The `reviews` field is a small on-page sample from the listing's structured data,
not the full review history. For every buyer review, use the companion
[Etsy Reviews Scraper](https://apify.com/astravalabs/etsy-reviews-scraper).
Recommendation cards are intentionally excluded.

Optional demand, shipping, policy, review, and shop fields reflect what Etsy
exposed for that listing and locale at scrape time. A `null`, `false`, or empty
array does not necessarily mean the underlying product lacks that attribute.

### What you control

| Input | Default | What it does |
|---|---|---|
| `listings` | — | 1–1,000 Etsy listing URLs or numeric IDs, deduped |
| `country` | `US` | Localization target for language, currency, shipping, and delivery. The row also reports the locale Etsy **actually** rendered (`rendered_country`, `rendered_language`). |

### Sample product

A real localized product row, shortened to show the most useful nested fields:

```json
{
  "listing_id": "4382740432",
  "status": "active",
  "title": "Handmade Orange-Red Mushroom Lamp with Cute Elf",
  "price": 59.8,
  "price_min": 59.8,
  "price_max": 128.9,
  "currency": "USD",
  "favorites_count": 1793,
  "demand_signal": "In demand. 2 people bought this in the last 24 hours.",
  "is_bestseller": true,
  "shop_name": "ForestInGlass",
  "shop_total_sales": 2400,
  "listing_review_count": 59,
  "variations": [
    {
      "name": "Power Supply",
      "options": [
        {"value": "Battery", "available": true, "price_min": 59.8, "price_max": 86.9},
        {"value": "USB + Battery", "available": true, "price_min": 67.8, "price_max": 128.9}
      ]
    }
  ],
  "shipping": {
    "origin_country": "US",
    "destination_country": "US",
    "price": 0.0,
    "estimated_delivery_min": "Jul 22",
    "estimated_delivery_max": "Jul 29"
  },
  "requested_country": "US",
  "rendered_country": "US",
  "rendered_language": "en-US"
}
```

### Use it for

- **Price & variation monitoring** — track a product's price, discount, and
  per-option pricing over time.
- **Competitor & catalog intelligence** — capture rivals' full listing detail,
  demand signals, and shop reputation.
- **Product research** — mine bestsellers, materials, tags, and personalization
  options across a set of listings.
- **Catalog enrichment** — pull structured, typed product records straight into
  your own store or database.

### Speed & scale

Measured locally on 2026-07-17 through SmartProxy. Times include browser
warmup, product fetching, session rotations, and automatic retries:

| Run shape | Time | Products | Throughput |
|---|---:|---:|---:|
| 1 product | 14.1s | 1/1 | 0.07/s |
| 10 products | 17.9s | 10/10 | 0.56/s |
| 100 products | 30.9s | 100/100 | 3.24/s |
| 500 products | 2m 16.5s | 500/500 | 3.66/s |
| 1,000 products (max scale) | 4m 21.5s | 1,000/1,000 | 3.82/s |

The 1–500 measurements use the current 6-session × 8-request layout. The
1,000-product acceptance run used the earlier 6 × 6 layout with the same retry
and health-based proxy rotation behavior.

Small runs are dominated by the one-time browser trust warmup. Larger runs
reuse solved sessions and fetch product pages concurrently, so throughput rises
as that fixed startup cost is amortized. Runtime still varies with Etsy and
residential-proxy response quality.

### Output

Exports as JSON, CSV, Excel, or JSONL. A per-input run report — resolved
outcomes plus session, retry, block, bandwidth, and billing diagnostics — lands
in the key-value store under `RUN_REPORT`.

### Start from an Etsy keyword

This actor enriches known listing URLs or IDs. To discover products first, use
the [Etsy Listings Scraper](https://apify.com/astravalabs/etsy-scraper), export
its `listing_id` values, and pass those IDs here. This keeps broad search
collection inexpensive while reserving product-page requests for listings you
actually want to enrich.

### Companion actors

- [Etsy Keyword Research Tool](https://apify.com/astravalabs/etsy-keyword-research-tool) — discover the autocomplete phrases Etsy suggests to shoppers.
- [Etsy Listings Scraper](https://apify.com/astravalabs/etsy-scraper) — collect localized search results, organic ranks, and sponsored placements in bulk.
- [Etsy Shop Catalog Scraper](https://apify.com/astravalabs/etsy-shop-catalog-scraper) — collect every listing from one or more Etsy shops before choosing products to enrich.
- [Etsy Reviews Scraper](https://apify.com/astravalabs/etsy-reviews-scraper) — export complete buyer-review histories beyond the small on-page sample.

### Notes

- **Pay-per-result: $0.007 per returned product.** Invalid inputs and requests
  that exhaust their retry budget are **not billed**. See the live pricing panel
  above for the complete current event pricing.
- Localized fields reflect what Etsy served for your chosen `country`; the row
  always reports the rendered locale so you can verify it.

> ⚠️ Unofficial. Not affiliated with, endorsed by, or sponsored by Etsy, Inc.
> "Etsy" is a trademark of Etsy, Inc., used here descriptively.

# Actor input Schema

## `listings` (type: `array`):

Etsy product URLs or numeric listing IDs. Duplicate IDs are fetched once.

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

Country used to request localized language, currency, shipping, and delivery information. Output reports what Etsy actually rendered.

## Actor input object example

```json
{
  "listings": [
    "https://www.etsy.com/listing/4382740432/item"
  ],
  "country": "US"
}
```

# Actor output Schema

## `products` (type: `string`):

Default dataset containing one row per unique Etsy product.

## `runReport` (type: `string`):

Per-input outcomes and session, retry, block, bandwidth, and billing-limit diagnostics.

# 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 = {
    "listings": [
        "https://www.etsy.com/listing/4382740432/item"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("astravalabs/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 = { "listings": ["https://www.etsy.com/listing/4382740432/item"] }

# Run the Actor and wait for it to finish
run = client.actor("astravalabs/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 '{
  "listings": [
    "https://www.etsy.com/listing/4382740432/item"
  ]
}' |
apify call astravalabs/etsy-product-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Sg7gSyxodELbgh2kc/builds/INucVoP6881MlBbi7/openapi.json
