# 1688 Image Search (`maksim_lazouski/1688-image-search`) Actor

Search 1688.com by photo: paste product image links from Amazon, AliExpress, Shopify or any site and get the matching 1688 wholesale offers with price in CNY and USD, units sold, repeat buyers and the supplier. Up to 600 matches a photo, no login, pay per photo.

- **URL**: https://apify.com/maksim_lazouski/1688-image-search.md
- **Developed by:** [Maksim Lazouski](https://apify.com/maksim_lazouski) (community)
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 photo searcheds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does 1688 Image Search do?

1688 Image Search finds the offers on [1688.com](https://www.1688.com), the Chinese wholesale marketplace, that **look like your product photo**. Give it **links of photos**: a product picture from Amazon, AliExpress, Shopify, TikTok Shop, 1688 or your own site. For each photo it returns the offers 1688's own search by photo shows, best match first: price in CNY and US dollars, units sold, repeat-buyer rate, the supplier, its years on 1688, province and city, picture and link.

- **No 1688 account, no cookies, no proxy of your own.** Paste photo links and press Start.
- **Up to 600 matches per photo**: 60 a page, up to 10 pages. The first 60 by default.
- **Prices in CNY and US dollars**, at the European Central Bank's rate of the day.
- **English titles** for $0.10 per 1,000 rows, for buyers who do not read Chinese.
- **Full offer rows** if you want them: open every match to get price by quantity, every variant with stock, the supplier card, ratings and dropshipping terms.
- **You pay per photo** (with its first 60 matches) and per further page of 60, plus $0.005 when a run starts.

![Example output of 1688 Image Search: matches for a photo of an insulated cup, with titles in Chinese and English, prices in CNY and USD, smallest order, units sold and supplier years](https://api.apify.com/v2/key-value-stores/TV7hYdY6BhVu4w53W/records/image-output.png)

It runs on the Apify platform, so you also get scheduling, an API, webhooks, integrations, and export of the results to JSON, CSV, Excel or HTML.

### What data can you get from a search by photo?

| Group | Fields |
|---|---|
| Offer | offer id, link, title, picture, ad or not |
| Price | price in CNY, price note (such as a time-limited price), price in US dollars and the rate it was worked out at, the smallest order (such as "2件起批", from 2 pieces) |
| Sales | units sold as 1688 shows them and as a number, orders booked, repeat-buyer rate |
| Supplier | company name, seller ids, shop link, years on 1688, business type (factory, trading), factory inspection, super factory |
| Place | province and city |
| Tags | 1688's own tags, such as "先采后付" (pay after you buy) |
| Your photo | the photo's link, the page of results, the place on that page and the rank among all matches of the photo |
| English title (add-on) | `title_en`, an English machine translation of the title |

With **Open every match** each match comes back as a full offer row instead, with about 100 fields: price by quantity, smallest order, every variant with its price and stock, orders in 30 days, rating, shipping, the supplier card, dropshipping terms and the description.

### How to search 1688 by photo

1. Open the actor and go to the **Input** tab.
2. Paste **photo links**, one per line. On most sites, right-click a product picture and choose "Copy image address".
3. Choose how many **pages of matches** you want per photo (60 each).
4. Turn on **English titles** or **Open every match** if you need them.
5. Press **Start**, then open the **Output** tab or export the dataset as JSON, CSV or Excel.

#### Ready-made tasks

Start from a task that is already set up, then replace the photo link with your own:

- [Find 1688 phone case suppliers by photo](https://apify.com/maksim_lazouski/1688-image-search/examples/find-1688-phone-case-suppliers-by-photo)
- [Compare 1688 prices of a cup by its photo](https://apify.com/maksim_lazouski/1688-image-search/examples/compare-insulated-cup-prices-by-photo)
- [Find 1688 leggings factories by photo](https://apify.com/maksim_lazouski/1688-image-search/examples/find-1688-leggings-factories-by-photo)
- [1688 Bluetooth earphones by photo, in English](https://apify.com/maksim_lazouski/1688-image-search/examples/bluetooth-earphones-on-1688-by-photo-in-english)
- [1688 tumbler offers by photo, with full details](https://apify.com/maksim_lazouski/1688-image-search/examples/find-1688-tumbler-factories-by-photo-full-offers)

What finds the best matches: one product on a plain background, as on a shop's product page. A photo with several products or with people in it finds less. A photo taken from 1688 itself often finds the very offer it came from, and the other sellers of the same product.

### How much does it cost to search 1688 by photo?

You pay per photo searched and per page of matches. The price depends on your Apify plan:

| What | Free | Starter | Scale | Business |
|---|---|---|---|---|
| A photo searched, with its first page of up to 60 matches | $0.004 | $0.0036 | $0.0032 | $0.0028 |
| Each further page of up to 60 matches | $0.002 | $0.0018 | $0.0016 | $0.0014 |
| A full offer row, with "Open every match" (per 1,000) | $3.00 | $2.70 | $2.40 | $2.00 |
| English title (add-on, per 1,000 rows that get one) | $0.10 | $0.10 | $0.10 | $0.10 |

A run also costs $0.005 to start, on every plan. Apify counts the start once per GB of the run's memory, so at the default memory it is one start.

The examples below are at the Free plan price, without the start.

- One photo with 60 matches costs $0.004.
- 100 photos with 60 matches each cost $0.40.
- One photo with 600 matches (10 pages) costs $0.022.
- English titles for one photo's 60 matches add $0.006.
- With "Open every match" you pay for the full offer rows instead of the matches: one photo's 60 offers cost $0.18.

You do not pay for a photo that could not be read, for a photo nothing on 1688 looks like, or for a page the run could not get. Apify's free plan comes with $5 of usage a month, which is enough for more than 1,000 photos with 60 matches each.

### Input

| Field | What it does |
|---|---|
| `images` | Photo links, one per line: `https://...` links of JPEG, PNG, WebP or GIF pictures, or `data:image/...;base64,...` links. |
| `maxPagesPerImage` | Pages of matches per photo, 60 each: 1 (default) to 10. |
| `scrapeDetails` | Off: one row per match. On: the full offer row of every match. |
| `includeExtras` | With `scrapeDetails`: the supplier card, ratings, dropshipping terms and description of every offer. On by default. |
| `translateTitles` | Adds `title_en` to every row. |
| `maxItems` | Stop after this many rows. A page cut short by it is charged as a page. |
| `maxConcurrency` | How many photos are read at the same time. 10 by default. |

Three photos, the first 120 matches of each, with English titles:

```json
{
    "images": [
        "https://cbu01.alicdn.com/img/ibank/O1CN01o0I3uZ1vg6nkADaeR_!!4210846201-0-cib.jpg",
        "https://m.media-amazon.com/images/I/your-product-photo.jpg",
        "https://cdn.shopify.com/s/files/your-store/products/your-product.png"
    ],
    "maxPagesPerImage": 2,
    "translateTitles": true
}
```

### Output

Every row has a `type` field: `image_match` for a match, `offer` for a full offer row. `image_url` is the photo's link as you gave it; a photo given as a data link is named by its type and a digest instead, such as `data:image/jpeg;sha256=4f1c09a2b7e3d5c86a10`, so the rows stay small.

```json
{
    "type": "image_match",
    "image_url": "https://cbu01.alicdn.com/img/ibank/O1CN01o0I3uZ1vg6nkADaeR_!!4210846201-0-cib.jpg",
    "rank": 1,
    "page": 1,
    "position": 1,
    "offer_id": "903283179849",
    "title": "渐变304不锈钢保温杯高颜值车载便携弹跳杯上班族随行办公杯批发",
    "price": 6.73,
    "price_note": "限时价",
    "price_usd": 1.009,
    "min_order": 2,
    "min_order_text": "2件起批",
    "sold_text": "1.3万+件",
    "sold_count_min": 13000,
    "booked_count": 157,
    "repurchase_rate": "71%",
    "company": "永康市世杭工贸有限公司",
    "shop_url": "http://shop17w9530286664.1688.com?tracelog=p4p",
    "supplier_years": 4.0,
    "province": "浙江",
    "city": "金华市",
    "business_type": "生产加工",
    "factory_inspection": false,
    "super_factory": false,
    "tags": ["先采后付", "回头率71%"],
    "image": "https://cbu01.alicdn.com/img/ibank/O1CN01Qw6vDr1uISz4k823H_!!2215462296014-0-cib.jpg",
    "is_ad": true,
    "url": "https://detail.1688.com/offer/903283179849.html",
    "usd_per_cny": 0.149896,
    "usd_rate_date": "2026-11-06"
}
```

### Limits you should know

- **The matches are 1688's own**: what its search by photo on the site shows for the same photo. A photo from 1688 finds the same product well; a product shot from another shop finds similar products, and the very same one less often.
- **Up to 600 matches per photo** (10 pages of 60). 1688 reported about 700 for the photos we tried.
- **Ads** (sponsored offers) are in the results where 1688 puts them, marked `"is_ad": true`; there were 3 to 8 among the first 60 in our runs.
- **Text is returned as 1688 gives it:** in Chinese, prices in CNY (and in US dollars beside them).
- **The photo is shrunk** to at most 360 pixels a side before it goes to 1688, as 1688's own page does it.
- **Photo size:** a file of up to 15 MB; a JPEG of up to 60 megapixels, other formats up to 25. A bigger one is listed in `FAILED` and not charged.
- **Search by keyword, or offers by their link:** that is [1688 Product Scraper](https://apify.com/maksim_lazouski/1688-product-scraper).

### FAQ

#### Do I need a 1688 account, cookies or a proxy?

No. The actor searches the way 1688's page does for a visitor who is not logged in, and brings its own connections.

#### Where do I get the photo links?

On most shops, right-click the product picture and choose "Copy image address". A product export of your own shop (Shopify, WooCommerce) has a column with them. A picture on your computer can be given as a `data:image/jpeg;base64,...` link.

#### What happens when a photo could not be searched?

Each photo is tried up to three times, each time from a new address. What still fails is listed in the `FAILED` record of the run's key-value store, with the reason: the link gave no picture, nothing on 1688 looks like it, or 1688 refused the search. Nothing is charged for it. If 1688 starts refusing visitors, the run does not press on: it waits and tries again with one visitor at a time; if that does not help within a few minutes, it stops and keeps what it stored. Start it again with **Resurrect** and it goes on from where it stopped. A row is never stored twice.

#### Can I run it on a schedule or call it from my code?

Yes. Use Apify's schedules for regular runs, and the Apify API or its clients for Python and JavaScript to start runs and read results. The `maxItems` field and the run's spending limit keep a run within a budget.

#### Is it legal to search 1688 by photo?

The actor sends your photo to 1688's public search by photo and reads what 1688 shows a visitor who is not logged in. Offers name companies and their shops, and a seller can be a private person, so handle names as the data protection rules that apply to you require. Send only photos you may use. You are responsible for how you use the data; if you are not sure, ask a lawyer.

#### Something is wrong or a field is missing

Open an issue on the actor's **Issues** tab with the photo link.

1688 is a trademark of its owner. This actor is not affiliated with or endorsed by 1688.com or Alibaba Group.

# Actor input Schema

## `images` (type: `array`):

Links of product photos, one per line: a picture from Amazon, AliExpress, Shopify, 1688 or any other site, or a data:image link. JPEG, PNG, WebP and GIF are taken. Each photo is searched on 1688 on its own.

## `maxPagesPerImage` (type: `integer`):

1688 shows the offers that look like a photo 60 to a page, best matches first. 1 gives the first 60; each page more gives 60 more, up to 10 pages (600). An offer 1688 shows twice for one photo is returned once.

## `scrapeDetails` (type: `boolean`):

Off: one row per match (title, price, sales, supplier, link). On: the actor opens the offer page of every match and returns the full offer row instead: price by quantity, every variant with stock, the supplier card, ratings and dropshipping terms.

## `includeExtras` (type: `boolean`):

With "Open every match": adds to every offer the blocks its page loads beside the main data. Turn off to get only what the offer page itself carries.

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

Adds title_en to every row: an English machine translation of the Chinese title. Charged as one more event per row that gets an English title; rows without one are not charged for it.

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

The run stops once it has stored this many rows. Leave empty for no limit.

## `maxConcurrency` (type: `integer`):

How many photos (and, with "Open every match", offers) are read at the same time, each from its own address. More is faster; the default suits most jobs.

## Actor input object example

```json
{
  "images": [
    "https://cbu01.alicdn.com/img/ibank/O1CN01o0I3uZ1vg6nkADaeR_!!4210846201-0-cib.jpg"
  ],
  "maxPagesPerImage": 1,
  "scrapeDetails": false,
  "includeExtras": true,
  "translateTitles": false,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `results` (type: `string`):

One row per 1688 offer that looks like one of your photos (or, with "Open every match", per full offer); the field `image_url` says which photo.

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

How many photos were searched and how many matches stored, how many failed, and why the run stopped if it did.

## `failed` (type: `string`):

The photos that could not be searched, each with the reason (not a picture, no matches, the shop refused). An empty list when every photo was searched.

# 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 = {
    "images": [
        "https://cbu01.alicdn.com/img/ibank/O1CN01o0I3uZ1vg6nkADaeR_!!4210846201-0-cib.jpg"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maksim_lazouski/1688-image-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 = { "images": ["https://cbu01.alicdn.com/img/ibank/O1CN01o0I3uZ1vg6nkADaeR_!!4210846201-0-cib.jpg"] }

# Run the Actor and wait for it to finish
run = client.actor("maksim_lazouski/1688-image-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 '{
  "images": [
    "https://cbu01.alicdn.com/img/ibank/O1CN01o0I3uZ1vg6nkADaeR_!!4210846201-0-cib.jpg"
  ]
}' |
apify call maksim_lazouski/1688-image-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maksim_lazouski/1688-image-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/1YlLuI08Ktdz17zef/builds/rNg3l16sV8ap3BSWx/openapi.json
