{
  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}