# Temu Product Scraper — Prices, Ratings & Units Sold (`yugenox/temu-scraper`) Actor

Search Temu and get structured product data: current price, crossed-out market price, discount, star rating, units sold, seller ID, variant count, video flag and image URLs. Pick the storefront (US, UK, Canada, Australia) and prices come back in that currency. Any-language search terms. No browser.

- **URL**: https://apify.com/yugenox/temu-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** E-commerce, Automation, Integrations
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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

## Temu Product Scraper — Prices, Ratings & Units Sold

Search **[Temu](https://www.temu.com)** and get clean, structured product data: current price, the
crossed-out "market" price, discount, star rating, units sold, seller ID, variant count and image
URLs. Pick the storefront — **US, UK, Canada or Australia** — and prices come back in that country's
currency.

No browser automation, no API key, no login.

***

### Why this scraper

- **Real discount data.** Both the selling price *and* the crossed-out market price on every row, so
  you can compute the actual discount rather than trusting a badge.
- **Demand signal.** `sales_num` ("36K+ sold") and `rating` tell you what's actually moving — the
  fields that matter for product research, not just what something costs.
- **Seller and variant data.** `mall_id` and `variant_count` come through, which most Temu scrapers
  drop entirely.
- **Multi-storefront.** The same query priced in USD, GBP, CAD or AUD.
- **Any language.** Search terms work in whatever language the storefront supports.

***

### Input

| Field | Type | Required | Default | Description |
|---|---|:--:|---|---|
| `searchQueries` | array of strings | ✅ | | Search terms to run on Temu. |
| `region` | string | | `US` | `US`, `GB`, `CA` or `AU` — sets storefront **and** currency. |
| `maxResults` | integer | | 20 | Unique products per query, 1–200. |
| `proxyConfiguration` | object | | residential | Residential proxies are required by Temu. |

```json
{
  "searchQueries": ["wireless earbuds", "yoga mat", "phone case"],
  "region": "US",
  "maxResults": 50
}
```

***

### Output

One row per product, de-duplicated — `maxResults: 50` means 50 *distinct* products.

| Field | Type | Description |
|---|---|---|
| `goods_id` | number | Temu product ID. Stable — use it as your primary key. |
| `title` | string | Full product name. |
| `price` | number | Current price as a number, e.g. `5.71`. |
| `price_str` | string | Current price as displayed, e.g. `"$5.71"`. |
| `market_price` | number | Crossed-out original price as a number. |
| `market_price_str` | string | Crossed-out price as displayed. |
| `discount_text` | string | Discount badge, e.g. `"-88%"`. |
| `currency` | string | ISO currency for the row. |
| `rating` | number | Star rating out of 5. |
| `review_count_text` | string | Review count as displayed. |
| `sales_num` | string | Units sold, e.g. `"36K+"`. |
| `sales_tip` | string | Sales line as shown, e.g. `"8.4K+ sold"`. |
| `sold_quantity_percent` | number | Stock-sold percentage, when published. |
| `mall_id` | number | Seller / shop identifier. |
| `variant_count` | number | Number of SKU variants (colour, size). |
| `has_video` | boolean | Whether the listing has a video. |
| `tags` | array | Badge labels on the listing. |
| `thumb_url` / `long_thumb_url` | string | Product images. |
| `link_url` | string | Absolute product page URL. |
| `search_query` / `region` / `region_name` | string | Echoed back for grouping. |
| `scraped_at` | string | UTC timestamp. |

```json
{
  "goods_id": 605921451284044,
  "title": "Hi-Res Audio Wireless Earbuds - Long Battery Life, Compact Charging Case",
  "price": 6.79,
  "price_str": "$6.79",
  "market_price": 19.99,
  "market_price_str": "$19.99",
  "discount_text": "-66%",
  "currency": "USD",
  "rating": 4.8,
  "sales_num": "36K+",
  "sales_tip": "36K+ sold",
  "mall_id": 634418228113237,
  "variant_count": 6,
  "has_video": true,
  "thumb_url": "https://img.kwcdn.com/product/fancy/....jpg",
  "link_url": "https://www.temu.com/goods.html?goods_id=605921451284044",
  "search_query": "wireless earbuds",
  "region": "US",
  "scraped_at": "2026-09-18T04:40:00.000Z"
}
```

***

### What people use it for

**Product research and sourcing.** Rank a category by `sales_num` and `rating` to see what's
actually selling before you commit to inventory — the same call an Amazon or Shopify seller makes
every week.

**Price monitoring.** Track `price` and `market_price` for a set of terms on a schedule and you have
a competitor price feed, with the real discount rather than the advertised one.

**Cross-market arbitrage.** Run the same query in `US` and `GB` and compare — the storefronts price
independently.

**Dropshipping catalogues.** Title, images, price, rating and seller in one row, ready to map into a
product feed.

***

### FAQ

**Is it legal to scrape Temu?**
This Actor only collects publicly available data: product listings that anyone can see on Temu without an account. Collecting publicly available data is generally legal, but you're responsible for how you use it. You must follow privacy laws such as GDPR, PIPEDA and CCPA, as well as Temu's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?**
No. Everything comes from pages Temu shows to any visitor without logging in. It never uses a login, never touches private or restricted accounts, and never reaches password-protected areas.

### Notes

- **Pricing is per storefront.** Temu derives currency from the region, so there's no separate
  currency input — choose `region` and you get that market's prices.
- **Results are de-duplicated per query**, so counts are distinct products, not pages.
- **Residential proxies are required.** Temu refuses datacenter IPs; the default proxy setting
  handles this.
- If Temu is rate-limiting or the upstream session needs refreshing, the run finishes
  **successfully with 0 items and an explanatory status message** — you are never charged for an
  empty run. Retry shortly, or open an issue on the Issues tab.

***

*Not affiliated with or endorsed by Temu. Only publicly visible product information is collected.*

# Actor input Schema

## `searchQueries` (type: `array`):

Search terms to run on Temu. Any language works.

## `region` (type: `string`):

Which Temu storefront to search. Prices come back in that country's currency.

## `maxResults` (type: `integer`):

How many products to collect per search term. Temu renders about 40 per search and does not paginate — add more search terms for wider coverage.

## `concurrency` (type: `integer`):

How many search terms to fetch at the same time. Higher is faster; 6 is a good balance.

## Actor input object example

```json
{
  "searchQueries": [
    "wireless earbuds"
  ],
  "region": "US",
  "maxResults": 40,
  "concurrency": 6
}
```

# Actor output Schema

## `products` (type: `string`):

Every scraped product as JSON.

## `productsCsv` (type: `string`):

The same rows as CSV, for a spreadsheet or price tracker.

## `productsTable` (type: `string`):

Narrowed to image, product, price, discount, rating, units sold and link.

# 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 = {
    "searchQueries": [
        "wireless earbuds",
        "yoga mat"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/temu-scraper").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 = { "searchQueries": [
        "wireless earbuds",
        "yoga mat",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("yugenox/temu-scraper").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 '{
  "searchQueries": [
    "wireless earbuds",
    "yoga mat"
  ]
}' |
apify call yugenox/temu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/temu-scraper"
        }
    }
}
```

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/AWQsw7WkU6WpQxSBp/builds/dXVbo8HjNrHEywW2S/openapi.json
