# 1688 Image & Link Search: Find the Factory (`factorylens_data/1688-image-link-search`) Actor

Paste an Amazon or Shopify link, a photo, or a whole Shopify store and get the 1688.com factories selling the same product: AI-verified matches, wholesale price in USD/EUR, supplier signals, sales and your margin. No 1688 account, no Chinese needed.

- **URL**: https://apify.com/factorylens_data/1688-image-link-search.md
- **Developed by:** [FactoryLens Data](https://apify.com/factorylens_data) (community)
- **Categories:** E-commerce, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 1688 Image & Link Search: find the factory behind any product

Paste an **Amazon or Shopify product link** (or just a photo) and get the **1688.com factories selling the same product**, with the wholesale price in USD/EUR, supplier trust signals and **your estimated margin**. Every match is **checked by an AI vision model** and labelled `exact`, `similar` or `different`, so you don't waste time on look-alikes.

No 1688 account, no Chinese, no VPN.

### What makes it different

| | Typical 1688 scrapers | **This Actor** |
|---|---|---|
| Input | Chinese keywords or a photo | **Product link** (Amazon, Shopify, most shops), photo, or photo + title |
| Finding the product | Keyword or image lookup, unchecked | AI writes the Chinese queries a 1688 buyer would use, searches them in parallel, then an **AI vision model compares every candidate** with your photo |
| "Is it really the same product?" | You check by hand | **AI-verified** `exact` / `similar` / `different` on every match, exact matches first |
| Duplicates | 20 copies of the same listing | **"This design is sold by N suppliers"**, exact matches ranked first |
| Business answer | Price in CNY | Price in **USD/EUR/GBP**, **landed cost** (AI-estimated weight × shipping to US/EU/UK + duty) and **margin** vs your selling price |
| "Can I trust this supplier?" | Raw badges | **Supplier trust score (0-100)** with reasons |
| No exact match? | Empty result | **Second search pass**: the AI learns the sellers' wording from the closest listings and searches again |
| Titles | Chinese | **English** + original Chinese |

Benchmarks (October 2026): on 24 dropshipping products the right factory listing was in the top 5 for **about 80% of photos** and **96% of photo + title inputs**; on 28 current Amazon best-sellers, **about 85% of the generic / private-label products** had the right listing in the top 5. A typical product takes **20-40 seconds**.

### Built for generic and private-label products

The Actor finds **manufacturers of generic products** (the kind sold under many store brands). For **branded designs** (e.g. Apple, Stanley) the AI detects the brand, labels 1688 results as `lookalike` instead of `exact` and adds a `brandWarning`: those listings are not the original product, and selling copies of a protected design or trademark may infringe intellectual-property rights. Don't use this tool to source counterfeits.

### Who it's for

- 🛒 **Dropshippers & Shopify sellers**: find the real factory behind a trending product and its true price.
- 📦 **Amazon / private-label sellers**: compare several factories for one product before ordering samples.
- 🧭 **Sourcing agents**: turn client links into supplier shortlists in minutes.
- 🤖 **AI agents & automations**: one API call, structured JSON, works through the Apify MCP server.

### How to use it

1. Put product links in **Product links**, photos in **Product photos**, or both.
2. Optional: set your **currency** and **shipping cost per unit** to get margins.
3. Run. Each product returns its best matches, exact matches first.

**Tip:** for AliExpress, Etsy and Temu (they block automated reading), use **Photo + title**: `{"imageUrl": "...", "title": "Electric can opener", "price": 24.99}`. The title tells the AI what the product is; the price enables the margin.

#### Input example

```json
{
  "productUrls": ["https://toolvik.com/products/cocktail-smoker-kit"],
  "products": [{ "imageUrl": "https://example.com/can-opener.jpg", "title": "One-touch electric can opener", "price": 24.99 }],
  "maxResultsPerItem": 10,
  "currency": "USD",
  "shippingCostPerUnit": 4,
  "enrichTopResults": 3
}
```

#### Output example (one row per match)

```json
{
  "inputUrl": "https://toolvik.com/products/cocktail-smoker-kit",
  "inputPrice": 43.99,
  "identifiedAs": "Wooden cocktail smoker kit with wood chips",
  "searchQueries": ["木盒鸡尾酒烟熏套装 木屑", "鸡尾酒烟熏器", "威士忌烟熏套装礼盒"],
  "rank": 1,
  "aiMatch": "exact",
  "matchScore": 100,
  "suppliersSellingThisDesign": 6,
  "titleEn": "Cross-border wooden cocktail smoker gift box set",
  "priceCny": 76,
  "priceUsd": 11.36,
  "estimatedMarginPerUnit": 28.63,
  "estimatedMarginPct": 65.1,
  "minOrderQty": 1,
  "soldApprox": 3400,
  "supplierName": "深圳市创领达家居用品有限公司",
  "url": "https://detail.1688.com/offer/....html"
}
```

With **Read full supplier pages** (`enrichTopResults`) the top matches also get price tiers (MOQ ladder), stock, ship-from city, dropshipping and free-sample flags.

### Pricing

Pay per event: you pay **per product searched** (only when matches are returned) plus, optionally, **per supplier page** read in full. No subscription. Prices are shown on the Pricing tab.

### Audit a whole Shopify store

Put a store URL in **Whole Shopify stores** (yours or a competitor's): every product is matched to its 1688 factory and the run's **SUMMARY** gives one row per product with the typical factory price and estimated margin. Products are processed in parallel (4 at a time by default).

### Landed cost and real margin

Set **Ship to** (US, EU or UK) and, if you know it, the **import duty %**. The AI estimates the shipping weight of one unit, we apply a typical small-parcel air rate from China and return `landedCostPerUnit` and the margin on it. Know your real shipping cost? Put it in **shipping + fees per unit** and it replaces the estimate.

### Keep your suppliers in check

Turn on **Start price monitoring of the exact matches** (or schedule the ready-made `MONITOR_INPUT`) and pair it with **[1688 Supplier & Price Monitor](https://apify.com/factorylens_data/1688-supplier-price-monitor)**: schedule it daily and get Telegram or webhook alerts when a supplier changes price, MOQ or stock, or when a new, cheaper factory appears for your keywords.

### FAQ

**Do I need a 1688 account or a Chinese phone number?** No.

**How accurate is it?** On our benchmark of 24 real store products: about 80% (photo only) and 96% (photo + title or product link) had the right factory listing in the top 5. Very generic products (a plain black tyre inflator) are the hardest. Check the `aiMatch` label (`exact`, `similar`, `lookalike` for branded designs).

**Why do some 1688 prices look too low?** 1688 shows the price of the cheapest variant, which can be an accessory or spare part. The per-product summary uses the **median price of the exact matches**, and `enrichTopResults` reads the real price tiers (MOQ ladder) of the top matches.

**Is the margin exact?** It's an estimate: your selling price minus the factory unit price (converted at the daily ECB rate) minus the shipping cost you enter. Duties, payment fees and MOQ tiers are not included unless you add them to the shipping cost.

**Which shops work with links?** Amazon, Shopify stores and most shops that publish product data. AliExpress, Etsy and Temu block automated reading: use photo + title.

**Is the data public?** Yes. The Actor reads publicly visible 1688 listings; it does not log in or collect personal data.

### More FactoryLens tools

- 🧾 **[1688 Product Search](https://apify.com/factorylens_data/1688-product-search)**: search 1688 by keyword in any language, with English titles, USD/EUR prices and supplier trust scores.

# Actor input Schema

## `productUrls` (type: `array`):

Amazon, Shopify or other shop product pages. We read title, price and photo, then find the factory on 1688.

## `imageUrls` (type: `array`):

Public image URLs (jpg, png, webp).

## `imagesBase64` (type: `array`):

For photos on your computer or from an app/agent: base64 strings or data URLs, or objects {"base64": "...", "fileName": "x.jpg", "title": "...", "price": 19.99}.

## `products` (type: `array`):

Objects like {"imageUrl": "...", "title": "Electric can opener", "price": 24.99}. The title tells the AI what the product is; price enables margin.

## `storeUrls` (type: `array`):

Paste a Shopify store URL (yours or a competitor's): every product is matched to its 1688 factory, with margin. Capped by 'Max products per run'.

## `maxResultsPerItem` (type: `integer`):

How many 1688 matches to return for each product.

## `currency` (type: `string`):

Wholesale prices are converted from CNY at the daily ECB rate.

## `shippingCostPerUnit` (type: `number`):

If set, used instead of our shipping estimate. Leave 0 to use the estimate for the destination below.

## `shipTo` (type: `string`):

We estimate the shipping weight with AI and apply a typical small-parcel air rate from China to get a landed cost. Choose NONE to leave shipping out.

## `importDutyPct` (type: `number`):

Applied to the factory price. Tariffs change often: set the rate that applies to your product and country.

## `onlyExactMatches` (type: `boolean`):

Return only matches the AI judged to be the same product design.

## `enrichTopResults` (type: `integer`):

Adds price tiers, MOQ, stock, ship-from, dropshipping and free-sample flags. Billed per supplier page.

## `translateTitles` (type: `boolean`):

Adds an English title next to the original Chinese one.

## `candidatesPerQuery` (type: `integer`):

How many 1688 results are fetched for each search query before visual ranking.

## `maxItems` (type: `integer`):

Safety cap on the number of input products processed in one run.

## `parallelProducts` (type: `integer`):

Higher = faster runs for big lists.

## `secondPass` (type: `boolean`):

If no exact match is found, the AI learns the sellers' wording from the closest listings and searches again (adds ~20 s).

## `watchExactMatches` (type: `boolean`):

Starts the 1688 Supplier & Price Monitor (billed separately) on the exact factory matches. The ready-to-schedule input is always saved as MONITOR_INPUT.

## `watchlistName` (type: `string`):

Used when starting the monitor.

## Actor input object example

```json
{
  "productUrls": [
    "https://toolvik.com/products/cocktail-smoker-kit"
  ],
  "maxResultsPerItem": 10,
  "currency": "USD",
  "shippingCostPerUnit": 0,
  "shipTo": "US",
  "importDutyPct": 0,
  "onlyExactMatches": false,
  "enrichTopResults": 0,
  "translateTitles": true,
  "candidatesPerQuery": 40,
  "maxItems": 20,
  "parallelProducts": 4,
  "secondPass": true,
  "watchExactMatches": false,
  "watchlistName": "factorylens-matches"
}
```

# Actor output Schema

## `matches` (type: `string`):

One row per 1688 match (AI match label, wholesale price, margin, supplier signals).

## `aiUsage` (type: `string`):

AI usage of the run.

## `summary` (type: `string`):

Best factory, price and margin for each input product: ideal for whole-store audits.

## `monitorInput` (type: `string`):

Ready-made input for the 1688 Supplier & Price Monitor.

# 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 = {
    "productUrls": [
        "https://toolvik.com/products/cocktail-smoker-kit"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("factorylens_data/1688-image-link-search").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 = { "productUrls": ["https://toolvik.com/products/cocktail-smoker-kit"] }

# Run the Actor and wait for it to finish
run = client.actor("factorylens_data/1688-image-link-search").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "productUrls": [
    "https://toolvik.com/products/cocktail-smoker-kit"
  ]
}' |
apify call factorylens_data/1688-image-link-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,factorylens_data/1688-image-link-search"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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