# Temu Scraper - Product Feed, Category & Keyword Filter (`jungle_synthesizer/temu-scraper`) Actor

Scrape Temu listings: titles, prices, discounts, ratings, review and sales counts, images and badges. Browse the recommended feed, any category, or filter a category by keyword. Temu's own search needs a login, so keywords match titles within the category. US storefront, USD.

- **URL**: https://apify.com/jungle_synthesizer/temu-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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

## Temu Scraper - Product Feed, Category & Keyword Filter

Get structured Temu product listings: titles, prices, discounts, ratings, review counts, sales counts, images and badges. Browse Temu's recommended products, any Temu category, or filter a category by keyword. US storefront, prices in USD.

### What It Does

Three ways to collect products, all returned in the same record shape:

- **Recommended feed** - leave everything empty and get the products Temu recommends on its home page.
- **Category** - pick one or more of Temu's 34 top-level categories or any of about 690 sub-categories (Cases, Holsters & Sleeves, Drones & Flying Toys, Women's Heeled Sandals, ...), or paste category URLs such as `https://www.temu.com/kitchen-utensils-supplies-o3-732.html`. Pages through the category until it runs out of new products or reaches `maxItems`.
- **Keyword filter** - give a keyword such as `wireless earbuds`, `yoga mat` or `dog toys`. The actor takes the Temu category that sells it (for example the phone-case category for `phone case`) and keeps the products whose titles match, usually 100 to 250 per keyword. Over 500 keyword phrasings are supported. Any other keyword runs in scan mode (below).

#### About keywords: this is not Temu search

Temu's own search requires a login, so a keyword cannot be searched on Temu without one. The keyword filter is a category-scoped filter instead, and every record it returns says so (`match: "title_filter"`). It covers the keywords the actor knows a category for; any other keyword runs in scan mode. Search result URLs are not accepted for the same reason. Words you add to a supported keyword (for example `red wireless earbuds`) must appear in the product title.

#### Scan mode: keywords the actor does not know

A keyword that is not on the supported list no longer fails. The actor scans every Temu category, page by page, and keeps the products whose titles contain every word of the keyword (`match: "title_filter"`, deduplicated across categories), until `maxItems` is reached or every category is exhausted.

- **Extra charge:** scan mode charges **one extra result event for every 5 pages scanned**, at the same price as a returned record. The run status message and log show the pages scanned and the scan events charged.
- **Your cost cap applies:** when your maximum cost per run is reached, the scan stops and the records found so far are kept.
- **Sparse keywords can return few records:** a rare keyword can scan hundreds or thousands of pages and return only a handful of products, or none, and the scan pages are still charged.
- Supported keywords are not scanned and carry no scan charge.

Product detail pages also require a login, so fields that only exist there (full description, specifications, variants, seller, shipping) are not returned.

### Input

| Field            | Type     | Description |
|------------------|----------|---|
| `searchKeywords` | string\[] | Keywords to filter by (e.g. `"wireless earbuds"`). Supported keywords filter the matching Temu category by title; any other keyword scans every category (one extra result event per 5 pages scanned). Temu's own search needs a login. |
| `categories`     | string\[] | Temu categories to browse: the 34 top-level ones (Electronics, Home & Kitchen, Toys & Games, ...) or any sub-category under them. |
| `categoryUrls`   | URL\[]    | Temu category URLs to browse. Search result URLs are not supported. |
| `maxItems`       | integer  | Maximum products to return across everything requested. Default: 50. |

With no keywords, categories or URLs the actor returns the recommended feed.

#### Example Input

```json
{
  "searchKeywords": ["wireless earbuds", "yoga mat"],
  "maxItems": 200
}
```

### Output Schema

| Field                 | Type     | Description                                                               |
|-----------------------|----------|---------------------------------------------------------------------------|
| `product_title`       | string   | Product title                                                             |
| `product_url`         | string   | Product link on temu.com                                                  |
| `product_id`          | string   | Temu product ID                                                           |
| `price`               | number   | Current price in USD                                                      |
| `original_price`      | number   | List price before the discount, when Temu shows one                       |
| `discount_percentage` | number   | Discount percentage, when Temu shows one                                  |
| `currency`            | string   | Price currency (USD)                                                      |
| `rating`              | number   | Product rating, 0 to 5                                                    |
| `reviews_count`       | number   | Number of reviews                                                         |
| `sales_count`         | string   | Sales indicator (e.g. `"3.4K+ sold"`)                                     |
| `category`            | string   | Category the product was listed under (empty for the recommended feed)    |
| `images`              | string\[] | Product image URLs                                                        |
| `tags`                | string\[] | Badges and labels on the listing (e.g. `"BEST-SELLING ITEM"`)             |
| `is_bestseller`       | boolean  | Whether Temu marks the listing as a best seller                           |
| `search_keyword`      | string   | The keyword filter that matched this product (empty outside keyword mode) |
| `match`               | string   | `"title_filter"` for keyword-filter records (empty otherwise)             |
| `scraped_at`          | string   | ISO 8601 timestamp when the record was delivered                          |

#### Sample Output

```json
{
  "product_title": "Wireless earphones, true wireless earphones, LED power display",
  "product_url": "https://www.temu.com/goods.html?goods_id=606440538370989",
  "product_id": "606440538370989",
  "price": 14.97,
  "original_price": 29.99,
  "discount_percentage": 50,
  "currency": "USD",
  "rating": 4.8,
  "reviews_count": 357,
  "sales_count": "3.4K+ sold",
  "category": "Headphones, Earbuds & Accessories",
  "images": ["https://img.kwcdn.com/product/fancy/0b45d7ed-a6d9-49fc-90cb-e056093a09eb.jpg"],
  "tags": ["BEST-SELLING ITEM", "Lowest price in 60 days"],
  "is_bestseller": true,
  "search_keyword": "wireless earbuds",
  "match": "title_filter",
  "scraped_at": "2026-10-16T10:30:00.000Z"
}
```

### Use Cases

- **Price monitoring** - track Temu prices and discounts over time for a category or keyword.
- **Dropshipping research** - find what sells: sales counts, ratings and review counts side by side.
- **Competitive intelligence** - map a category, compare price points, spot best sellers.
- **Market research** - sample the recommended feed to see what Temu is pushing.

### Pricing

Pay per product record returned. Run with `maxItems: 50` first to check the output, then scale up. Scan mode (a keyword the actor does not know) also charges one extra result event for every 5 pages scanned, at the same price as a returned record, whether or not the pages held a match.

### Limits

- **US storefront only**, prices in USD.
- **Depth:** a category or keyword yields as many distinct products as Temu returns before pages start repeating, typically a few hundred. Run several keywords or categories for more.
- **Keyword coverage:** a curated list of everyday shopping keywords is filtered directly; every other keyword is scanned across all categories, which can take a long time and return few records for a sparse keyword. Tell us which keywords you need added.
- **Point-in-time prices:** Temu runs flash sales; prices are a snapshot.

### Need Custom Data or Integrations?

File an issue on the actor page or reach out directly. We can add keywords and fields, or build a custom scraper for your workflow.

— BowTiedRaccoon

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `searchKeywords` (type: `array`):

Keywords to filter products by (e.g. 'wireless earbuds', 'yoga mat', 'dog toys'). Temu's own search requires a login, so this is NOT a site search: each keyword is matched to the Temu category that sells it and products whose titles match are returned, typically 100-250 per keyword. A keyword the actor does not know scans every Temu category page by page and keeps the products whose titles contain all its words, until Max Items is reached or every category is exhausted. Scan mode charges one extra result event for every 5 pages scanned (the charge is the same price as a returned record), shown in the run status message, and it stops when your maximum cost per run is reached. A sparse keyword can scan many pages and return few records. Leave empty to browse categories or the recommended feed.

## `categories` (type: `array`):

Temu categories to browse: the 34 top-level categories, or any of the ~690 sub-categories listed under them (shown as 'Top category › Sub-category'). Leave empty (with no keywords or category URLs) for the recommended feed.

## `categoryUrls` (type: `array`):

Temu category URLs to browse, e.g. https://www.temu.com/kitchen-utensils-supplies-o3-732.html. Search result URLs are not supported (Temu's search requires a login).

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

Maximum number of products to return across all keywords and categories.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "categories": [],
  "maxItems": 50
}
```

# Actor output Schema

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

No description

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "categories": [],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "categories": [],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "categories": [],
  "maxItems": 50
}' |
apify call jungle_synthesizer/temu-scraper --silent --output-dataset

```

## MCP server setup

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