# Etsy Listing Scraper – Live Carts, Pricing & Competitors (`yumitori/etsy-listing-inspector`) Actor

Etsy listing scraper: x-rays one listing into deep fields a search scraper never returns — live cart demand, per-variation pricing, the promo schedule, true competitors, seller trust, AI alt-text and a photo audit. Read live, never estimated — a full teardown of any listing, yours or a rival's.

- **URL**: https://apify.com/yumitori/etsy-listing-inspector.md
- **Developed by:** [Yakugusa Yumitori](https://apify.com/yumitori) (community)
- **Categories:** AI, E-commerce, SEO tools
- **Stats:** 12 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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 Listing Scraper — Real Product Data: Live Carts, Pricing & Competitors

Point it at **one Etsy listing — yours or a competitor's —** and get back everything the product page holds that a *search* scraper can't — in one clean record: full copy, **per-variation pricing**, the **exact promo schedule**, **live cart demand**, **seller trust signals**, Etsy's **AI alt-text in 10 languages**, a **photo-darkness audit**, and the shop's **other listings + true competitors**.

**Every figure is Etsy's own** — real prices, live cart counts, and competitor demand pulled straight from the listing, **never estimated, modeled, or guessed** (unlike search-volume tools). **No login, no proxies, no setup** — just paste a listing and run.

> 💬 **Looking for reviews?** Buyer reviews, photos, the variant each buyer bought, sub-ratings, would-recommend % and review themes now live in our dedicated **[Etsy Reviews Scraper](https://apify.com/yumitori/etsy-reviews-scraper)** — purpose-built for review intelligence.

> Don't have the listing URL? Pass a **shop name** instead — it returns that shop's listings (id + title) to pick from.

### Quick start

Inspect listings (paste **URLs or IDs**):

```json
{ "listings": ["https://www.etsy.com/listing/1853337433/...", "4418320341"] }
```

Or deep-dive a whole shop — its top listings, ranked by live demand:

```json
{ "shopName": ["MyhandcraftGoods"], "maxShopListings": 10 }
```

**Want more than one shop at once? No problem** — pass a list, and you get each shop's best in a single run:

```json
{ "shopName": ["MyhandcraftGoods", "AnotherShop"], "maxShopListings": 10 }
```

*(The limit applies **per shop**. Turn on `listTitlesOnly` to just get each shop's listing menu to pick from — no deep fetch.)*

### How many listings you get — and how they're picked

- **Paste listings** → you get **exactly those**, one deep record each.
- **Give a shop** → it scans the shop's catalog and deep-dives the **top listings by demand** — **10 by default, up to 25 per shop** (`maxShopListings`). Pass several shops and you get that many from **each**.
- **How "top" is decided** → listings are ranked by **real demand, not catalog order**: **bestsellers first, then live cart counts, then most-recently-sold.** So you always get a shop's highest-impact listings — never a random slice. (A volatile signal like live carts is blended with bestseller status and recent sales, so one quiet day doesn't bury a strong listing.)

So a 2-shop run at the default returns up to **20 deep records** (10 per shop); bump `maxShopListings` to widen each shop's cut.

### What makes it different

Most fields are self-explanatory in the sample below. These are the ones **no search scraper gives you** — with a real snippet of each:

**💲 Per-variation price ladder** — the real buyer price for *each* option, not a vague "from" price

```json
"price_ladder": [
  { "option": "10 cards", "price": 3.02 },
  { "option": "50 cards", "price": 5.33 },
  { "option": "100 cards", "price": 8.77 }
]
```

**🥊 True competitors** — the visually-similar listings from *other* shops, live carts, sorted by demand (same-shop items filtered out)

```json
"competitors": [
  { "shop_name": "Goldmira", "in_cart_count": 59, "is_bestseller": true, "title": "14K Gold Custom Name Chain…" }
],
"top_competitor": "Goldmira (59 carts)"
```

**📸 Photo-darkness audit** — per-image brightness from the blurhash (Etsy's *PhotoTooDark* signal) — no image download

```json
"photo_audit": {
  "avg_brightness": 0.59, "primary_brightness": 0.163, "dark_image_indexes": [0],
  "flags": ["primary photo is dark (weakest thumbnail in search)"]
}
```

**🔑 Seller trust + AI SEO** — years on Etsy, on-time %, category bestseller rank; Etsy's AI alt-text in 10 languages

```json
"trust_signals": ["8 years on Etsy", "95%+ orders shipped on time"],
"ai_alt_text": "Gold necklace with a geometric pendant that spells out the name…",
"ai_alt_text_language_count": 10
```

Plus the basics: copy, tags, materials, taxonomy, promotions, logistics, and the shop's own catalog.

### Real data, not estimates — an EverBee / eRank alternative

Most Etsy research tools — **EverBee, eRank, Marmalead** — run on **estimates and periodic data**:

- **EverBee** gives *estimated* sales and revenue — modeled numbers, not the live figures from the listing itself.
- **eRank** and **Marmalead** are keyword-*research* tools — their numbers aren't pulled live from Etsy at the moment you look, and refresh on a schedule.

This is an **Etsy listing scraper that returns real data, not estimates.** Every figure — live cart counts, per-variation pricing, the promo schedule, true competitor demand — is read **straight from the live Etsy listing at the moment of the scan.** Nothing is modeled, graded, or guessed.

| | Estimate tools (EverBee, eRank, Marmalead) | This scraper |
|---|---|---|
| **Demand / sales** | Estimated (~80% accuracy) | Real, live cart counts |
| **Pricing** | "From" price only | Real price for every variation |
| **Freshness** | Monthly (Google data) or cached | Live, at scan time |
| **Source** | Google Keyword Planner / models | Etsy's own listing data |
| **Access** | Monthly subscription, paywalled tiers | Run on demand, no lock-in |

If you've searched for an **EverBee alternative** or an **eRank alternative** with data you can actually trust, this is the real-data option.

### Sample output

One listing → one deep record. Arrays trimmed to `[…]`; full set shown:

```json
{
  "type": "listing",
  "listing_id": 1097017861,
  "title": "Personalized Name Necklace, Name Logo Necklace, Personalized necklace for mom",
  "listing_url": "https://www.etsy.com/listing/1097017861/personalized-name-necklace-name-logo",
  "shop_name": "RobertoGoldDiamond",
  "shop_url": "https://www.etsy.com/shop/RobertoGoldDiamond",
  "listed_on": "2026-06-11",

  "description": "This necklace brings you a chance to carry your name …",
  "tags": ["gold name necklace", "personalized gift", "…"],
  "tags_joined": "gold name necklace, personalized gift, necklace with name, …",
  "materials": ["Rose gold", "White gold", "Brass", "Yellow gold"],
  "materials_joined": "Rose gold, White gold, Brass, Yellow gold",
  "when_made": "made_to_order",
  "taxonomy_path": "jewelry.necklaces.monogram_and_name_necklaces",
  "taxonomy_leaf": "Monogram & Name Necklaces",
  "category_attribute_menus": { "Occasion": ["Anniversary", "…"], "Holiday": ["Lunar New Year", "…"], "Chain style": ["Ball", "…"], "Recipient": ["Women", "…"], "Material": ["…"], "Style": ["…"], "Sustainable features": ["Upcycled", "…"] },

  "price_min": 120.0,
  "price_max": 120.0,
  "variations": [{ "name": "Primary color", "options": [{ "option": "White", "price": null, "available": true }, "…"] }, "…"],
  "price_ladder": [{ "option": "White", "price": null }, "…"],
  "promotions": [{ "percent_off": 60, "min_items": 0, "starts": "2026-06-11", "ends": "2026-06-12", "is_shop_wide": true }],

  "seller_response_rate": "Typically responds within a few hours",
  "trust_signals": ["8 years on Etsy", "95%+ orders shipped on time", "…"],
  "star_seller_highlights": ["Smooth shipping: Has a history of shipping on time with tracking.", "…"],
  "shop_highlight": "Buyers are raving! This shop got multiple 5-star reviews in the past 7 days.",
  "follower_count": 19493,

  "demand_nudge": "",
  "last_sale_date": "2026-06-11",
  "signal_pecking_order": ["promotion", "free_shipping"],
  "is_surfaceable": true,

  "ai_alt_text": "May include: Gold necklace with a geometric design pendant that spells out the name …",
  "ai_alt_text_all_languages": { "en-US": "…", "en-GB": "…", "fr": "…", "de": "…", "nl": "…", "es": "…", "it": "…", "pl": "…", "pt": "…", "ja": "…" },
  "ai_alt_text_language_count": 10,
  "available_languages": ["en-US", "…"],
  "image_count": 10,
  "images": ["https://i.etsystatic.com/14647199/r/il/…/il_fullxfull.6602175450.jpg", "…"],
  "image_quality": [{ "hue": 60, "saturation": 3, "blur_hash": "L04.9+xZ04-:s=tQkCt4D,%M~pt6", "w": 2000, "h": 2000 }, "…"],

  "photo_audit": { "image_count": 10, "avg_brightness": 0.59, "primary_brightness": 0.163, "darkest_brightness": 0.163, "dark_image_indexes": [0, "…"], "flags": ["primary photo is dark (weakest thumbnail in search)", "…"] },
  "photo_avg_brightness": 0.59,
  "photo_primary_brightness": 0.163,
  "photo_dark_count": 2,
  "photo_flags": "primary photo is dark (weakest thumbnail in search); 2 dark photo(s) may trip Etsy's PhotoTooDark filter",

  "quantity_available": 2762,
  "processing_time": "1-3 business days",
  "ships_from": "Stafford, TX, United States",
  "ships_to": ["United States", "…"],
  "free_shipping_threshold": "",
  "returns_accepted": true,
  "return_window_days": 30,
  "return_terms": "Buyers are responsible for return shipping costs. …",

  "same_shop_catalog": [{ "listing_id": 1070218458, "title": "Unique Womens Style Gift Name Logo Necklace …", "url": "https://www.etsy.com/listing/1070218458/…", "in_cart_count": 5, "is_bestseller": false, "last_sale_date": "2026-06-10" }, "…"],

  "competitors": [{ "listing_id": 1620394821, "title": "14K Gold Custom Name Chain, Gold Name Necklace …", "shop_name": "Goldmira", "in_cart_count": 59, "is_bestseller": true, "url": "https://www.etsy.com/listing/1620394821/…" }, "…"],
  "competitor_count": 27,
  "competitor_avg_carts": 6.1,
  "top_competitor": "Goldmira (59 carts)"
}
```

***

### Exporting — JSON, not CSV ⚠️

The record is deep (nested arrays: all competitors, the price ladder, per-variation options, per-image data), so **export JSON / JSONL for everything.**

Need a spreadsheet? Pick the **"Spreadsheet (CSV-safe)"** view in the Export dialog — flat scalar columns that fold the nested intel into clean summary cells (`top_competitor`, `photo_flags`, `tags_joined`, `materials_joined`). Exporting CSV on *"All fields"* explodes the arrays into hundreds of columns — that's tabular formats, not a bug.

***

### Best for

**🛍️ Audit your own shop** — point it at your shop name and it deep-dives your top listings: catch your **dark-photo flags**, weak titles, missing attributes, and which of your own listings Etsy actually favors. The diagnostics speak straight to the owner — it's a self-audit in one run.

**🥊 Research competitors & the market** — tear down a rival listing or shop: their **per-variation pricing**, the **promo schedule**, **live competitor carts**, and exactly what's working for them.

One listing (or shop) in, the whole page out — for **sellers** sharpening their own listings *and* researchers sizing up the field.

***

> ⚠️ **Unofficial.** Not affiliated with, endorsed by, or sponsored by Etsy, Inc. "Etsy" is a trademark of Etsy, Inc., used here for descriptive purposes only.

# Actor input Schema

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

Etsy listing URLs or numeric listing IDs to deep-dive. e.g. "https://www.etsy.com/listing/1853337433/..." or "1853337433". This is NOT a keyword search — paste a specific listing link/ID, or use "Shop name(s)" below to pull a whole shop.

## `shopName` (type: `array`):

One or more shop names, @handles, or shop URLs. Each shop's top listings (ranked by live demand) are deep-dived — full intel per listing. Add several to compare shops in one run; the limit below applies PER shop. To instead just list a shop's titles so you can pick, turn on "List titles only".

## `maxShopListings` (type: `integer`):

When a shop name is given, how many of its listings to deep-dive (default 10, max 25). Each listing is a deep multi-call fetch, so keep it modest — runs stay fast (10 ≈ ~20s; 25 ≈ ~50s). Each listing is a billed event.

## `listTitlesOnly` (type: `boolean`):

For a shop name: emit only the lightweight list of its listings (id + title) so you can pick which to inspect — no per-listing detail. View it on the "Shop listing menu" tab. Leave off to get full per-listing intel.

## `includeCompetitors` (type: `boolean`):

Add the listings Etsy treats as visually similar (other shops you compete with), sorted by live cart demand. Off = one fewer request per listing.

## Actor input object example

```json
{
  "listings": [
    "https://www.etsy.com/listing/1853337433/50pcs-aesthetic-cottagecore-stickers"
  ],
  "shopName": [
    "MyhandcraftGoods"
  ],
  "maxShopListings": 10,
  "listTitlesOnly": false,
  "includeCompetitors": true
}
```

# Actor output Schema

## `dashboard` (type: `string`):

At-a-glance summary of the whole run — KPI tiles plus most-contested and needs-attention listings.

## `gallery` (type: `string`):

Visual image-card grid of the scraped listings (filterable), the way an Etsy shopper browses.

## `spreadsheet` (type: `string`):

Interactive, sortable & searchable spreadsheet of the scraped listings (with thumbnails), rendered in the Output tab.

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

Full per-listing records (one row per listing). Field-by-field shape is described in the dataset schema.

## `shopMenu` (type: `string`):

With 'List titles only' enabled: each of the shop's listings (title + listing\_id + url) to pick from for a deep-dive.

# 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/1853337433/50pcs-aesthetic-cottagecore-stickers"
    ],
    "shopName": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("yumitori/etsy-listing-inspector").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/1853337433/50pcs-aesthetic-cottagecore-stickers"],
    "shopName": [],
}

# Run the Actor and wait for it to finish
run = client.actor("yumitori/etsy-listing-inspector").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/1853337433/50pcs-aesthetic-cottagecore-stickers"
  ],
  "shopName": []
}' |
apify call yumitori/etsy-listing-inspector --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mCM69YqVWxt8Da9Ss/builds/cPbsOkLlS9CN0tTMm/openapi.json
