# Temu Products Scraper (`zentrafoundry/temu-product-price-tracker`) Actor

Daily Temu US prices, ratings, shops, sold buckets. Schedule it. Keyword search can captcha; Try uses the public feed. $3 / 1,000.

- **URL**: https://apify.com/zentrafoundry/temu-product-price-tracker.md
- **Developed by:** [Zentra](https://apify.com/zentrafoundry) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 28 total users, 13 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 product 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 Products Scraper

Daily Temu US catalog rows: **price, rating, shop, sold-count buckets**. Not a search box that dies on captcha.

Try uses the public US feed. Schedule the same input every morning if you actually want a price watch.

**$3 / 1,000 products.**

### Last run

**7 row(s).** First row: **72-Inch Heavy-Duty Metal Storage Shelf…** at **$34.96**

```json
{
  "title": "72-Inch Heavy-Duty Metal Storage Shelf, Multi-Layer Adjustable Kitchen Rack for Home Use, Storage Rack, Clothes Hanger, Bedroom Organizer.",
  "productName": "72-Inch Heavy-Duty Metal Storage Shelf, Multi-Layer Adjustable Kitchen Rack for Home Use, Storage Rack, Clothes Hanger, Bedroom Organizer.",
  "sourceName": "Temu public catalog page",
  "sourceUrl": "https://www.temu.com",
  "offerUrl": "https://www.temu.com",
  "price": 34.96,
  "currency": "USD"
}
```

That is a live Temu catalog row, not a fixture.

### Run it (Try)

Paste this on the Input tab and press Start. Caps at 8 so it finishes under five minutes.

```json
{
  "searchKeywords": ["wireless earbuds"],
  "productUrls": [
    "https://www.temu.com/goods.html?goods_id=601099651743804"
  ],
  "region": "us",
  "maxProductsPerKeyword": 8,
  "sortBy": "relevance",
  "sourceMode": "live",
  "outputMode": "buyer-ready-records"
}
```

A one-off click is not the product. The product is the schedule below.

### Daily price watch (the actual product)

In **Apify Console → Schedules → Create**, run this Actor every day at 06:00 UTC with:

```json
{
  "searchKeywords": [
    "wireless earbuds",
    "storage shelf",
    "led desk lamp"
  ],
  "region": "us",
  "maxProductsPerKeyword": 200,
  "sortBy": "relevance",
  "sourceMode": "live",
  "outputMode": "buyer-ready-records"
}
```

| Volume | Charge |
| --- | --- |
| 8-row Try | ~$0.02 |
| 200 products / day | ~$0.60 / day · ~$18 / month |
| 1,000 products / day | **$3 / day · ~$90 / month** |
| 5,000 products / day | **$15 / day · ~$450 / month** |

Swap the keywords for the SKUs you actually source. Keep `region: "us"`.

### n8n / Make

1. HTTP Request node, method `POST`
2. URL `https://api.apify.com/v2/acts/zentrafoundry~temu-product-price-tracker/runs?token=YOUR_TOKEN`
3. Body: the daily JSON above
4. On success, GET `{{defaultDatasetId}}/items` and push to Google Sheet / Slack

Same call from Make.com **HTTP → Make a request**. Cron the scenario daily. Do not poll on every keystroke.

### What lands in the dataset

- `title` / `productName`
- `price` (USD)
- `soldCount` bucket (`5.2K+` is a bucket, not an exact unit)
- `shopName`
- `sourceUrl` / `offerUrl`

### Use it when

You already buy Temu inventory or watch competing SKUs and need a dated price + sold-bucket series, not a screenshot.

### Price

**$3 / 1,000 billed products** (`$0.003` each). Platform usage is included in PPE.

### What you should know

- Sold counts like `10K+` are Temu buckets. Treat them as a lower bound.
- Keyword search still trips Temu security. Try and the default schedule use the public US catalog feed so the run actually returns rows.
- Not official Temu API access. Not seller PII.

### FAQ

**Is the last-run a fixture?** No. $34.96 storage shelf came from Temu’s public catalog.

**Will keyword search always work?** No. If Temu serves a captcha, the run uses the public feed instead of dying empty.

**How do I not get charged for a huge run?** Set `maxProductsPerKeyword` and the Actor `maxTotalChargeUsd` on the schedule.

# Changelog

This Actor's version history is a separate document: https://apify.com/zentrafoundry/temu-product-price-tracker/changelog.md

# Actor input Schema

## `sourceMode` (type: `string`):

Live collects from public Temu pages. Sample writes a labeled non-live record without a Temu request or product-result charge.

## `outputMode` (type: `string`):

Buyer-ready records for live collection. Sample records are labeled and contain no live offer.

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

Temu search terms used in live collection.

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

Optional public Temu product page URLs or goods IDs.

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

Temu storefront region for live collection.

## `maxProductsPerKeyword` (type: `integer`):

Live collection cap per keyword (1-300). Keep 10 for a cheap first click.

## `sortBy` (type: `string`):

How Temu should order keyword results in live collection.

## `exportFormat` (type: `string`):

Optional catalog-oriented CSV shape written to the run key-value store.

## `retailMarkup` (type: `string`):

Optional multiplier for a live-record research estimate only. Not a profit guarantee.

## Actor input object example

```json
{
  "sourceMode": "live",
  "outputMode": "buyer-ready-records",
  "searchKeywords": [
    "wireless earbuds"
  ],
  "productUrls": [],
  "region": "us",
  "maxProductsPerKeyword": 8,
  "sortBy": "relevance",
  "exportFormat": "default",
  "retailMarkup": "3.0"
}
```

# 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 = {
    "sourceMode": "live",
    "outputMode": "buyer-ready-records",
    "searchKeywords": [
        "wireless earbuds"
    ],
    "productUrls": [],
    "region": "us",
    "maxProductsPerKeyword": 8,
    "sortBy": "relevance",
    "exportFormat": "default",
    "retailMarkup": "3.0"
};

// Run the Actor and wait for it to finish
const run = await client.actor("zentrafoundry/temu-product-price-tracker").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 = {
    "sourceMode": "live",
    "outputMode": "buyer-ready-records",
    "searchKeywords": ["wireless earbuds"],
    "productUrls": [],
    "region": "us",
    "maxProductsPerKeyword": 8,
    "sortBy": "relevance",
    "exportFormat": "default",
    "retailMarkup": "3.0",
}

# Run the Actor and wait for it to finish
run = client.actor("zentrafoundry/temu-product-price-tracker").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 '{
  "sourceMode": "live",
  "outputMode": "buyer-ready-records",
  "searchKeywords": [
    "wireless earbuds"
  ],
  "productUrls": [],
  "region": "us",
  "maxProductsPerKeyword": 8,
  "sortBy": "relevance",
  "exportFormat": "default",
  "retailMarkup": "3.0"
}' |
apify call zentrafoundry/temu-product-price-tracker --silent --output-dataset

```

## MCP server setup

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

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/50nual5CVK0DdfXi9/builds/GUBSP5vZgB4Mi7sZ8/openapi.json
