# Temu Scraper: Products, Prices, Variants & Reviews (`cliqtomedia/temu-scraper`) Actor

Export Temu products from product links or the home feed to JSON or CSV. Get prices, sales, ratings, variants and public reviews. No keyword search. US market.

- **URL**: https://apify.com/cliqtomedia/temu-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 0 monthly users, 81.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.89 / 1,000 product saveds

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

Paste Temu product links or the Temu home page link, and get Temu products as clean rows with price, currency, sales, images and a product link. Product links also add rating, review count, variants, specifications and public reviews.

Use it for Temu price checks, dropshipping research and tracking the products you already know, in the US market. This version has no keyword search and no category pages. The prefilled home feed with 10 products finished in about 3 to 7 seconds in our tests.

![Temu Scraper: product links or the Temu home page link go in, Temu products come out as one row each with price, rating, reviews and sold count, plus variants and public reviews on product pages](https://api.apify.com/v2/key-value-stores/jS3FFuNepsoenmBst/records/temu-hero-20261105.png)

### Table of contents

- [What it does](#what-it-does)
- [How it works](#how-it-works)
- [Quick start](#quick-start)
- [Use cases](#use-cases)
- [Input](#input)
- [Output](#output)
- [Pricing](#pricing)
- [Limits](#limits)
- [API, export and integrations](#api-export-and-integrations)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

This Actor reads public Temu pages for the US market and saves one row for each product. It reads two things: the Temu home feed and single product pages. Prices are in USD. You do not need a Temu account.

A home feed row has the title, price, image, link and usually sales and the original price. Temu does not send ratings or review counts in the feed, so those fields are `null` there. A product page adds the rating, review count, variants, specifications, the description and the public reviews shown on that page.

#### Good fit

- Read variants, ratings and public review text for a list of product links.
- Check the prices of products you already know, on a schedule.
- See what Temu shows on its US home feed right now, with price and sales.

#### Not a fit

- Finding products by keyword. This version has no search.
- Exporting a Temu category. This version does not read category pages.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### How it works

1. You give product links, product IDs or the Temu home page link.
2. The Actor reads those public pages, applies your filters and removes duplicate products.
3. It saves one row per product in the Dataset. A short report of the run goes to the Key-value store.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Quick start

[![Input form with the Temu links field in box 1, the Maximum products field in box 2 and the start button in box 3](https://api.apify.com/v2/key-value-stores/jS3FFuNepsoenmBst/records/quick-start-form-20261105b.png)](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)

1. Open the **Input** tab. Keep the home page link in **Temu links**, or replace it with your product links (box 1 in the picture).
2. Keep **Maximum products** at 10 for the first run (box 2).
3. Click **Start** (box 3). The picture shows the owner view, where this button reads **Save & start**.
4. Open the **Output** tab and check the **Products** table: title and price first (box 4).

   [![Products table with image, title, price and currency in box 4](https://api.apify.com/v2/key-value-stores/jS3FFuNepsoenmBst/records/output-table-20261105.png)](https://api.apify.com/v2/key-value-stores/jS3FFuNepsoenmBst/records/output-table-20261105.png)

Expected result: 10 rows, each with a title, a USD price, an image and a Temu link. On feed rows `rating` and `reviewCount` are `null`. Use a product link or `dataLevel: full` when you need them.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Use cases

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Variant and review check | `productUrls` | Full product row | `skus`, `reviews`, `specifications`, `minPrice`, `maxPrice` | JSON or API |
| Price tracking for known products | `productUrls`, `mode: monitor`, `stateName` | Changed product row | `changeType`, `changedFields`, `price` | Schedule and webhook |
| Home feed price and sales export | `startUrls` with the home page, `maxItems` | Product row | `title`, `price`, `discountPercent`, `sales`, `url` | CSV or Google Sheets |
| Home feed with ratings | `startUrls` with the home page, `dataLevel: full` | Full product row | `rating`, `reviewCount`, `skus`, `sales` | Excel or API |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Input

#### Input fields

| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `startUrls` | Temu links | array of strings | one of the two | prefill `["https://www.temu.com/"]` | up to 1000 product or home links | The home link reads the feed, product links read those products | `["https://www.temu.com/"]` | Keep the home link for a first try |
| `productUrls` | Product URLs or IDs | array of strings | one of the two | none | up to 1000 Temu links or numeric IDs | Reads full product pages | `["606102494273968"]` | Remove the home link if you want only these products |
| `country` | Country | string | no | `US` | `US` | Sets the market | `US` | Keep it. Other markets are not supported |
| `maxItems` | Maximum products | integer | no | `10` | 1–100000 | Stops after this many saved rows across all inputs | `200` | Raise it after the first run |
| `mode` | Mode | string | no | `auto` | `auto`, `products`, `home`, `monitor` | Chooses which inputs run | `monitor` | Keep `auto` unless you want one input type |
| `dataLevel` | Data level | string | no | `auto` | `auto`, `listing`, `full` | `auto` and `listing` save rows from the feed. `full` also opens each product page | `full` | Use `full` only when you need ratings, variants or reviews |
| `minPrice` | Minimum price | number | no | none | 0 or more | Keeps products at or above this price | `5` | Use for price research |
| `maxPrice` | Maximum price | number | no | none | 0 or more | Keeps products at or below this price | `20` | Use for price research |
| `minRating` | Minimum rating | number | no | none | 0–5 | Skips lower ratings and products with no rating | `4.5` | Feed rows have no rating. Use it with product pages |
| `minReviews` | Minimum review count | number | no | none | 0 or more | Skips products with fewer reviews | `100` | Feed rows have no review count. Use it with product pages |
| `minSold` | Minimum sold count | number | no | none | 0 or more | Skips products with fewer sales. `1K+` counts as 1000 | `1000` | Works on the feed |
| `minDiscount` | Minimum discount (%) | number | no | none | 0–100 | Skips smaller or missing discounts | `30` | Works on the feed when Temu shows a discount |
| `includeKeywords` | Title must contain | array of strings | no | none | up to 20 | Keeps titles with every entered word. It filters rows and does not search Temu | `["waterproof"]` | Use for a narrow list |
| `excludeKeywords` | Title must not contain | array of strings | no | none | up to 20 | Skips titles with any entered word | `["connector"]` | Removes accessories |
| `excludeAds` | Exclude ads | boolean | no | `false` | true or false | Skips products marked as ads | `true` | Turn on for clean lists |
| `excludeAdultProducts` | Exclude adult products | boolean | no | `false` | true or false | Skips products marked as adult | `true` | Turn on for shared reports |
| `onlyNew` | Only new products | boolean | no | `false` | true or false | Saves products not yet in this history | `true` | Use for scheduled runs |
| `resetState` | Reset history | boolean | no | `false` | true or false | Starts this history again | `true` | Use once, then turn off |
| `stateName` | History name | string | no | `default` | lowercase letters, numbers, hyphens, up to 40 characters | Keeps separate history per project | `my-mugs-us` | Use one name for each project |
| `deliveryConnector` | Send results to | string | no | none | your MCP connector | Posts a short summary after the run | Slack connector | Optional |
| `deliveryTarget` | Notion page or channel | string | no | none | Notion page link or Slack channel ID | Chooses where the summary goes | `C0123456789` | Optional |

An empty input stops the run with an error and no catalog or product fee, because the Actor does not guess what you want. The same applies to an invalid value, such as a link from another site, a keyword, or a Temu search or category link. Duplicate products within a run are saved once.

#### Interacting settings

| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
| --- | --- | --- | --- | --- | --- |
| Both input types | `mode: auto` | home link and `productUrls` | Both run until `maxItems` | The prefilled home link stays next to your links | Remove the home link if you want only your products |
| One input type | `mode: products` | home link | Only product links run | The home link stays unused | No fee for skipped inputs |
| Product links | `productUrls` | `dataLevel: listing` | Product links always use full pages | One product ID | `product-details` fee applies |
| Full data | `dataLevel: full` | filters or `onlyNew` | A checked full page is charged even when the row is skipped | `minPrice` above all prices | The page stays in a `PRODUCT_ID` file |
| Filters on the feed | filters | `maxItems` | The feed reads about `maxItems` products and at least 60, then stops | `minSold: 1000`, 10 products | You can get fewer rows than `maxItems` |
| History | `onlyNew` or `mode: monitor` | `stateName` | The same name continues the history | `my-mugs-us` | Unchanged feed rows cost no `product` fee. Product pages are still charged |
| Fresh start | `resetState` | `stateName` | This history starts empty | Reset once | All rows count as new |

#### Input examples

##### First run: home feed

```json
{
  "startUrls": ["https://www.temu.com/"],
  "maxItems": 10
}
```

Expected behavior: the Actor reads the first feed page and saves 10 products.
Expected output: product rows with `title`, `price`, `currency`, `url`, `images`, usually `sales`.
Limit or cost note: about $0.049 on the Free plan.

##### Variants and reviews

```json
{
  "productUrls": ["606102494273968"],
  "maxItems": 1
}
```

Expected behavior: the Actor opens the product page.
Expected output: one row with `skus`, `specifications`, `reviews`, `minPrice`, `maxPrice`.
Limit or cost note: one `product-details` fee. If Temu blocks the page, you pay no fee for it.

##### Track prices of known products

```json
{
  "productUrls": ["606102494273968", "601102610144502"],
  "mode": "monitor",
  "maxItems": 2,
  "stateName": "my-products-us"
}
```

Expected behavior: the first run saves the products. The next runs save only new or changed ones.
Expected output: rows with `changeType` and `changedFields`.
Limit or cost note: each checked product page pays `product-details`, even with no changes.

##### Home feed with ratings and variants

```json
{
  "startUrls": ["https://www.temu.com/"],
  "dataLevel": "full",
  "maxItems": 10
}
```

Expected behavior: the Actor reads the feed and opens the page of each product.
Expected output: rows with `rating`, `reviewCount`, `skus`, `reviews`. A row stays `partial` if Temu blocks its page.
Limit or cost note: one catalog fee plus one `product-details` fee per opened page, about $0.19 for 10 on the Free plan.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Output

#### Output fields

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `goodsId` | Temu product ID | string | no | `606102494273968` | From the page |
| `title` | Product title | string | conditional | `1pc Vacuum Insulated Coffee Travel Mug` | From the page |
| `price` | Current price as a number | number | conditional | `6.61` | In `currency` units |
| `priceText` | Price as Temu shows it | string | conditional | `$6.61` | Raw text |
| `currency` | Currency | string | conditional | `USD` | From the page |
| `originalPrice` | Price before discount | number | yes | `35.99` | Only when Temu shows it. It can differ between runs |
| `discountPercent` | Discount in percent | number | yes | `79` | Only when Temu shows it. It can differ between runs |
| `minPrice` / `maxPrice` | Lowest and highest price | number | yes | `6.61` / `12.36` | Differ when variants differ |
| `sales` | Sold count as a number | number | yes | `28000` | Rounded badges give a lower bound |
| `salesText` | Sales badge | string | yes | `28K+ sold` | Raw text |
| `salesIsLowerBound` | The sales number is rounded down | boolean | yes | `true` | True for badges such as `28K+` |
| `rating` | Average rating out of 5 | number | yes | `4.8` | Product pages only. `null` on feed rows |
| `reviewCount` | Number of reviews | number | yes | `645` | Product pages only. `null` on feed rows |
| `url` | Product link | string | conditional | `https://www.temu.com/-g-606102494273968.html` | Public page |
| `images` | Image links | array | yes | `["https://img.kwcdn.com/..."]` | Full pages may have more |
| `videoUrl` | Product video link | string | yes | `null` | When shown |
| `skuId` | Variant ID picked in the listing | string | yes | `109023852495536` | When shown |
| `skus` | Variants with ID, price, specifications and stock | array | yes | 10 items on the example | Full pages |
| `reviews` | Public reviews on the page: text, rating, date, media | array | yes | 4 items on the example | Full pages, no profile data |
| `specifications` | Product specifications | array | yes | material, size | Full pages |
| `description` | Product description | string | yes | text | Full pages |
| `sellerId` / `sellerName` / `sellerUrl` | Public shop ID, name and link | string | yes | `634418231860874` | When shown |
| `categoryId` / `categoryPath` | Category ID and names | string | yes | `2407` | Full pages, when shown |
| `inStock` | Stock status | boolean | yes | `true` | `null` means Temu did not report it |
| `shippingText` / `returnPolicy` | Shipping and return text | string | yes | text | Full pages, when shown |
| `isAd` / `isAdultProduct` | Temu marks it as an ad or adult product | boolean | yes | `false` | When shown |
| `tags` | Public labels | array | yes | `[]` | Listing badges |
| `rank` | Position in the feed before your filters | integer | yes | `1` | Feed rows |
| `detailLevel` | Row source | string | conditional | `listing`, `full` | Tells you what to expect |
| `status` | Row state | string | conditional | `complete`, `partial` | `partial` means the product page failed and the feed row stayed |
| `changeType` / `changedFields` | What changed in monitor mode | string / array | yes | `changed`, `["price"]` | Monitor mode only |
| `country`, `source`, `rowType` | Market, source and row type | string | no | `US`, `temu`, `product` | Fixed values |
| `sourceUrl`, `fetchedAt` | Page read and time in UTC | string | conditional | `2026-11-05T11:45:35.401Z` | For your records |

#### Output entities and surfaces

| Situation | Dataset/API/KVS/live view | Result shape | User action |
| --- | --- | --- | --- |
| Normal item | Dataset, views **Products**, **Product variants**, **Price and first variant**, **All fields** | One row per product | Open the table or export it |
| Domain-empty result | Empty Dataset, `RUN_SUMMARY` with `status` `not_found`, `no_matches` or `no_changes` | No rows, run SUCCEEDED | Check the link, the filters or the history |
| Partial result | Dataset rows, `status` `partial` in `RUN_SUMMARY`, `stopReason` `CHARGE_LIMIT`, `DEADLINE` or `ITEMS_FAILED` | Saved rows stay, run SUCCEEDED | Read `errors` and `unprocessedInputs`, then run the rest again |
| Technical failure or retry | `RUN_SUMMARY` with `stopReason` `SOURCE_ERROR` or `INVALID_INPUT`, run FAILED | Rows saved before the stop stay | Try again later or fix the input |

Full product pages are also kept as `PRODUCT_<ID>` files in the Key-value store.

#### Output example

```json
{
  "goodsId": "606102494273968",
  "title": "1pc Vacuum Insulated Coffee Travel Mug, Leak-Proof Double Wall Stainless Steel Reusable Vacuum Cup",
  "price": 6.61,
  "currency": "USD",
  "originalPrice": null,
  "minPrice": 6.61,
  "maxPrice": 12.36,
  "sales": 28000,
  "salesText": "28K+ sold",
  "salesIsLowerBound": true,
  "rating": 4.8,
  "reviewCount": 645,
  "url": "https://www.temu.com/-g-606102494273968.html",
  "detailLevel": "full",
  "status": "complete"
}
```

This example is trimmed and contains one product from the "Variants and reviews" input. `null` means Temu did not show the value on that page. It does not mean zero. We do not promise that every product has every field.

#### Send results to Slack or Notion

Pick your connector in the optional `deliveryConnector` field. After the run saves its data, the Actor posts a short summary (up to 25 rows and a link to the full dataset) there. Put a Notion page link or a Slack channel ID in `deliveryTarget`: in Notion every run is added on top of that one page, so your workspace does not fill up with new pages. A delivery error never fails the run and costs nothing extra. Connect a service once in Apify Console → MCP connectors.

#### Use case → fields

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Variant check | `productUrls` | Full product row | `skus`, `minPrice`, `maxPrice` | JSON |
| Review check | `productUrls` | Full product row | `reviews`, `rating`, `reviewCount` | JSON |
| Change tracking | `productUrls`, `mode: monitor` | Changed product row | `changeType`, `changedFields` | Webhook |
| Feed export | home link | Product row | `price`, `sales`, `discountPercent` | CSV |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Pricing

#### Pricing unit

You pay per event. Platform usage is included in these prices.

| Event | When it is charged | Free | Bronze | Silver | Gold and above |
| --- | --- | ---: | ---: | ---: | ---: |
| Actor start | Once per run, per GB of memory | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
| Catalog check | Up to three home feed pages. Includes three basic products | $0.03 | $0.03 | $0.03 | $0.03 |
| Product | One saved feed row above the included three | $0.0027 | $0.00243 | $0.00216 | $0.00189 |
| Product details | One full product page | $0.0162 | $0.01458 | $0.01296 | $0.01134 |

- The start fee grows with run memory, per GB. The default is 256 MB.
- A feed page holds about 20 products.
- A filter with no matches pays the catalog fee, the same as a feed run where no row is new. They pay for reading the feed, not for rows.
- A checked full product page is charged even if a filter or the history skips the row. You can still read it in its `PRODUCT_<ID>` file.
- A page that Temu blocks costs no catalog, product or details fee.
- If a run stops early, you pay only for the work done before the stop.
- Set **Maximum cost per run** (`maxTotalChargeUsd` in the API) to control the cost. At the limit, the run stops and keeps the saved rows. A run with no limit can spend up to your account balance, so always set one for large API runs.

#### Cost examples

Prices are for the Free plan.

| Scenario | Input scope | Expected item/event count | Base charge | Optional charge | Stop/cap behavior |
| --- | --- | ---: | ---: | ---: | --- |
| First run | Home feed, 10 products | 1 catalog fee, 7 products | $0.04895 | none | Under $1 |
| Home feed | 60 products | 1 catalog fee, 57 products | $0.18395 | none | Under $1 |
| Whole feed | Asked for 300, got 238 | 4 catalog fees, 226 products | $0.73025 | none | Under $1 |
| Feed with full pages | 10 products, `dataLevel: full` | 1 catalog fee, 10 details | $0.19205 | none | Under $1 |
| One product page | 1 product link | 1 details | $0.01625 | none | Under $1 |
| 20 product pages | 20 product links | 20 details | $0.32405 | none | Under $1 |
| No matches | Home feed, a filter skips all | 1 catalog fee | $0.03005 | none | No product fee |
| Monitor, 5 products, no changes | 5 product links | 5 details | $0.08105 | none | Pages are charged, rows are not saved |

Paid plans pay less for product rows, as the table above shows.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Limits

- **No keyword search and no category pages.** Temu refuses these pages to anonymous visitors for hours at a time, and we did not find a stable way to read them without an account. A keyword, a search link or a category link stops the run with a clear error and no catalog or product fee.
- US market and USD only. Other Temu markets are not supported.
- The length of the home feed changes from run to run. It ended at 238 products when we asked for 300, and at 40 products when we asked for 60. Both runs finished as `complete`. `maxItems` of 100000 is an input limit, not a promise that Temu returns that many.
- The feed is not the whole catalog. It changes between runs: in one pair of runs a few minutes apart half of the 60 products were different, and in another pair only 1 product was the same. Temu picks what it shows, and you cannot choose a topic.
- Feed rows have no rating and no review count. Open product pages with `dataLevel: full` or use product links to get them.
- The price in a feed row can differ from the price on the product page. In one test a product was $12.24 in the feed and $15.97 on its page. Use product links when the exact page price matters.
- `originalPrice` and `discountPercent` can change or disappear between two runs a few minutes apart. Monitor mode does not count them as a change. It compares title, price, currency, sales, rating, review count and stock.
- Temu can also block single product pages. Each page gets up to four attempts. In our last three test batches 56 of 60, 38 of 43 and 41 of 43 product pages were saved, and the others were reported in `errors`. A blocked page costs no fee. Run those links again. After eight failed reads in a row, which is two product pages in a row with all attempts refused, the run stops to avoid wasting traffic and ends as FAILED with `SOURCE_ERROR`. Saved rows stay in the Dataset.
- If Temu refuses the feed in the middle of a large run, the run ends as `partial`. Saved rows stay in the Dataset, and `unprocessedInputs` shows what is missing.
- After three failed reads of a feed page the run stops with `SOURCE_ERROR`. Saved rows stay in the Dataset.
- The default run timeout is 300 seconds. Raise it for large runs: 20 product pages took 137 seconds, so plan for about 35 pages per run at the default.
- The history keeps up to 10000 products for each `stateName`.
- Monitor and `onlyNew` work best with product links. On the home feed a "new" row means new in your history, not new on Temu, because the feed changes on its own.
- The Actor reads public data only. It does not log in, solve CAPTCHAs or collect reviewer profiles or contact details.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### API, export and integrations

- **API:** start a run with the input JSON through the Apify API, then read rows from the run's Dataset. Use `goodsId` as a stable key.
- **Export:** download the Dataset as JSON, CSV, Excel, XML or HTML from the **Output** tab or the API.
- **Scheduling:** create a task with `mode: monitor` and product links and a fixed `stateName`, then add a schedule in Apify Console. Read `changeType` and `changedFields` in the new rows.
- **Webhooks / no-code:** use a webhook on the run finish event. Make, Zapier and n8n can read the Dataset through the Apify integrations.
- **SDK / MCP / agent:** call the Actor by `cliqtomedia/temu-scraper` from the Apify SDK or the MCP server below.

#### Use with AI agents (MCP)

MCP server URL with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/temu-scraper`.

Smallest useful input:

```json
{
  "productUrls": ["606102494273968"],
  "maxItems": 1
}
```

Key output fields:

- `title`: product title.
- `price` and `currency`: current price as a number and its currency.
- `rating`, `reviewCount`, `skus`, `reviews`: filled on product pages.
- `url`: public Temu product link.
- `goodsId`: stable product ID.
- `detailLevel`: `listing` or `full`, which tells if `skus` and `reviews` can be filled.

This input cost $0.01625 on the Free plan. An empty input is an error, and this Actor cannot search by keyword. Set `maxTotalChargeUsd` on each API run. The default timeout is 300 seconds. The US market is the only market.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Troubleshooting

#### The run failed with INVALID_INPUT

Symptom: the run status is FAILED and `stopReason` in `RUN_SUMMARY` is `INVALID_INPUT`.
Likely reason: the input is empty, or it has a keyword, a Temu search link, a category link or a link from another site.
Check: read the error text in `RUN_SUMMARY`.
Action: use product links, product IDs or the link `https://www.temu.com/`.

#### The run failed with SOURCE_ERROR

Symptom: the run status is FAILED and `stopReason` in `RUN_SUMMARY` is `SOURCE_ERROR`.
Likely reason: Temu pages could not be read several times in a row: three feed reads of one page, or eight product page reads.
Check: open `errors` and `unprocessedInputs` in `RUN_SUMMARY`. Rows saved before the stop stay in the Dataset.
Action: try again later.

#### The run finished with fewer rows than I asked for

Symptom: `status` in `RUN_SUMMARY` is `partial`, or there are fewer rows than `maxItems`.
Likely reason: the run reached the cost limit (`CHARGE_LIMIT`) or the time limit (`DEADLINE`), a product page failed (`ITEMS_FAILED`), a filter skipped rows, or the feed ended.
Check: read `stopReason`, `detailFailures` and `unprocessedInputs`.
Action: raise **Maximum cost per run** or the timeout, then run the rest again. The feed can end early: 238 products at most in our tests, and 40 in the shortest run.

#### My product links were read, and I also got random products

Symptom: the Dataset has products you did not ask for.
Likely reason: the prefilled home link is still in **Temu links**.
Check: look at `sourceUrl` in those rows.
Action: remove the home link or set `mode` to `products`.

#### Rating and review columns are empty

Symptom: `rating` or `reviewCount` are `null`.
Likely reason: the row came from the home feed. Temu does not send these values there.
Check: look at `detailLevel` in the row.
Action: use `productUrls`, or set `dataLevel` to `full`.

#### The Dataset is empty and the run succeeded

Symptom: 0 rows, and `status` is `not_found`, `no_matches` or `no_changes`.
Likely reason: filters skip everything, or the history has no changes.
Check: read `scanned`, `filtered` and `unchanged` in `RUN_SUMMARY`.
Action: relax the filters, or set `resetState` to `true`.

#### The history warning appears

Symptom: the status message says the history store is unavailable, and `RUN_SUMMARY` has `HISTORY_UNAVAILABLE`.
Likely reason: another Actor owns a store with the same name, or access was refused.
Check: read `warnings` in `RUN_SUMMARY`. The rows are still saved.
Action: use a new `stateName`.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### FAQ

#### Can it search Temu by keyword?

No. Temu refuses search and category pages to anonymous visitors for hours at a time, so this version does not offer them. If you need keyword search, this Actor is not the right tool. With product links it works without search.

#### Do I need a Temu account or cookies?

No. The Actor reads public pages. You do not add any login, cookie or key.

#### Is this the Temu API?

No. Temu did not make this Actor. You get your own API through Apify: start a run, then read the Dataset as JSON.

#### Do I need a browser extension or a tool to install?

No. It runs in Apify Console. You can also start it through the API.

#### Why does a run with no matches cost money?

The fee pays for reading the feed. A filter with no matches pays only the catalog fee and the start fee, with no product fee.

#### How fresh is the data?

Each row shows the read time in `fetchedAt`. Temu changes prices and product lists often, so two runs can differ.

#### Can I get all reviews of a product?

No. The Actor saves the public reviews shown on the product page, in `reviews`. `reviewCount` shows the total that Temu reports.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Related Actors

- [AliExpress Scraper](https://apify.com/cliqtomedia/aliexpress-scraper): compare the same product on AliExpress.
- [Taobao & 1688 Scraper](https://apify.com/cliqtomedia/taobao-1688-scraper): check supplier prices in China.
- [Google Shopping Scraper](https://apify.com/cliqtomedia/google-shopping-scraper): compare prices across stores.
- [Shopify Store Products Export](https://apify.com/cliqtomedia/shopify-products-scraper): export the catalog of a store you want to compare.
- [Trendyol Scraper](https://apify.com/cliqtomedia/trendyol-scraper): read another marketplace with the same kind of rows.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

### Support

For a bug, a question or a feature request, open the **Issues** tab of this Actor on Apify. Include the run ID, the input mode and the error text from `RUN_SUMMARY`. Never send tokens, cookies or billing data.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/JZg8fUfcfQ1sxNEgA/input)**

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/temu-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Keep the Temu home page link to read the home feed. Replace it with product links to read only those products.

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

Read full product pages. Enter Temu product URLs or numeric goods IDs. Remove the home page link above if you want only these products.

## `country` (type: `string`):

Read products from the US market in USD. Other markets are not supported.

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

Stop after saving this many products across all inputs. Temu may return fewer products.

## `mode` (type: `string`):

Auto uses all links you enter. Monitor saves new or changed products in the selected history.

## `dataLevel` (type: `string`):

Auto returns listing data for the home feed and full pages for product links. Full pages add variants, specifications and public reviews, but Temu may block individual pages. A catalog fee covers up to three feed pages and includes three basic products. Full checks are charged even when filters or history skip the product. Checked full pages remain in PRODUCT_ID files.

## `minPrice` (type: `number`):

Keep products with a price at least this amount in the market currency.

## `maxPrice` (type: `number`):

Keep products with a price no higher than this amount in the market currency.

## `minRating` (type: `number`):

Keep products rated at least this value. Products with no rating are skipped.

## `minReviews` (type: `number`):

Keep products with at least this many reviews.

## `minSold` (type: `number`):

Keep products with at least this many reported sales. Rounded counts such as 1K+ are lower bounds.

## `minDiscount` (type: `number`):

Keep products with at least this reported discount. Missing discounts are skipped.

## `includeKeywords` (type: `array`):

Keep products whose titles contain every entered word or phrase.

## `excludeKeywords` (type: `array`):

Skip products whose titles contain any entered word or phrase.

## `excludeAds` (type: `boolean`):

Skip products that Temu marks as ads.

## `excludeAdultProducts` (type: `boolean`):

Skip products that Temu marks as adult products.

## `onlyNew` (type: `boolean`):

Save only products that are not in this history. Use the same state name to continue. Source page reads and full product checks are still charged.

## `resetState` (type: `boolean`):

Start a fresh history for this run.

## `stateName` (type: `string`):

Use a separate name for each project. Use lowercase letters, numbers and hyphens.

## `deliveryConnector` (type: `string`):

Your Slack, Notion or other MCP connector. After the run the Actor posts a short summary there. Connect services once in Apify Console → MCP connectors.

## `deliveryTarget` (type: `string`):

Where to post the summary: a Notion page link (each run is added on top of that page) or a Slack channel ID. Leave empty to let the connector decide.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.temu.com/"
  ],
  "country": "US",
  "maxItems": 10,
  "mode": "auto",
  "dataLevel": "auto",
  "excludeAds": false,
  "excludeAdultProducts": false,
  "onlyNew": false,
  "resetState": false,
  "stateName": "default"
}
```

# Actor output Schema

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

Open the saved product data.

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

Counts, limits, source errors and delivery status.

## `checkedPages` (type: `string`):

List saved files. PRODUCT_ID records contain full product pages that were checked, including products excluded by filters or history.

# 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 = {
    "startUrls": [
        "https://www.temu.com/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/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 = { "startUrls": ["https://www.temu.com/"] }

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/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 '{
  "startUrls": [
    "https://www.temu.com/"
  ]
}' |
apify call cliqtomedia/temu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/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/JZg8fUfcfQ1sxNEgA/builds/OMplc9Kjady1Xq0Sb/openapi.json
