# TikTok Shop to 1688 Arbitrage Finder (`cuscuslabs/tiktok-shop-1688-arbitrage-finder`) Actor

Match TikTok Shop products against 1688 supplier candidates and rank resale margin opportunities for dropshipping and product research.

- **URL**: https://apify.com/cuscuslabs/tiktok-shop-1688-arbitrage-finder.md
- **Developed by:** [kalu affia](https://apify.com/cuscuslabs) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.50 / 1,000 arbitrage opportunities

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TikTok Shop to 1688 Arbitrage Finder

Find TikTok Shop products with supplier-margin potential on 1688. This Actor turns TikTok Shop product signals and 1688 supplier candidates into a ranked opportunity dataset for dropshipping, product research, and sourcing analysis.

It is designed to sit above product scrapers: feed it TikTok Shop data, feed it 1688 supplier data, and it calculates which matches look worth testing.

### What It Does

- Normalizes TikTok Shop product records from manual input, Apify datasets, or a source Actor
- Normalizes 1688 supplier/product records from manual input, Apify datasets, or a source Actor
- Matches products by title similarity
- Converts CNY supplier prices to USD
- Estimates landed cost, marketplace fees, ad/creator costs, gross profit, and margin
- Scores opportunities using margin, product demand, supplier strength, and match quality
- Exports ranked results to JSON, CSV, Excel, XML, or the Apify API

### Best Use Cases

- Find products selling well on TikTok Shop that appear cheaper on 1688
- Build a product research shortlist for dropshipping tests
- Compare supplier candidates before importing products to Shopify
- Monitor known TikTok products against changing supplier prices
- Enrich existing TikTok Shop and 1688 datasets with margin intelligence

### Input Options

You can use this Actor in three ways.

#### 1. Paste Products Directly

Paste TikTok Shop records into `tiktokProducts` and 1688 records into `supplierProducts`.

This is best for testing, CSV-to-JSON workflows, and small research batches.

#### 2. Use Existing Apify Datasets

Add dataset IDs to:

- `tiktokDatasetIds`
- `supplierDatasetIds`

The Actor reads those datasets and automatically maps common field names such as `title`, `price`, `soldCount`, `rating`, `url`, `imageUrl`, `moq`, and `supplierRating`.

#### 3. Run Source Actors

Enable `runSourceActors` and provide:

- `tiktokSourceActorId`
- `tiktokSourceActorInput`
- `supplierSourceActorId`
- `supplierSourceActorInput`

The supplier Actor can be called once per TikTok product. Use `{{keyword}}` in the supplier input template to search 1688 using the product keyword.

Example supplier input template:

```json
{
  "query": "{{keyword}}",
  "maxItems": 20
}
```

### Output Fields

Each saved dataset item contains:

- `opportunityScore`
- `marginPercent`
- `estimatedProfitUsd`
- `estimatedLandedCostUsd`
- `tiktokTitle`
- `tiktokPriceUsd`
- `tiktokSoldCount`
- `tiktokRating`
- `tiktokReviewCount`
- `supplierTitle`
- `supplierUnitCostUsd`
- `supplierMoq`
- `supplierRating`
- `matchScore`
- `demandScore`
- `supplierScore`
- `riskFlags`
- source URLs and image URLs

### Scoring Model

The opportunity score is based on:

- 35% title match quality
- 35% estimated margin
- 20% TikTok demand signals
- 10% supplier strength

The Actor also flags risks such as low match quality, thin margin, high MOQ, missing sales signals, or missing supplier rating.

### Example Output

```json
{
  "opportunityScore": 74.24,
  "marginPercent": 43.88,
  "estimatedProfitUsd": 13.16,
  "tiktokTitle": "Portable Blender 500ml USB Rechargeable Mini Juicer",
  "tiktokPriceUsd": 29.99,
  "tiktokSoldCount": 18500,
  "supplierTitle": "USB Portable Juicer Blender 500ml Electric Fruit Mixer Factory Wholesale",
  "supplierUnitCostUsd": 4.17,
  "supplierMoq": 2,
  "matchScore": 44.44,
  "riskFlags": []
}
```

### Pricing Suggestion

Recommended pay-per-result pricing for Store launch:

- $6-$10 per 1,000 matched opportunities
- Free trial or low free-run cap for the first 10-20 opportunities

### Notes

This Actor estimates opportunities. It does not guarantee product-market fit, ad performance, supplier reliability, legal compliance, delivery speed, or final profit. Always verify samples, shipping, platform policies, and product restrictions before selling.

# Actor input Schema

## `tiktokProducts` (type: `array`):

Paste TikTok Shop product records. Each item can include title/name, price, sold count, rating, reviews, URL, and image URL.

## `supplierProducts` (type: `array`):

Optional supplier records to match against TikTok products. Each item can include title/name, price, MOQ, supplier rating, sales, URL, and image URL.

## `tiktokDatasetIds` (type: `array`):

Optional Apify dataset IDs containing TikTok Shop product records.

## `supplierDatasetIds` (type: `array`):

Optional Apify dataset IDs containing 1688 supplier/product records.

## `runSourceActors` (type: `boolean`):

When enabled, this Actor can call source Actors and use their datasets. Useful if you already rely on a TikTok Shop or 1688 scraper.

## `tiktokSourceActorId` (type: `string`):

Optional Actor ID such as username/actor-name. Its output will be treated as TikTok Shop product data.

## `tiktokSourceActorInput` (type: `object`):

JSON input passed to the TikTok source Actor when Run source Actors is enabled.

## `supplierSourceActorId` (type: `string`):

Optional Actor ID such as username/actor-name. It will be called once per selected TikTok product unless supplier records are already provided.

## `supplierSourceActorInput` (type: `object`):

JSON template passed to the 1688 source Actor. Use {{keyword}} inside string values to inject each product search keyword.

## `maxTikTokProducts` (type: `integer`):

Limit the number of TikTok products analyzed.

## `maxSupplierCandidatesPerProduct` (type: `integer`):

Maximum 1688 candidates considered for each TikTok product.

## `destinationCountry` (type: `string`):

Used for reporting and future shipping rules.

## `estimatedShippingPerUnit` (type: `number`):

Fallback shipping cost in USD per unit.

## `marketplaceFeePercent` (type: `number`):

Estimated TikTok Shop or marketplace fee percentage.

## `adCostPercent` (type: `number`):

Estimated ad/creator cost as a percent of TikTok selling price.

## `minMarginPercent` (type: `number`):

Only save opportunities at or above this estimated net margin percentage.

## `minMatchScore` (type: `integer`):

Only save opportunities at or above this title similarity score.

## `currencyRateCnyToUsd` (type: `number`):

Conversion rate used when a supplier price appears to be in CNY.

## `debug` (type: `boolean`):

Save skipped candidates and normalization notes to the key-value store.

## Actor input object example

```json
{
  "tiktokProducts": [
    {
      "title": "Portable Blender 500ml USB Rechargeable",
      "price": 29.99,
      "soldCount": 18500,
      "rating": 4.6,
      "reviewCount": 2140,
      "url": "https://shop.tiktok.com/example-product",
      "imageUrl": "https://example.com/blender.jpg"
    }
  ],
  "supplierProducts": [
    {
      "title": "USB Portable Juicer Blender 500ml Factory Wholesale",
      "price": 4.2,
      "moq": 2,
      "supplierRating": 4.8,
      "salesCount": 12000,
      "url": "https://detail.1688.com/example-supplier",
      "imageUrl": "https://example.com/supplier-blender.jpg"
    }
  ],
  "tiktokDatasetIds": [],
  "supplierDatasetIds": [],
  "runSourceActors": false,
  "tiktokSourceActorInput": {},
  "supplierSourceActorInput": {
    "query": "{{keyword}}",
    "maxItems": 20
  },
  "maxTikTokProducts": 100,
  "maxSupplierCandidatesPerProduct": 20,
  "destinationCountry": "US",
  "estimatedShippingPerUnit": 4,
  "marketplaceFeePercent": 8,
  "adCostPercent": 20,
  "minMarginPercent": 25,
  "minMatchScore": 25,
  "currencyRateCnyToUsd": 0.14,
  "debug": false
}
```

# Actor output Schema

## `opportunities` (type: `string`):

Dataset items containing matched TikTok Shop products, 1688 supplier candidates, estimated margin, profit, scores, and risk flags.

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

Summary JSON with analyzed product count, supplier count, filters, destination country, and top opportunity.

# 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 = {
    "tiktokProducts": [
        {
            "title": "Portable Blender 500ml USB Rechargeable",
            "price": 29.99,
            "soldCount": 18500,
            "rating": 4.6,
            "reviewCount": 2140,
            "url": "https://shop.tiktok.com/example-product",
            "imageUrl": "https://example.com/blender.jpg"
        }
    ],
    "supplierProducts": [
        {
            "title": "USB Portable Juicer Blender 500ml Factory Wholesale",
            "price": 4.2,
            "moq": 2,
            "supplierRating": 4.8,
            "salesCount": 12000,
            "url": "https://detail.1688.com/example-supplier",
            "imageUrl": "https://example.com/supplier-blender.jpg"
        }
    ],
    "tiktokDatasetIds": [],
    "supplierDatasetIds": [],
    "tiktokSourceActorInput": {},
    "supplierSourceActorInput": {
        "query": "{{keyword}}",
        "maxItems": 20
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cuscuslabs/tiktok-shop-1688-arbitrage-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 = {
    "tiktokProducts": [{
            "title": "Portable Blender 500ml USB Rechargeable",
            "price": 29.99,
            "soldCount": 18500,
            "rating": 4.6,
            "reviewCount": 2140,
            "url": "https://shop.tiktok.com/example-product",
            "imageUrl": "https://example.com/blender.jpg",
        }],
    "supplierProducts": [{
            "title": "USB Portable Juicer Blender 500ml Factory Wholesale",
            "price": 4.2,
            "moq": 2,
            "supplierRating": 4.8,
            "salesCount": 12000,
            "url": "https://detail.1688.com/example-supplier",
            "imageUrl": "https://example.com/supplier-blender.jpg",
        }],
    "tiktokDatasetIds": [],
    "supplierDatasetIds": [],
    "tiktokSourceActorInput": {},
    "supplierSourceActorInput": {
        "query": "{{keyword}}",
        "maxItems": 20,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("cuscuslabs/tiktok-shop-1688-arbitrage-finder").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 '{
  "tiktokProducts": [
    {
      "title": "Portable Blender 500ml USB Rechargeable",
      "price": 29.99,
      "soldCount": 18500,
      "rating": 4.6,
      "reviewCount": 2140,
      "url": "https://shop.tiktok.com/example-product",
      "imageUrl": "https://example.com/blender.jpg"
    }
  ],
  "supplierProducts": [
    {
      "title": "USB Portable Juicer Blender 500ml Factory Wholesale",
      "price": 4.2,
      "moq": 2,
      "supplierRating": 4.8,
      "salesCount": 12000,
      "url": "https://detail.1688.com/example-supplier",
      "imageUrl": "https://example.com/supplier-blender.jpg"
    }
  ],
  "tiktokDatasetIds": [],
  "supplierDatasetIds": [],
  "tiktokSourceActorInput": {},
  "supplierSourceActorInput": {
    "query": "{{keyword}}",
    "maxItems": 20
  }
}' |
apify call cuscuslabs/tiktok-shop-1688-arbitrage-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cuscuslabs/tiktok-shop-1688-arbitrage-finder"
        }
    }
}

```

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/yqkGZTmhC37aBE7hy/builds/e8qtd4P8fRv5gl0sN/openapi.json
