# Temu Scraper (Products, Categories & Home Feed) (`hypebridge/temu-scraper`) Actor

Scrape Temu products, prices, ratings, review counts, images, video, SKU options, specifications and category taxonomy. Product, category and home-feed URLs. No login or browser required.

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

## Pricing

from $0.004 / product listing item

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 — Products, Categories & Home Feed

Extract public product data from [Temu](https://www.temu.com/) into a clean, structured Apify dataset: prices, ratings, review counts, images, video, SKU options, specifications and category taxonomy.

No login and no browser required, so runs are fast and inexpensive.

### What it scrapes

| Surface | Example start URL | What you get |
|---|---|---|
| **Product detail** | `https://www.temu.com/-g-601099513224343.html` | Full record: price, rating, review count, gallery, video, SKU options, specifications, return policy, breadcrumbs |
| **Category listing** | `https://www.temu.com/category-o3-248.html` | Up to 120 products per category with price, rating, review count, image, sales signal |
| **Home feed** | `https://www.temu.com/` | Temu's recommendation feed, paginates deep (800+ items) |

You can also point at a product or category by ID alone — `https://www.temu.com/-g-<goodsId>.html` or `https://www.temu.com/-o3-<optId>.html`. No need to find the full product URL first.

### What it does **not** scrape

Being direct about this so you don't buy the wrong tool:

- **Keyword search is not supported.** Search results cannot be retrieved reliably enough to sell, so search URLs are **rejected** up front rather than quietly returning products that don't match your query. Browse by **category** instead — that's the supported way to discover products.
- **Store / merchant pages** (`mall.html`) are not supported.
- **Review text is not available.** Temu does not expose review bodies or author names to this Actor, so each review comes back with its rating and date only, flagged `reviewTextRedacted: true`. Ratings, review counts and dates are accurate. If you need the written reviews themselves, this Actor cannot supply them.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | `https://www.temu.com/` | Product, category or homepage URLs. Search URLs are rejected. |
| `maxItems` | integer | `40` | Maximum records to push (1–5000). |
| `getProductDetails` | boolean | `false` | Fetch each listing item's product page for specifications, SKUs and gallery. Costs one extra request per item. |
| `extractReviews` | boolean | `false` | Include the per-product review array (ratings and dates only — see above). |

```json
{
  "startUrls": [
    { "url": "https://www.temu.com/category-o3-248.html" },
    { "url": "https://www.temu.com/-g-601099513224343.html" }
  ],
  "maxItems": 100,
  "getProductDetails": false
}
```

### Output

One row per product. Fields appear only when Temu publishes them for that page type, so listing rows stay compact while enriched rows carry more.

| Field | Type | Example |
|---|---|---|
| `goodsId` | string | `"603014127574739"` |
| `title` | string | `"Wireless Earbuds, Bluetooth 5.4..."` |
| `price` / `priceText` | number / string | `66.71` / `"$66.71"` |
| `marketPrice` / `marketPriceText` | number / string | `79.99` / `"$79.99"` |
| `discountPercentage` / `savingsAmount` | number | `17` / `13.28` |
| `currency` | string | `"USD"` |
| `rating` | number | `4.9` |
| `reviewCount` | integer | `401` |
| `salesTip` / `salesVolume` | string / number | `"4.1K+ sold"` / `4100` |
| `imageUrl` / `galleryImages` | string / array | Temu CDN URLs |
| `hasVideo` / `videoUrl` | boolean / string | product video when present |
| `productUrl` | string | canonical `https://www.temu.com/-g-<goodsId>.html` |
| `categoryId` / `categoryName` / `categoryPath` / `breadcrumbs` | string / array | category taxonomy |
| `specifications` / `skus` / `returnPolicy` | object / array | detail rows only |
| `reviews` | array | ratings + dates (`reviewTextRedacted`) |
| `sourcePageType` / `sourceUrl` / `extractedAt` | string | provenance |

`productUrl` is always the canonical form, so you can feed output rows straight back in as start URLs.

### Proxy

Residential proxy is **required** and is configured automatically — you don't need to set anything up. Each type of page is routed appropriately on your behalf. Supplying your own `proxyConfiguration` overrides this and will usually lower success rates, so leave it unset unless you have a specific reason.

### Known limitations

- **A category can occasionally return no results.** Temu does not always serve a given category on demand. The Actor retries automatically before giving up, but a run can still finish with zero rows for that category. Running it again a few minutes later almost always works.
- **Some words appear as `*` in titles and descriptions** (for example `"with * Display Charging Case"`). Temu masks certain brand and claim terms in its own product text; this is how the data is published, not a parsing error.
- **Category listings return up to ~120 products each.** To cover more, use several category URLs rather than expecting deeper paging within one.
- Every row carries its own `currency`, so check that field rather than assuming one currency across a dataset.

### Notes

The Actor finishes successfully with an empty dataset rather than failing when a page genuinely has no products, so a zero-row run means "nothing available right now", not "broken".

# Actor input Schema

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

Temu product, category or homepage URLs. Keyword search URLs are not supported and will be rejected - browse by category instead. Store/merchant pages are not supported.

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

Maximum number of product records to collect across the whole run.

## `getProductDetails` (type: `boolean`):

Open each product's own page to add SKU options, specifications, the full image gallery, product video and return policy. On by default. Turn it off for a faster, cheaper run that returns listing fields only (title, price, discount, rating, review count, image).

## `extractReviews` (type: `boolean`):

Include each product's recent review ratings and dates. Temu does not expose review text, author names or buyer photos, so those are not returned.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.temu.com/"
    }
  ],
  "maxItems": 40,
  "getProductDetails": true,
  "extractReviews": false
}
```

# Actor output Schema

## `defaultView` (type: `string`):

Complete dataset containing all extracted records across all surfaces.

## `overviewView` (type: `string`):

Key product fields: image, title, price, market price, rating, sales volume, and canonical URL.

## `files` (type: `string`):

Diagnostic HTML dumps and error context metadata stored during debug mode.

# 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": [
        {
            "url": "https://www.temu.com/"
        }
    ],
    "maxItems": 40,
    "getProductDetails": true,
    "extractReviews": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("hypebridge/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": [{ "url": "https://www.temu.com/" }],
    "maxItems": 40,
    "getProductDetails": True,
    "extractReviews": False,
}

# Run the Actor and wait for it to finish
run = client.actor("hypebridge/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": [
    {
      "url": "https://www.temu.com/"
    }
  ],
  "maxItems": 40,
  "getProductDetails": true,
  "extractReviews": false
}' |
apify call hypebridge/temu-scraper --silent --output-dataset

```

## MCP server setup

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