# Etsy Dropshipping & POD Supplier Finder — Who Makes It (`yumitori/etsy-manufacturer-finder`) Actor

Find the factory, manufacturer, or POD supplier behind any Etsy listing, shop, or niche. Is this shop dropshipping? Who makes this product? Reads Etsy's own registered production-partner records — including the ones hidden from the public page — and flags fake-handmade dropshippers.

- **URL**: https://apify.com/yumitori/etsy-manufacturer-finder.md
- **Developed by:** [Yakugusa Yumitori](https://apify.com/yumitori) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 production partner reveals

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Dropshipping & Supplier Finder — Who Makes It (POD / Production-Partner Detector)

**Find out who ACTUALLY manufactures any Etsy product** — the real factory or print-on-demand supplier behind any listing, shop, or niche.

**Then turn it into money.** Source the same factory a top seller uses and cut your unit cost **40–80%**. Catch the "handmade" shops that are really dropshipping. Spot the niches where every top seller secretly shares one overseas factory. Vet a supplier before a big order. Price to win — on real margins, not guesses.

**See it in one look.** This "Baguette Birthstone Necklace" is an **Etsy's Pick** from a **Star Seller, marked handmade, at $32.80** — but Etsy's own records show it's outsourced (`fake_handmade`), and the *identical* necklace is on **Alibaba for $5.56 wholesale.** A **~6× markup on a $5 mass-produced product**, sold as handmade and badged by Etsy itself:

| 🛍️ Etsy — Divanjewelrygold · "Etsy's Pick" · **$32.80** | 🏭 Alibaba — the same necklace, wholesale · **$5.56/pc** |
|:---:|:---:|
| ![Etsy — birthstone necklace, $32.80](https://files.catbox.moe/0yfecw.png) | ![Alibaba — same necklace, $5.56 wholesale](https://files.catbox.moe/zghhqt.png) |

*That gap — $5.56 → $32.80 — is exactly what this actor exposes.*

**And the sneakiest one — an "Etsy's Pick" that's lying by omission.** Etsy **requires** every seller to disclose their production partners. `PBJewelryGift` discloses **none** — badged **"Made by PBJewelryGift,"** selling for **$37.10** as an Etsy's Pick. So `fake_handmade` can't fire (nothing declared to contradict) and it ships domestically — every honest signal reads "clean." **The actor catches it anyway** — automatically. Turn on **`reverseImage`** and it matches the listing's own *photo* — the pixels, not the reworded title — straight to the wholesale original, while **`checkMarketplaces`** confirms the ring is all over the B2B sites. The exact one: **[DHgate, from ~$4/pc](https://www.dhgate.com/product/birth-flower-ring-925-sterling-silver-christmas/1085044385.html)**. A **~$4 wholesale ring sold at $37.10 — a ~9× markup**, with the required factory disclosure simply left blank.

| 🛍️ Etsy — PBJewelryGift · "Etsy's Pick" · **$37.10** | 🏭 DHgate — the same ring, wholesale · **from ~$4/pc** |
|:---:|:---:|
| ![Etsy — birth flower ring, $37.10](https://files.catbox.moe/hutb2t.png) | ![DHgate — same birth flower ring, ~$4 wholesale](https://files.catbox.moe/danzie.png) |

***How it was caught:*** *the seller declared no production partner — which Etsy requires — so the honest signals (`fake_handmade`, `made_in_china`, `ships_overseas`) had nothing to flag. Two backstops did, both automated inside this actor: **`checkMarketplaces`** searched Alibaba / Temu / AliExpress / DHgate and flagged the ring as wholesale-available (the signal), and **`reverseImage`** matched the product **photo** to the exact DHgate source — title-independent, so rewording the listing doesn't help them. Text search proves it's a marketplace product; reverse-image nails the exact source. That's how you catch a seller who lies by omission — hands-off.*

Here's what most people don't know: **Etsy requires every seller to register their production partners** — the outside factories, workshops, and print-on-demand services that make their goods. But that disclosure sits in a shop-settings field that **never appears on the public listing.** Buyers don't see it. Competitors don't see it. This actor reads it **straight from Etsy's own records** — including the partners a seller quietly leaves off the page.

> Every other Etsy tool *guesses* the supplier from packaging photos, "made in" text, or shipping times. This one doesn't guess. It returns the exact production-partner records Etsy holds on file — factory name, location, country — for any listing, shop, or niche.

**To be clear — using production partners is completely legitimate, and most sellers disclose them.** Outsourcing to a factory or a print-on-demand service is an allowed, everyday part of selling on Etsy; Etsy *requires* sellers to register their partners and even marks on a listing that it was made *with* one. Plenty of sellers declare theirs properly — and for them, this actor simply hands you the **real maker to source from**, straight from Etsy's record. So the core job is mapping **who actually makes any product** — honest sellers included — for sourcing, competitor research, and niche intel. Catching the minority who mark a factory-made item "handmade" and leave the partner blank is a *bonus* outcome, not the whole point.

Etsy also flags every listing as handmade or not (**`is_handmade`**) and records **where each item physically ships from.** So a "Made in USA," handmade listing whose packages actually leave **Pakistan** gets flagged (`ships_overseas: true`), no matter how the shop brands itself. That's a **fake-handmade dropshipper** caught cold. In short, it's the **print-on-demand & dropshipping detector** for Etsy: is this shop POD? Is it dropshipping? Who prints for it? Answered.

Built for **dropshipping product research, print-on-demand (POD) supplier sourcing, dropshipping/POD detection, competitor supply-chain intelligence, and private-label due diligence** — whether you're a solo seller checking one niche or an agency profiling thousands of shops.

### 💪 What you can do with it

- **Source direct & cut costs** — find the exact factory behind a proven product and order from it yourself, skipping the reseller markup (typically **40–80% off the unit cost**).
- **Detect dropshippers & fake-handmade** — instantly see whether a shop is POD/dropshipping or genuinely handmade, and who fulfills it.
- **Find the shared factory behind a niche** — spot when the "top sellers" all run through one overseas workshop: a race-to-the-bottom warning, or your sourcing shortcut.
- **Vet a supplier before you buy** — confirm a "handmade" partner isn't a China dropship factory before a wholesale or private-label order.
- **Pick under-saturated niches** — measure how outsourced a category already is before you enter it.
- **Out-research competitors** — scan any shop's whole catalog to see who makes their products, where, and how much they outsource.

### 👥 Who it's for

**🌱 New sellers — start with an edge.**
Found a product that's clearly selling? Run it and get its *actual* factory. Order **direct** instead of through a reseller and launch with a **40–80% lower unit cost** — better margins than the very competitors you're studying. See which niches are already saturated with the same POD supplier (a trap) versus still wide open, and calculate your true landed cost *before* you commit a dollar. It's the sourcing head-start that normally takes months of trial-and-error to figure out.

**📈 Scaling sellers — compound your edge.**
Scan competitors' bestsellers to see exactly who makes them and where. Find the **shared factory** a whole niche runs through — that's the moat, or your next supplier. Cut COGS by going direct, catch the dropship / fake-handmade rivals cheapening your category, and vet any supplier before a five-figure wholesale or private-label order. Turn "who's winning and how" from a guess into a map.

### 🔍 Three Modes, One Actor

| Mode | You give it | You get |
|------|-------------|---------|
| **🔎 Niche** | a keyword (e.g. `custom neon sign`) | the niche's top sellers → the factory behind each (name, location, country), ranked, with shared-factory & multi-front alerts |
| **🏬 Shop** | a shop name or URL | that shop's entire catalog → every factory it uses, with a verdict on how much it outsources |
| **📋 Listing IDs** | specific listing IDs | a clean per-listing record: full `manufacturers[]`, `ships_from`, `is_handmade`, `when_made`, materials, price, live carts, shop stats |

You only fill one. If you paste listing IDs they win; otherwise a shop wins; otherwise the keyword runs.

### 🧪 Example runs — pick your goal

**🌱 "I found a product that's clearly selling — who makes it, so I can source it too?"**
```json
{ "listingIds": ["1552107102"], "reverseImage": true }
````

→ The exact factory behind that listing — name, location, country — its `fake_handmade` verdict, and (with `reverseImage` on) the **exact wholesale source its photo traces to** on Alibaba / DHgate / AliExpress — the real supplier even if the seller declared none. Order direct instead of paying a reseller's markup.

**📈 "Is this competitor dropshipping — and who fulfills them?"**

```json
{ "shop": "https://www.etsy.com/shop/TheNeonDistrict" }
```

→ Their entire catalog matched to its factories, with a verdict.

> *Real result:* **164/164 of its listings are outsourced (100%)** — 100% overseas, dominant origin China. And **one factory — 'George Chin – Vintage Signs' (Beijing) — makes all 164 of them.** Not handmade; a single China workshop with a storefront.

**"How saturated is this niche, and where does everyone actually manufacture?"**

```json
{ "keyword": "custom neon sign", "topSellers": 40, "rankBy": "listing_reviews" }
```

→ The top 40 shops → the factory behind each, ranked, with shared-factory & multi-front alerts.

> *Real result:* **13/40 of the top sellers outsource (32%)** — 100% overseas, dominant origin Hong Kong. Shared factory **'Usman Khan – Neon Crafts' (Lahore)** appears across 2 shops; multi-front operator **'CarloHK'** runs fronts in Hong Kong *and* London under the same name.

**"Catch every fake-handmade / dropshipper in a niche"**

```json
{ "keyword": "personalized pet portrait", "originFilter": "ships_overseas", "onlyWithPartners": false }
```

→ Only shops whose packages **physically ship from a different country than they claim** — with `ships_overseas`, `fake_handmade`, and `ships_from` on every row. The caught-red-handed list.

**"Just the serious China-based players (skip the hobbyists)"**

```json
{ "keyword": "resin coaster", "originFilter": "china", "minReviews": 100 }
```

→ Shops with 100+ reviews whose factory is in China — self-made shops and low-volume noise filtered out.

### 🔥 Popular niches to run it on

Some of the most-outsourced (and most-searched) Etsy niches in 2026 — great starting points:

`custom neon sign` · `personalized pet portrait` · `pet memorial gift` · `custom wedding sign` · `zodiac wall art` · `astrology print` · `faith-based wall art` · `teacher gift` · `nurse gift` · `birth flower ring` · `resin coaster` · `macrame wall hanging` · `custom name necklace` · `LED bookshelf lamp` · `personalized dog bandana`

Run any of these as a **Niche** keyword to see how outsourced the category is and which factories the top sellers use.

### 🔗 Need more shops to analyze?

Seed a niche into the **[Etsy Shop Finder](https://apify.com/yumitori/etsy-shop-finder)** to pull a bulk list of the shops selling in it — thousands per niche, past Etsy's 12k-per-search cap. It hands you a ready-to-copy **`shop-names.txt`** list; drop any of those shops into **Shop mode** here to see where each one manufactures. Discover the shops there, map the supply chain here.

### ⚙️ How It Works

Etsy's production-partner data is *required-but-buried* — collected by Etsy, mandatory for sellers, invisible to everyone else. This actor goes and gets it:

1. **Finds the real sellers.** Resolves your niche (or shop) to its genuine best-sellers — ranked by a listing's own review count, a far truer signal than the shop's all-time sales across unrelated products.
2. **Reads Etsy's own production-partner records** for each listing — the exact factory name, location, and country the seller registered, *including the ones kept off the public page*.
3. **Untangles the supply chain.** Clusters factories so one workshop shared across many shops shows up as one operator, and flags **multi-front operators** — the same manufacturer running, say, a Hong Kong and a UK front under two different names to look local.
4. **Delivers a clean dataset** — every seller matched to the factory (or factories) behind it, with a plain-English verdict of how outsourced the niche really is.

No login, no cookies, no scraping of packaging photos — it reads the structured record Etsy already holds.

### 📊 Reliability & Speed

- **100% fetch success at scale** — measured across bulk runs; every reachable listing returns its full data.
- **~250 distinct sellers analyzed in ~2.5 minutes** (deeper runs scale linearly — a busy niche can supply a few thousand distinct shops).
- **De-duplicated by shop** before any heavy work, so a niche with thousands of listings is analyzed with zero wasted effort.
- **Always returns — never times out.** The actor finalizes and outputs what it has before hitting any limit, so runs are safe to call **synchronously** (run-and-get-results in one request) for real-time lookups.
- **Never double-billed.** Charging is idempotent per reveal — if a long run is ever restarted mid-way by the platform, already-revealed factories are not charged again.

### 📝 Inputs

**Mode 1 — Niche**

- `keyword` — the niche to analyze (e.g. `resin coaster`, `macrame wall hanging`)
- `topSellers` — how many distinct shops to output (up to 2,000)
- `scanDepth` — how wide to search for candidates
- `rankBy` — reviews (recommended), live carts, Etsy rank, or shop all-time sales
- **Origin filter** — only sellers manufacturing `overseas` / `China` / `domestic` / a specific country, or **`ships_overseas`** (caught dropshippers — ships from abroad while claiming local)
- **Minimum reviews** — ignore tiny/noise shops
- Toggles: *only sellers that outsource*, *one row per shop*
- The **specific-country** origin filter is a pick-list of the common factory countries — no typing

**Mode 2 — Listing IDs**

- `listingIds` — one Etsy listing ID per line
- Filters: `made in China`, `raw` full response (cross-check `is_handmade` + `ships_overseas` for fake-handmade)
- **`checkMarketplaces`** — also search Alibaba / AliExpress / Temu for the product *by text* and return matching product pages (`found_on_marketplace` + `marketplace_matches`). Catches **undeclared** dropshippers — sellers with no registered factory who still resell a marketplace product.
- **`reverseImage`** — the exact-match tier (works in **all modes** now): reverse-image-search each **photo** across Alibaba / AliExpress / DHgate / Temu / CJ Dropshipping (matched on pixels, not the title), title-corroborated. Sets `found_on_marketplace` + `image_match_evidence` (the direct product-page URLs) + `image_match_photo` (the matched wholesale image) + `image_match_confidence`. Catches the **undeclared** dropshippers — the ones who registered no factory and reworded the title — which text search and Google Lens can't automate. Charged at the premium "wholesale source" tier (a step above a registered factory — see live pricing). A live per-product lookup (a few seconds each), so it runs on the first **250** photos by default (raise **`reverseImageMax`** to cover more); everything else still gets the full production-partner record.
- **`findCluster`** — returns every *other* Etsy shop selling the same product (Etsy's own visually-similar match) with each one's price and live carts (`similar_listings` + `similar_count` + `similar_price_min/max`). If a dozen "handmade" shops sell one product across a wild price range, it isn't handmade — and you see the whole price spread at a glance.

**Mode 3 — Shop**

- `shop` — a shop name (`TheNeonDistrict`) or URL (`https://www.etsy.com/shop/TheNeonDistrict`)

**You only fill one input mode.** If you paste Listing IDs they win; otherwise a Shop wins; otherwise the Keyword runs — so there's never ambiguity about what it'll do. Every input has an in-form description explaining exactly what it does.

### 📤 Outputs

**Dataset** — one row per seller (or per listing). Here's a **real row** (pulled live) — a **UK Star Seller with 2,113 reviews and 24,600 sales, listed as handmade, that ships from the UK**… yet Etsy's own records hold a **Hong Kong factory** for it:

```json
{
  "shop_name": "EndlesslandDesign",
  "title": "Neon Sign Custom Name, Custom Neon Sign, Neon Name Sign for Wedding",
  "url": "https://www.etsy.com/listing/1476496443/...",
  "seller_location": "United Kingdom",
  "ships_from": "United Kingdom",
  "ships_overseas": false,
  "is_handmade": true,
  "fake_handmade": true,
  "uses_production_partner": true,
  "made_in_china": false,
  "manufacturer_names": "CarloHK, CarloUK",
  "manufacturer_countries": "England, Hong Kong",
  "manufacturer_count": 2,
  "processing_time": "2-5 business days",
  "is_star_seller": true,
  "is_bestseller": true,
  "listing_reviews": 2113,
  "favorites": 17876,
  "shop_all_time_sales": 24600,
  "price": 37.9,
  "listing_id": 1476496443,
  "manufacturers": [
    {
      "factory": "CarloHK",
      "factory_location": "Hong Kong",
      "factory_country": "Hong Kong",
      "factory_makes": "Family-owned studio based in HK ... Just like our UK studio, the one in HK guarantees the BEST quality in everything we create ..."
    },
    {
      "factory": "CarloUK",
      "factory_location": "London, England",
      "factory_country": "England",
      "factory_makes": "Our UK studio ..."
    }
  ]
}
```

**Read that row — this is the power.** By every normal check this shop is airtight: a **UK Star Seller**, **2,113 reviews**, **17k favorites**, **24,600 sales**, marked **handmade**, and it *ships from the UK* — so "made in the USA/UK" and "ships from abroad" filters both wave it through. But **`fake_handmade: true`** fires anyway, because Etsy's own records hold **two registered factories** for it: **`CarloHK` (Hong Kong)** and **`CarloUK` (London)** — the *same operator* running a Hong Kong workshop and a UK front under one name (a multi-front tell the actor flags). The Hong Kong factory's own description even says *"Just like our UK studio, the one in HK guarantees the BEST quality…"* — the outsourcing spelled out, in Etsy's data, **in the seller's own words**. That's what no other tool can see: not the small obvious dropshipper, but the polished, trusted, "handmade" brand that's actually a Hong Kong factory with a storefront.

Every row carries: **`ships_from`** + **`ships_overseas`** (claimed-local-but-ships-abroad flag), `uses_production_partner`, `made_in_china`, **`fake_handmade`** (handmade claim *plus* a registered factory — a contradiction in Etsy's own data), `is_handmade`, `is_made_to_order`, `is_digital`, **`manufacturer_names`** (factory names, comma-joined), `manufacturer_countries`, `manufacturer_count`, `processing_time`, and the full **`manufacturers[]`** (`factory`, `factory_location`, `factory_country`, `factory_makes` — each partner *exactly as the seller registered it with Etsy*); the product's **`category`**, **`materials`**, and **`tags`** (the seller's SEO keywords); plus `listing_reviews`, `favorites`, `in_cart_count`, `price`, `is_bestseller`, `is_star_seller`, `shop_all_time_sales`, shop name, title, URL, listing ID, and seller location.

Every row also carries a plain-English **`verdict`** — *🏭 outsourced (declared factory)* / *🔴 dropship (no factory declared)* / *⚪ self-made (no supplier found)* — for one-click sorting. And when **`reverseImage`** is on, a caught listing adds **`found_on_marketplace`**, **`image_match_confidence`**, **`image_match_evidence`** (the wholesale product-page URLs), and **`image_match_photo`** (the matched wholesale image, for a visual side-by-side with the listing photo).

> **What a partner record is — and isn't.** A `manufacturers[]` entry is the seller's *registered* production partner: airtight proof of **where and by whom the item is really made** (that's the detection, and it's always solid). But it is **not always a supplier you can hire.** Sometimes it's a real third-party factory or POD provider you could use too (a China workshop, a print house); other times it's the seller's **own in-house or family studio** — e.g. a self-branded overseas workshop like the one in the example above — that isn't open to outsiders. Treat the partner *name* as intelligence, not a guaranteed contact.
>
> **To actually source it, match on the photo.** The **`reverseImage`** option reverse-image-searches the product photo and lands you on the *exact* item from open B2B suppliers — Alibaba / AliExpress / DHgate — where it's a real, contactable factory. Match on the pixels, open the source, request a quote. (When the registered partner is a seller's own in-house studio, this is how you find a supplier you can actually hire for the same product.)

#### 🔎 Turn on `reverseImage` — the exact-match tier that reads the *photo*, not the title

> **First, the core use — no toggle needed.** The straightforward, everyday job of this actor is simple: paste a listing, shop, or niche and it tells you **who makes it** — the real factory or POD supplier, read straight from Etsy's registered production-partner records (the `manufacturers[]` above). That's always the first answer, and it's always solid. **`reverseImage` is an optional layer on top**, for the harder case only: the seller who registers **nothing** and quietly resells a wholesale product. Treat a photo match as *evidence the seller is reselling* — a detection signal and a real sourcing lead — **not** a claim that it's their single, exclusive supplier (there may be others, and it surfaces the strongest match, not the only one). It exists to catch the sellers who **won't admit** they outsource, not to replace the who-makes-it answer above.

The registered-factory check above is airtight but only fires when a seller *declares* a partner. The seller who declares **nothing** and ships from a domestic warehouse leaves no structured trace — and rewording the title defeats any text search. So the actor does what you'd do by hand with Google Lens, **automated**: it reverse-image-searches the listing's own photo across Alibaba / AliExpress / DHgate / Temu / CJ Dropshipping, matched on the **pixels**, then corroborates each hit against the listing title so a *similar-but-different* product never counts. Here's a **real listing** (pulled live) — a "925 Sterling Silver Sakura Ring" sold as handmade, whose photo traces straight to the Alibaba wholesale original:

```json
{
  "shop_name": "StudioNetShop",
  "title": "Birth Flower Ring, 925 Sterling Silver Sakura Ring, Mother of Pearl",
  "url": "https://www.etsy.com/listing/4532227483/...",
  "seller_location": "United States",
  "is_handmade": true,
  "manufacturer_count": 0,
  "found_on_marketplace": true,
  "image_match_confidence": "strong",
  "image_match_evidence": [
    "https://thai.alibaba.com/product-detail/925-Sterling-Silver-Flower-Real-Shell-1601593196754.html",
    "https://turkish.alibaba.com/product-detail/Handmade-925-Sterling-Silver-Vintage-Buddhist-10000035614962.html"
  ]
}
```

**Nothing was declared** — `manufacturer_count: 0`, marked handmade, ships from the US, so every registered-data check waves it through. But its own product photo is live on Alibaba as a *"925 Sterling Silver Flower Real Shell Ring, Cherry Blossom / Sakura, Mother-of-Pearl, Adjustable"* — a wholesale ring rebranded as a handmade birth-flower ring. The `strong` confidence means the source title corroborates the listing (the actor demotes look-alikes — a different silver ring photographed the same way scores `weak` and never sets `found_on_marketplace`). Run it across a niche and it splits sellers into **🔴 photo traces to a wholesale source** vs **⚪ no marketplace match** in one pass — free, matched on the image, no Google Lens tab required.

**See it on a real match — same bracelets, wholesale vs retail.** `reverseImage` flagged this evil-eye listing and traced the photo to the exact Alibaba wholesale supplier. On the left, PlataVictoria925's Etsy listing (a "lot of 12" for **$20.99**, on sale at $10.49). On the right, the identical bracelets on Alibaba from **$0.29–$0.50 each** (sample: $3). The seller isn't even hiding it — their own title says *"Wholesale."*

| 🛍️ Etsy — PlataVictoria925 · lot of 12, **$20.99** | 🏭 Alibaba — the exact supplier · **$0.29–$0.50 ea** |
|:---:|:---:|
| ![Etsy listing — PlataVictoria925 evil eye bracelets](https://files.catbox.moe/0b3u2r.png) | ![Alibaba — same evil eye bracelets wholesale](https://files.catbox.moe/bn8u2s.png) |

*Same red/blue bracelets, same photo — the tool matched on the pixels, not the title, and landed on a Chinese wholesaler selling them for pennies.*

**It works across categories, not just jewelry — and it beats reworded titles.** This one's an **Etsy's Pick** with *"12 bought in the last 24 hours,"* sold as a **"Personalized Pet Toy Basket | Custom Cotton Rope Storage"** for **$18.16–$30.27**. The photo traces to Alibaba (Qingdao Miserno Arts & Crafts) as a **"Personalized Name Hand Woven Cotton Rope Storage Basket"** at **$2.65–$3.96 a piece** — where *the factory itself does the name embroidery.* The seller reworded "nursery storage basket" into "pet toy box," but the pixels gave it away; even the "personalization" is the factory's, not the seller's.

| 🛍️ Etsy — EtherealEssenceArtCo · **$18.16–$30.27** | 🏭 Alibaba — the exact supplier · **$2.65–$3.96 ea** |
|:---:|:---:|
| ![Etsy listing — EtherealEssenceArtCo personalized rope basket](https://files.catbox.moe/6953ld.png) | ![Alibaba — same personalized-name cotton rope basket](https://files.catbox.moe/oaj0ss.png) |

*An "Etsy's Pick" personalized basket — matched on the photo to a Chinese factory that even embroiders the names. Reworded title, same product.*

#### 🛒 The other two listing-mode signals

**`checkMarketplaces`** — a *text* backstop for the undeclared dropshipper: it searches Alibaba / AliExpress / Temu / DHgate for the product and returns any matching product pages. Broader than reverse-image (catches items even when no photo matches), but a category-level signal rather than exact:

```json
{
  "found_on_marketplace": true,
  "marketplace_matches": [
    { "site": "DHgate",  "title": "Birth Flower Ring 925 Sterling Silver",        "url": "https://www.dhgate.com/product/birth-flower-ring-925-sterling-silver-christmas/1085044385.html" },
    { "site": "Alibaba", "title": "Birthstone Flower Rings Women Non-Tarnish",     "url": "https://www.alibaba.com/product-detail/Birthstone-Flower-Rings-Women-Non-Tarnish_1601820263447.html" }
  ]
}
```

**`findCluster`** — every *other* Etsy shop selling the same product (Etsy's own visually-similar match), with each one's price and live carts. If one "handmade" design is being sold by 28 shops from **$27 to $98**, it isn't handmade — and you see the whole spread at once:

```json
{
  "similar_count": 28,
  "similar_price_min": 27.0,
  "similar_price_max": 98.0,
  "similar_listings": [
    { "shop_name": "JadedSB",     "title": "Dainty Layered Necklace Set, Set of 3, Gold", "price": 98.0, "in_cart_count": 3, "is_star_seller": true },
    { "shop_name": "LusixSparkle", "title": "Eternity Circle Necklace, Karma Necklace",     "price": 27.0, "in_cart_count": 2, "is_star_seller": true }
  ]
}
```

*Same product, 28 storefronts, a 3.6× price spread — the clearest tell that a "handmade" listing is a shared wholesale design.*

**The contrast — a row you *can* source.** Not every shop uses an in-house studio. Here's a real US seller of a "levitating moon lamp" (`made_in_china: true`) whose registered partners are **real, named, contactable suppliers**:

```json
{
  "shop_name": "MareryShop",
  "url": "https://www.etsy.com/listing/1888890617/magnetic-levitating-moon-lamp-galaxy",
  "seller_location": "United States",
  "made_in_china": true,
  "manufacturer_count": 5,
  "manufacturer_names": "Hengyi Technology Co., Ltd, Printify, Shenzhen Sweetmade Gifts CO Ltd, Sichuan Huadun Import & Export Co., Ltd., Zhaoqing Goodwell Electronic Company Limited",
  "manufacturers": [
    {
      "factory": "Hengyi Technology Co., Ltd",
      "factory_location": "Zhaoqing, China",
      "factory_country": "China"
    },
    { "factory": "Shenzhen Sweetmade Gifts CO, Ltd", "factory_location": "Shenzhen, China", "factory_country": "China" },
    { "factory": "Printify", "factory_location": "Los Angeles, CA", "factory_country": "USA" }
  ]
}
```

Here the partner *names* are actual companies — **`Shenzhen Sweetmade Gifts`**, **`Sichuan Huadun Import & Export`**, **`Zhaoqing Goodwell Electronic`**, and **`Printify`** (a POD provider anyone can sign up for). Search a real name like these on Google or Made-in-China and you land on the **actual supplier's page** — and `reverseImage` traces the exact product to the consumer marketplaces it's dropshipped from (this lamp is live on Temu for a fraction of the Etsy price). This is a "custom" US listing that's really a **cheap marketplace product you could order yourself and undercut.** (Compare the earlier `CarloHK` example, where the partner was the seller's own family studio — great for *proving* it's outsourced, but not a supplier you could hire.)

**See for yourself — same lamp, two prices.** The actor flagged this listing as a Chinese factory product. Here it is on **Etsy for $80**, next to the *identical* item (same product photo) on **Temu for $52.29** — the exact source `reverseImage` traces the photo to. Not handmade; a marketplace lamp with an Etsy markup.

| 🛍️ Etsy — MareryShop · **$80.00** | 🏭 Temu — the exact product · **$52.29** |
|:---:|:---:|
| ![Etsy listing — MareryShop moon lamp, $80](https://files.catbox.moe/wxguk6.png) | ![Temu listing — same moon lamp, $52.29](https://files.catbox.moe/uhkd8c.png) |

*Same photo, same lamp — the tool called it, and the Temu link took us straight to the source.*

**`SUMMARY`** record (in the run's Storage tab) — the whole niche as one JSON object: the verdict, `pct_using_partner`, `pct_overseas_by_reviews`, dominant country, the ranked list of factories (with how many shops each supplies), and the country breakdown.

#### 🖥️ Ready-made output views

The **Output** tab ships with two focused table views — pick the lens you need, no CSV wrangling:

- **Factories (one row each)** *(default)* — one row per registered production partner: the **factory** (name, location, what they make), the **seller's claimed location** right beside it (claims-vs-reality at a glance), and — when `reverseImage` is on — the **listing photo next to the exact wholesale photo it was traced to**, plus the source URLs. The visual "who's really behind this" list.
- **Who makes it (verdict)** — one row per seller, led by a **Verdict** column — 🏭 outsourced (declared factory) / 🔴 dropship (no factory declared) / ⚪ self-made (no supplier found) — so you can **sort to group them instantly** (e.g. isolate every seller who *doesn't* use a supplier, or every hidden dropshipper). Plus what they claim vs where it ships, made-in-China, fake-handmade, factory names + countries, and processing time.

Every view exports to CSV / JSON / Excel, and the full nested `manufacturers[]` + reverse-image fields stay in the raw JSON.

### 💰 Pricing

**You pay only when it finds the maker — a low flat rate per registered factory, and a step more when `reverseImage` traces the photo to the exact wholesale source. A genuine miss is never charged.** *(Live per-event prices are shown in the pricing box above.)*

#### What one revealed factory is actually worth

This is data you **cannot get anywhere else** — not from eRank, not from a scraper, not from the listing itself. And a single reveal routinely pays for itself thousands of times over:

- **Source it direct.** The factory behind a top seller's product is the same one *you* can order from — cutting the middleman and typically **40–80% off the unit cost.** A sourcing agent charges **$300–$500** to track down one verified factory. Here it's a rounding error.
- **The middleman math.** Skipping the reseller saves a typical **10–30% markup**: on a $3 factory unit that's **$0.75 saved per unit — $7,500 on a 10,000-unit order.** For a two-cent lookup.
- **Dodge a five-figure mistake.** Before a wholesale or private-label order, confirm a "handmade" supplier isn't secretly a China dropship factory. **One reveal can save a five-figure bad order.**
- **Read the whole niche.** Learning that 40% of the top sellers all run through the same Lahore workshop tells you exactly where the moat is — and where it isn't — before you spend a dollar entering it.

At a low per-factory rate, a full competitive supply-chain map of a niche costs less than lunch — for intel that used to mean weeks of manual sleuthing or a paid sourcing agent.

#### How you're billed — you pay when it finds the maker, however it finds it

- **Registered factory revealed.** The seller declared their production partner and we read it from Etsy's records — the base rate.
- **Wholesale source revealed by photo** *(when `reverseImage` is on).* The product photo was reverse-image matched to its exact source on Alibaba / DHgate / AliExpress / Temu / CJ — the **premium tier**, because it catches the **undeclared** dropshippers who registered *nothing* and are the hardest (and most valuable) to expose. One charge per row, at the tier of the strongest find (a photo match outranks a self-declared factory).
- **A genuine miss is free.** No registered factory *and* no photo match (a truly handmade listing) is never charged. The niche verdict is always free.

*(The exact per-event prices are shown live in the pricing box at the top of this page.)*

- **Pay-per-result** — no subscription, no per-seat fees, no monthly minimum.

So a heavily-outsourced niche bills for the factories it maps; turn on `reverseImage` and it *also* bills for every undeclared dropshipper it catches by photo — the ones that used to slip through free.

> **Tip:** set "Maximum cost per run" to cap spend, or leave it empty for unlimited. Start with `topSellers: 10` to preview the goods before scaling up.

### ❓ FAQ

**Where do Etsy sellers get their products?**
Far more often than buyers realize: overseas factories and print-on-demand / dropship suppliers (Alibaba, DHgate, AliExpress, CJ). Etsy *requires* sellers to declare their production partners — but hides that disclosure from the public listing. This actor reads it straight from Etsy's own records and reverse-image-matches the product photo to the exact wholesale source, so you can see who really makes any product, shop, or niche.

**Is everything on Etsy actually handmade?**
No — and this shows you exactly which isn't. Plenty of "handmade" listings are mass-produced with an overseas factory quietly declared in shop settings (or left blank entirely). The `fake_handmade` flag fires when Etsy marks a listing handmade **and** holds a registered factory for it — its own two records contradicting each other.

**Is dropshipping allowed on Etsy?**
Using production partners is allowed *if the seller discloses them* — Etsy even labels "made with a production partner." What breaks policy is passing factory-made goods off as handmade with no disclosure. This tool tells the two apart automatically (`fake_handmade`, `ships_overseas`, and a reverse-image match to the wholesale source).

**Can you scrape Etsy without the Etsy API?**
Yes. No API key, no developer approval, no waiting on "pending personal approval." Paste a keyword, shop, or listing and go — it reads Etsy's public and production-partner data directly.

**How do I find suppliers to source products for my own Etsy shop?**
Run a proven seller or an entire niche → get the factories behind the best-selling products → order direct and skip the reseller markup (typically **40–80% off** the unit cost). It's competitor sourcing in reverse.

**Where do Etsy sellers get their mockups?**
Many print-on-demand sellers reuse the same stock lifestyle mockups. Turn on `reverseImage` and a "product shot" that's really a shared template gets exposed — a fast way to spot POD shops.

**Do I pay for sellers that don't have a production partner?**
Only if `reverseImage` catches them anyway. A seller with no registered factory is free — *unless* you turned on `reverseImage` and it traced their product photo to an exact wholesale source, in which case it's charged at the premium "wholesale source revealed" tier (you found the real maker they were hiding). A genuinely handmade listing — no factory, no photo match — is never charged. The niche verdict is always free.

**Is this Etsy shop dropshipping? / How do I tell if an Etsy seller is print-on-demand?**
Run the shop (Mode 3) or the listing (Mode 2). If it returns production partners overseas, or `ships_overseas: true` (ships from a different country than it claims), it's outsourced/POD — not handmade — even when `is_handmade` is set. The verdict tells you what % of a shop's or niche's listings are outsourced at a glance.

**Who prints this product / who's the POD supplier behind it?**
Paste the listing ID (Mode 2) or run its shop. The actor returns the actual print provider / production partner(s) — name, location, country — that the seller registered for that listing, including ones **not shown on the public page** — plus a reverse-image link to find the exact product on Alibaba/AliExpress.

**How do I find the manufacturer behind an Etsy listing?**
Same thing — paste the listing ID (Mode 2) or run the niche/shop it belongs to. You get the real manufacturer(s), not an inference.

**Can I see who makes a competitor's product, or who a competitor's shop uses?**
Yes — that's Shop mode. Paste their shop name or URL and get their whole catalog mapped to the factories behind it.

**Does it detect dropshippers or fake-handmade listings?**
Yes. Use the `ships_overseas` origin filter (or cross-check `is_handmade: true` + `made_in_china`, or the `fake_handmade` flag) to surface sellers that claim handmade/local while actually manufacturing and shipping from overseas.

**What if a seller dropships but doesn't register a factory (and ships domestically)?**
That's the honest edge. The `fake_handmade` flag reads Etsy's *registered* production-partner records — so it's certain when a seller declares a factory (many do; it's required). But a seller who registers **nothing** and ships from a domestic warehouse leaves no structured trace, and "no registered factory" is **not** proof of handmade. For those you have two backstops (listing mode): **`checkMarketplaces`** searches Alibaba / AliExpress / Temu for the product *by text*, and **`reverseImage`** reverse-image-searches the listing's actual **photo** (matched on pixels, then title-corroborated) — the exact-match tier that catches photo-thieves even when they reword the title, setting `found_on_marketplace` + `image_match_evidence`. So: **registered → `fake_handmade` (certain); undeclared → `checkMarketplaces` (text) / `reverseImage` (photo) — the catch-the-rest.**

**Does this Etsy seller ship from China? / Is this listing printed on demand or manufactured elsewhere?**
Run the listing or its shop. `ships_from` shows where the package physically originates and `made_in_china` flags a China-based production partner — so you can tell at a glance whether it's really handmade or fulfilled by an overseas factory / POD provider.

**Who makes this item for this Etsy shop? / Same supplier as a top shop?**
Run the shop (Mode 3) or its listings (Mode 2). You get the exact production partner(s) — factory name, location, country — that Etsy holds on record, so you can see who fulfills a shop and whether two shops share the same factory.

**Is it "fake handmade"?**
The `fake_handmade` flag is `true` when Etsy marks a listing handmade **and** holds a registered factory for it — Etsy's own two records contradicting each other. No guessing.

**Is there an official Etsy API for production partners?**
Etsy *mandates* the disclosure but only exposes it inside seller-side settings — not on the public listing and not through any open API. So every third-party "spy" tool is left inferring the supplier from packaging or shipping clues, which is a guess. This actor reads the actual per-listing production-partner record instead.

**Why don't a shop's production partners show on its listings?**
Etsy keeps the disclosure requirement (transparency) separate from what it renders publicly (a clean listing page). The data exists and is required — it's just not surfaced. That gap is exactly what this actor closes.

**Can I actually source from the same factory?**
Yes — match on the photo. Turn on **`reverseImage`** and it reverse-image-searches the product photo to surface the *exact* item on Alibaba / AliExpress / DHgate — the real, contactable factory. Open the source and request a quote. It's title-independent, so it works even when the seller reworded the listing to hide it.

**How many sellers can it analyze?**
Up to 2,000 distinct shops per niche run, and a shop's full catalog in Shop mode. Deeper runs just take proportionally longer. Need to go wider than one niche's search cap? Pull a bulk shop list with the **[Etsy Shop Finder](https://apify.com/yumitori/etsy-shop-finder)** (thousands of shops per niche, past Etsy's ~12k-per-search ceiling), then feed those shops into **Shop mode** here to map each one's supply chain.

**What niches does it work for?**
Any Etsy search term. Some niches are genuinely handmade (you'll see 0% outsourced) and some are heavily outsourced — the actor reflects the real variance instead of guessing.

**Can I test with a small run first?**
Yes — set `topSellers` to 10 (or paste a couple of listing IDs) to see the output before scaling up.

### How This Compares to Other Etsy Tools

**vs. Etsy SEO / research tools (Marmalead, eRank, Alura, Sale Samurai):** they run on keywords, tags, and **estimated** sales/revenue — black-box *guesses*, not measured numbers (their "competitor sales" figures are modeled, not real). Fine for wording a title; **worthless for sourcing.** None of them can tell you **who manufactures a product** or **where** — that data was never in the public listing they scrape. This actor returns the real, on-file record; they return an educated guess.

**vs. import / customs databases (ImportYeti-style):** built for container-scale importers with customs filings. They miss the print-on-demand shops and small overseas workshops that power most of Etsy, and they can't take a *niche* and hand you its sellers mapped to their factories.

**vs. generic Etsy scrapers:** they pull what's on the public listing — title, price, tags, reviews. Production-partner data was never on the public listing. Surfacing it, clustering shared factories, and flagging multi-front operators is a different job, and it's the only job this actor does.

**The bottom line:** everyone else scrapes what Etsy shows the public, or guesses from packaging and shipping clues. This actor reads what Etsy actually holds on file — the seller's own registered production partners — then de-duplicates the shared factories, catches the multi-front operators, and traces the product photo to the exact wholesale source. That's the difference between *guessing* who makes it and *knowing.*

***

*Unofficial research tool. Not affiliated with or endorsed by Etsy. Use responsibly and in line with Etsy's terms and applicable law.*

# Actor input Schema

## `keyword` (type: `string`):

The niche to analyze (e.g. 'custom neon sign', 'resin coaster'). Used only when BOTH 'Shop' and 'Listing IDs' below are empty.

## `shop` (type: `string`):

X-ray one shop's whole catalog + where it sources. e.g. 'TheNeonDistrict' or its shop URL. ⬆ Overrides 'Niche keyword'. Ignored if 'Listing IDs' is filled.

## `listingIds` (type: `array`):

One Etsy listing ID per line (the number in the listing URL). ⬆ HIGHEST priority — if you add any IDs here, the actor does per-listing lookups and IGNORES 'Niche keyword' and 'Shop'.

## `topSellers` (type: `integer`):

Number of distinct shops to return, ranked by the metric below. One listing is fetched per shop, so output ≈ fetch count. Rough timing: 300 ≈ 2 min, 1000 ≈ 7 min. A busy niche can supply a few thousand distinct shops.

## `scanDepth` (type: `integer`):

How many search results to scan before ranking down to your top sellers. Only ~45% of listings are unique shops, so to find N distinct shops, set this to roughly 2.5 × N. Higher = wider coverage, slightly slower. Stops early once it has enough.

## `rankBy` (type: `string`):

How to decide who the 'top' sellers are. Listing reviews is the most accurate per-niche sales proxy.

## `groupByShop` (type: `boolean`):

ON: collapse to distinct shops so 'top sellers' means distinct sellers (their best listing). OFF: allow multiple listings from the same shop. Leave ON for a supply-chain view.

## `onlyWithPartners` (type: `boolean`):

ON: only output sellers that use a production partner (hide the self-made ones) — useful when you specifically want the dropship supply chain. OFF: output every top seller. Either way the verdict reflects ALL analyzed sellers.

## `originFilter` (type: `string`):

Narrow the output by where the factory is. 'Ships from overseas 🚩' catches sellers who claim one country but ship from another. Pick 'Specific country →' to enable the country box below.

## `originCountry` (type: `string`):

IGNORED unless the filter above is set to 'Specific country →'. Then: keep only sellers whose factory is in this country. Ordered by how often factories are based there.

## `minReviews` (type: `integer`):

Ignore shops whose ranked listing has fewer than this many reviews — filters out tiny/noise shops so the list is real players only. 0 = no floor.

## `madeInChina` (type: `boolean`):

Mode 2 only. ON: keep only listings whose production partner is located in China. Combine with the is\_handmade flag and ships\_from signal to surface sellers claiming handmade while manufacturing/shipping overseas.

## `raw` (type: `boolean`):

Mode 2 only. ON: output the complete untouched listing response (huge, ~80+ fields) instead of the clean flat record. Leave OFF unless you need everything.

## `checkMarketplaces` (type: `boolean`):

Listing-IDs mode only. For each listing, also searches Alibaba, AliExpress and Temu for the product and returns any matching product pages (`marketplace_matches` + `found_on_marketplace`). Catches UNDECLARED dropshippers — sellers with no registered production partner who still resell a marketplace product. Adds a few seconds per listing.

## `findCluster` (type: `boolean`):

Listing-IDs mode only. Returns every OTHER Etsy shop selling the same product (Etsy's own visually-similar / image match) with their prices and carts — so you see the price spread across the cluster (`similar_listings`, `similar_count`, `similar_price_min/max`). If a dozen 'handmade' shops sell one product at wildly different prices, it isn't handmade. Adds a few seconds per listing.

## `reverseImage` (type: `boolean`):

Works in all modes (Niche, Shop, Listing-IDs). Reverse-image-searches each product photo across DHgate, Alibaba, AliExpress, Temu, CJ Dropshipping and Made-in-China — matched on the actual pixels, NOT the title. This is the exact tool you'd use by hand with Google Lens, automated: it catches undeclared dropshippers who reuse a supplier's photos even when they reword the title and registered no factory. When a match is found it sets `found_on_marketplace: true` and returns the direct product-page URLs it found the photo on (`image_match_evidence`) plus `image_match_confidence`. Billed at $0.05 per confirmed source found (vs $0.02 for a registered factory). A live per-product lookup (a few seconds each) — see 'reverseImageMax' for the cap.

## `reverseImageMax` (type: `integer`):

Only used when 'reverseImage' is on. Image-matching is a live per-product lookup (a few seconds each), so by default it runs on the first 250 listings and the rest still get the full production-partner record. Raise this to cover a larger set — expect longer runs, and increase Max run time to match.

## Actor input object example

```json
{
  "keyword": "custom neon sign",
  "listingIds": [],
  "topSellers": 5,
  "scanDepth": 50,
  "rankBy": "listing_reviews",
  "groupByShop": true,
  "onlyWithPartners": true,
  "originFilter": "any",
  "minReviews": 0,
  "madeInChina": false,
  "raw": false,
  "checkMarketplaces": false,
  "findCluster": false,
  "reverseImage": false,
  "reverseImageMax": 250
}
```

# 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 = {
    "keyword": "custom neon sign",
    "shop": "",
    "listingIds": [],
    "topSellers": 5,
    "scanDepth": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("yumitori/etsy-manufacturer-finder").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 = {
    "keyword": "custom neon sign",
    "shop": "",
    "listingIds": [],
    "topSellers": 5,
    "scanDepth": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("yumitori/etsy-manufacturer-finder").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 '{
  "keyword": "custom neon sign",
  "shop": "",
  "listingIds": [],
  "topSellers": 5,
  "scanDepth": 50
}' |
apify call yumitori/etsy-manufacturer-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Etsy Dropshipping & POD Supplier Finder — Who Makes It",
        "description": "Find the factory, manufacturer, or POD supplier behind any Etsy listing, shop, or niche. Is this shop dropshipping? Who makes this product? Reads Etsy's own registered production-partner records — including the ones hidden from the public page — and flags fake-handmade dropshippers.",
        "version": "0.1",
        "x-build-id": "oXwla8Ij2cuq6F6R8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/yumitori~etsy-manufacturer-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-yumitori-etsy-manufacturer-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/yumitori~etsy-manufacturer-finder/runs": {
            "post": {
                "operationId": "runs-sync-yumitori-etsy-manufacturer-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/yumitori~etsy-manufacturer-finder/run-sync": {
            "post": {
                "operationId": "run-sync-yumitori-etsy-manufacturer-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keyword": {
                        "title": "Niche / keyword",
                        "type": "string",
                        "description": "The niche to analyze (e.g. 'custom neon sign', 'resin coaster'). Used only when BOTH 'Shop' and 'Listing IDs' below are empty."
                    },
                    "shop": {
                        "title": "Shop name or URL",
                        "type": "string",
                        "description": "X-ray one shop's whole catalog + where it sources. e.g. 'TheNeonDistrict' or its shop URL. ⬆ Overrides 'Niche keyword'. Ignored if 'Listing IDs' is filled."
                    },
                    "listingIds": {
                        "title": "Listing IDs",
                        "type": "array",
                        "description": "One Etsy listing ID per line (the number in the listing URL). ⬆ HIGHEST priority — if you add any IDs here, the actor does per-listing lookups and IGNORES 'Niche keyword' and 'Shop'.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "topSellers": {
                        "title": "How many top sellers to output",
                        "minimum": 5,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Number of distinct shops to return, ranked by the metric below. One listing is fetched per shop, so output ≈ fetch count. Rough timing: 300 ≈ 2 min, 1000 ≈ 7 min. A busy niche can supply a few thousand distinct shops.",
                        "default": 30
                    },
                    "scanDepth": {
                        "title": "How wide to search for candidates",
                        "minimum": 10,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "How many search results to scan before ranking down to your top sellers. Only ~45% of listings are unique shops, so to find N distinct shops, set this to roughly 2.5 × N. Higher = wider coverage, slightly slower. Stops early once it has enough.",
                        "default": 300
                    },
                    "rankBy": {
                        "title": "Rank the top sellers by",
                        "enum": [
                            "listing_reviews",
                            "carts",
                            "etsy_rank",
                            "shop_sales"
                        ],
                        "type": "string",
                        "description": "How to decide who the 'top' sellers are. Listing reviews is the most accurate per-niche sales proxy.",
                        "default": "listing_reviews"
                    },
                    "groupByShop": {
                        "title": "One row per shop",
                        "type": "boolean",
                        "description": "ON: collapse to distinct shops so 'top sellers' means distinct sellers (their best listing). OFF: allow multiple listings from the same shop. Leave ON for a supply-chain view.",
                        "default": true
                    },
                    "onlyWithPartners": {
                        "title": "Only show sellers that outsource",
                        "type": "boolean",
                        "description": "ON: only output sellers that use a production partner (hide the self-made ones) — useful when you specifically want the dropship supply chain. OFF: output every top seller. Either way the verdict reflects ALL analyzed sellers.",
                        "default": true
                    },
                    "originFilter": {
                        "title": "Only sellers manufacturing in…",
                        "enum": [
                            "any",
                            "outsourced",
                            "overseas",
                            "ships_overseas",
                            "china",
                            "domestic",
                            "country"
                        ],
                        "type": "string",
                        "description": "Narrow the output by where the factory is. 'Ships from overseas 🚩' catches sellers who claim one country but ship from another. Pick 'Specific country →' to enable the country box below.",
                        "default": "any"
                    },
                    "originCountry": {
                        "title": "…specific country",
                        "enum": [
                            "China",
                            "India",
                            "Pakistan",
                            "Bangladesh",
                            "Vietnam",
                            "Turkey",
                            "Thailand",
                            "Indonesia",
                            "Hong Kong",
                            "Taiwan",
                            "Philippines",
                            "Cambodia",
                            "Sri Lanka",
                            "Nepal",
                            "United Arab Emirates",
                            "United States",
                            "United Kingdom",
                            "Canada",
                            "Australia",
                            "Germany",
                            "Poland",
                            "Italy",
                            "Spain",
                            "France",
                            "Portugal",
                            "Netherlands",
                            "Mexico",
                            "Brazil",
                            "Ukraine",
                            "Romania",
                            "Bulgaria",
                            "Lithuania",
                            "Latvia",
                            "Czech Republic",
                            "Greece",
                            "Ireland",
                            "Peru",
                            "Morocco",
                            "Egypt",
                            "South Africa",
                            "Israel",
                            "Japan",
                            "South Korea",
                            "Malaysia"
                        ],
                        "type": "string",
                        "description": "IGNORED unless the filter above is set to 'Specific country →'. Then: keep only sellers whose factory is in this country. Ordered by how often factories are based there."
                    },
                    "minReviews": {
                        "title": "Minimum reviews per seller",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Ignore shops whose ranked listing has fewer than this many reviews — filters out tiny/noise shops so the list is real players only. 0 = no floor.",
                        "default": 0
                    },
                    "madeInChina": {
                        "title": "Filter: only 'made in China'",
                        "type": "boolean",
                        "description": "Mode 2 only. ON: keep only listings whose production partner is located in China. Combine with the is_handmade flag and ships_from signal to surface sellers claiming handmade while manufacturing/shipping overseas.",
                        "default": false
                    },
                    "raw": {
                        "title": "Return raw full response",
                        "type": "boolean",
                        "description": "Mode 2 only. ON: output the complete untouched listing response (huge, ~80+ fields) instead of the clean flat record. Leave OFF unless you need everything.",
                        "default": false
                    },
                    "checkMarketplaces": {
                        "title": "Check Alibaba / Temu / AliExpress",
                        "type": "boolean",
                        "description": "Listing-IDs mode only. For each listing, also searches Alibaba, AliExpress and Temu for the product and returns any matching product pages (`marketplace_matches` + `found_on_marketplace`). Catches UNDECLARED dropshippers — sellers with no registered production partner who still resell a marketplace product. Adds a few seconds per listing.",
                        "default": false
                    },
                    "findCluster": {
                        "title": "Find the exact-product cluster",
                        "type": "boolean",
                        "description": "Listing-IDs mode only. Returns every OTHER Etsy shop selling the same product (Etsy's own visually-similar / image match) with their prices and carts — so you see the price spread across the cluster (`similar_listings`, `similar_count`, `similar_price_min/max`). If a dozen 'handmade' shops sell one product at wildly different prices, it isn't handmade. Adds a few seconds per listing.",
                        "default": false
                    },
                    "reverseImage": {
                        "title": "Reverse-image search the photo (exact match)",
                        "type": "boolean",
                        "description": "Works in all modes (Niche, Shop, Listing-IDs). Reverse-image-searches each product photo across DHgate, Alibaba, AliExpress, Temu, CJ Dropshipping and Made-in-China — matched on the actual pixels, NOT the title. This is the exact tool you'd use by hand with Google Lens, automated: it catches undeclared dropshippers who reuse a supplier's photos even when they reword the title and registered no factory. When a match is found it sets `found_on_marketplace: true` and returns the direct product-page URLs it found the photo on (`image_match_evidence`) plus `image_match_confidence`. Billed at $0.05 per confirmed source found (vs $0.02 for a registered factory). A live per-product lookup (a few seconds each) — see 'reverseImageMax' for the cap.",
                        "default": false
                    },
                    "reverseImageMax": {
                        "title": "Reverse-image: max listings to match",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Only used when 'reverseImage' is on. Image-matching is a live per-product lookup (a few seconds each), so by default it runs on the first 250 listings and the rest still get the full production-partner record. Raise this to cover a larger set — expect longer runs, and increase Max run time to match.",
                        "default": 250
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
