Temu Scraper - Products, Prices & New-Product Alerts
Pricing
$3.00 / 1,000 products
Temu Scraper - Products, Prices & New-Product Alerts
Scrape Temu search results: product title, price, currency, image and product link, about 40 per page. Turn on new-product alerts to get only products you have not seen, sent to Discord, Telegram, Slack or any webhook. No login, no cookies. $0.003 per product.
Pricing
$3.00 / 1,000 products
Rating
0.0
(0)
Developer
Luke Hunter
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
For dropshipping product research, price monitoring and trend spotting on Temu. Give it search terms (or your own Temu search URLs) and it returns one row per product on the results page - title, price, currency, image and product link - read straight from Temu's own public search pages, with the sold count, rating and review count filled in whenever Temu's page states them. No login, no cookies, no proxy. Turn on new-product alerts (onlyNewSinceLastRun) and run it on a schedule to get only the products that were not in your results last time.
Pay-per-result: $0.003 per product - 1,000 products = $3.
Quick start (1 minute)
- Open the Input tab and enter one or more search terms, e.g.
phone case. - Set Maximum products (the prefilled 20 costs $0.08).
- Click Start. Export the dataset to CSV/Excel/JSON, or pull it through the API shown below.
{"searchTerms": ["phone case"],"maxItems": 20}
How it works
Temu's search page (/search_result.html?search_key=...) is server-rendered: the product list is embedded in the HTML, so no login, cookie or browser is needed to read it. This Actor:
- Checks
www.temu.com/robots.txtbefore reading anything, and again for every page and every redirect it is sent to. If a path is disallowed, or robots.txt cannot be read, it reads nothing and says why. - Reads the search page politely: one request about every 2 seconds, with an honest, self-identifying User-Agent.
- Parses each product into one flat row. The product link is the page's own link with Temu's tracking parameters removed.
- Follows the page's own "next page" link for more results, only while your Maximum products cap is not reached.
- Reports honestly - never disguises or evades - a bot-check or verification page, a block, or a search with genuinely no products. A page without product data produces no rows and no charge.
Use cases
- Dropshipping product research: run a niche keyword (
desk lamp,phone case,pet hair remover) and export titles, prices and images of what Temu is surfacing for it, to see price bands and how crowded a niche is before you source anything. - Price monitoring with alerts: schedule the same searches daily and compare
priceover time, or turn on new-product alerts to get only products that have appeared since the last run. - Trend spotting: schedule a list of category keywords and use
searchTerm,positionandscrapedAtto see which products and price points enter a keyword's results, and when.
New-product alerts: get only new products
Turn on onlyNewSinceLastRun and put this Actor on a schedule. Every run after the first delivers (and charges for) only products it has not delivered before for that exact search.
- Set your search as usual, plus:
{"searchTerms": ["desk lamp"],"onlyNewSinceLastRun": true,"maxItems": 100}
- Click Schedule on the run page (or create one under Schedules in the Apify Console) - daily works well.
- The first scheduled run is a baseline: it delivers every product currently listed (it is all new to you) and remembers it, so you are charged normally for that run. Every run after that only delivers products it has not seen for this search.
- Add a Webhook under the schedule's Integrations for
ACTOR.RUN.SUCCEEDED(Slack, email, or a Zapier/Make step) to be told when a run finds something new.
The status message tells you what happened: "First run for 1 search: 40 product(s) delivered and remembered; next runs return only new ones.", then "3 new product(s) since last run across 1 search (37 already seen).". A run that finds nothing new still succeeds with an empty dataset - that is the point of the mode. A product is remembered only after it was delivered, so one cut by your maxItems cap shows up on the next run instead of being lost. Each search term and each URL is its own watch; stateStoreName only needs changing to isolate or reset a watch's memory.
Get Temu alerts in Discord, Telegram, Slack, Teams, Google Chat, your phone (ntfy/Pushover) or any app (webhook)
Want a Temu Discord alert, a Temu Telegram bot, or new products pushed to Slack, Teams, Google Chat or your phone instead of checking a dataset? Add one or more destinations in the Actor's Notifications (optional) section and each run sends the products it delivered. It is a monitor that notifies you: it only reads public Temu search pages and never buys anything or logs in anywhere, and the messages go only to the places you set up.
| Channel | Fill in | What you get |
|---|---|---|
| Discord | discordWebhookUrl | One card per product, 10 per message |
| Telegram | telegramBotToken + telegramChatId | Up to 10 products per message, one line each |
| Slack | slackWebhookUrl | Block Kit message, up to 10 products per message |
| Mattermost, Rocket.Chat | slackCompatibleWebhookUrl | Slack-style incoming webhook: a Markdown list (these apps do not render Slack Block Kit) |
| Microsoft Teams | teamsWebhookUrl | Adaptive Card from a Teams Workflows webhook, up to 10 products per card |
| Google Chat | googleChatWebhookUrl | Card in a space, up to 10 products per message |
| ntfy (phone push, no account) | ntfyTopic (optional ntfyServer, ntfyToken) | A push per product, up to 10, then one "...and N more" |
| Pushover (phone push) | pushoverUserKey + pushoverAppToken | A push per product, up to 10, then one "...and N more" |
| Any app: Zapier, Make, n8n, Pipedream, IFTTT, Home Assistant | webhookUrl | One JSON POST per run with the delivered rows |
Fill in as many as you like; each channel works on its own and a failing one never stops the others.
Setup, channel by channel
- Discord (1 minute): Server Settings → Integrations → Webhooks → New Webhook → pick the channel → Copy Webhook URL.
- Telegram (2 minutes): chat with @BotFather, send
/newbot, paste the token intotelegramBotToken. Add the bot to the chat or channel (administrator for a channel; for a chat with yourself press Start on the bot).telegramChatIdis a numeric id (123456789, or-1001234567890for a group or channel) or a public@channelusername. - Slack: at api.slack.com/apps create an app (From scratch) → Incoming Webhooks → switch it on → Add New Webhook to Workspace → pick the channel → copy the
https://hooks.slack.com/services/...URL. - Mattermost or Rocket.Chat: create an incoming webhook in the app and paste its public
https://URL intoslackCompatibleWebhookUrl. Localhost, private IP addresses and.local/.internalnames are rejected. - Microsoft Teams: in the channel open ... → Workflows → Post to a channel when a webhook request is received → finish the wizard and copy the URL (a host ending in
.logic.azure.comor.powerplatform.com). The old "Office 365 connector" webhooks are retired and not supported. - Google Chat: in the space open Apps & integrations → Webhooks → Add webhook, name it and copy the
https://chat.googleapis.com/v1/spaces/...URL (needs a Google Workspace account that allows webhooks). - ntfy (free, no account): install the ntfy app (or open ntfy.sh), subscribe to a topic with a long random name, and put the same name in
ntfyTopic. Anyone who knows the topic can read it, so make it unguessable. Own server or a protected topic: setntfyServer(publichttps://address) andntfyToken. - Pushover: copy your user key from pushover.net into
pushoverUserKey, create an application at pushover.net/apps/build and put its API token inpushoverAppToken. Pushover itself is a separate paid app after its trial: check their pricing. - Any app (webhook): paste the catch-hook URL from Zapier, Make, n8n, Pipedream, IFTTT or Home Assistant into
webhookUrl. It must be a publichttps://address.
The recipe: a Temu new-product alert in five steps
- Set your search in
searchTerms(for examplephone case) or paste a Temu search URL intostartUrls. - Turn on
onlyNewSinceLastRun, so only products not delivered before are sent. - Add your destination(s) from the table above.
- Run it once. The first run is the baseline and sends what is currently listed (up to
maxNotifications). - Create a Schedule (for example every few hours). From then on you only hear about products it has not delivered before for that search.
{"searchTerms": ["phone case"],"onlyNewSinceLastRun": true,"maxItems": 100,"ntfyTopic": "your-long-random-topic-name","maxNotifications": 25}
The generic webhook (webhookUrl)
Each run sends one POST per 100 delivered rows (so usually one) with this body, followed by whatever your tool does with it:
{"source": "apify","actor": "temu-scraper","runId": "HG7ML7M8z78YcAPEB","count": 2,"total": 2,"part": 1,"parts": 1,"items": [ { "...": "the full dataset rows" } ]}
count is the number of rows in this POST, total the number in the run, and part / parts number the POSTs when a run delivers more than 100 rows. maxNotifications does not cap the webhook. Your endpoint should answer with a 2xx status; redirects are not followed and a failure is reported in the run status, never retried in a loop.
What to expect
- What a message contains: title, price as Temu displays it, sold count, rating and review count when the page carries them, and a thumbnail, plus the link and the search term it matched.
- Only delivered products are sent. A run that finds nothing new sends nothing, so there is no "no new products" spam. Rows the run could not deliver (for example because your spending limit was reached) are not sent.
maxNotifications(default 25, max 100) caps how many products go to chat and phone channels per run (the webhook is not capped). The rest are still in the dataset and the status message says so. ntfy and Pushover send at most 10 individual pushes, then one "...and N more" summary.- Cost: notifications are free. You pay only for delivered products at the usual price, exactly as without alerts. There is no extra charge for any channel.
- Failures never fail the run. A deleted webhook or an unreachable service leaves the run successful and the dataset complete, and the status message says what happened, for example
Notified: Discord 12, Slack 12, ntfy 10 (+summary). Teams failed (HTTP 404) - check the webhook URL.The logs show the channel name and HTTP status only, never a URL or token. - Your URLs, tokens and ntfy topic are stored as secret inputs. Anyone holding a webhook URL can post to that channel, so treat it like a password.
- The dataset is unchanged. The output rows are identical whether or not you set a destination; the run's status message just gains a short note such as
Notified: Discord 12, ntfy 10 (+summary). - It is a monitor that notifies you. It never buys anything or logs in to Temu, and the messages go only to the destinations you set up.
Input
{"searchTerms": ["phone case"],"startUrls": [],"maxItems": 100,"onlyNewSinceLastRun": false,"stateStoreName": "temu-scraper-seen-products"}
| Field | Type | Default | Description |
|---|---|---|---|
searchTerms | string[] | (none) | Words to search for, e.g. "phone case". Up to 50 per run. |
startUrls | string[] | (none) | Temu search URLs, e.g. https://www.temu.com/search_result.html?search_key=desk%20lamp. Only www.temu.com search pages are accepted (product, category and account pages are not). Tracking parameters and page are dropped. Up to 50 per run. At least one of searchTerms or startUrls is required. |
maxItems | integer | 100 | 1-5,000. Hard cap on products delivered across the whole run - your cost cap. |
onlyNewSinceLastRun | boolean | false | New-product alerts mode - see above. |
stateStoreName | string | temu-scraper-seen-products | Name of the store that remembers what each alert-mode search has delivered. |
discordWebhookUrl | string (secret) | (none) | Discord webhook URL. Must look like https://discord.com/api/webhooks/<id>/<token>. Empty means no Discord messages. |
telegramBotToken | string (secret) | (none) | Telegram bot token from @BotFather. Needs telegramChatId. |
telegramChatId | string | (none) | Telegram chat to post to: a numeric chat id or @channelusername. The bot must be added to that chat or channel. Needs telegramBotToken. |
slackWebhookUrl | string (secret) | (none) | Slack incoming webhook, https://hooks.slack.com/services/.... |
slackCompatibleWebhookUrl | string (secret) | (none) | Mattermost / Rocket.Chat incoming webhook (public https:// URL; Markdown list, no Block Kit). |
teamsWebhookUrl | string (secret) | (none) | Microsoft Teams Workflows webhook (host ending .logic.azure.com or .powerplatform.com). |
googleChatWebhookUrl | string (secret) | (none) | Google Chat space webhook, https://chat.googleapis.com/v1/spaces/.... |
ntfyTopic | string (secret) | (none) | ntfy topic name; setting it turns ntfy phone pushes on. Pick a long, unguessable name. |
ntfyServer | string | https://ntfy.sh | ntfy server. Only change it for your own public https:// ntfy server. |
ntfyToken | string (secret) | (none) | Optional ntfy access token for a self-hosted server or protected topic. Needs ntfyTopic. |
pushoverUserKey | string (secret) | (none) | Pushover user key. Needs pushoverAppToken. |
pushoverAppToken | string (secret) | (none) | Pushover application API token. Needs pushoverUserKey. |
webhookUrl | string (secret) | (none) | Generic JSON webhook (Zapier, Make, n8n, Pipedream, IFTTT, Home Assistant): the delivered rows, 100 per POST. Public https:// only. |
maxNotifications | integer | 25 | 1–100. Most products sent to chat and phone channels per run (the webhook is not capped). Extra rows are still in the dataset. Only used when a destination is set. |
There is no country or currency input: Temu does not let a page choose its region through the URL without cookies, so you get the region and currency Temu serves to the Actor's run location (US dollars in our checks). currency on every row says what you got.
Output fields
| Category | Fields |
|---|---|
| Identity | productId, url |
| Listing | title, imageUrl |
| Price | price, currency, priceText |
| Demand signals | soldCount, rating, reviewCount (only when Temu's page states them, otherwise null) |
| Search context | searchTerm, page, position, scrapedAt |
Missing values are returned as null. Nothing is invented.
Output example
{"productId": "607667892360443","title": "Phone Case - Phone Case, New High-End Tianyan Ladder Phone Case, Suitable for Apple Iphone 18/17/16/15/14/13/12/11/Plus/Pro/Max Series, Matte Feel, Creative Pattern Phone Protective Case, Anti-Drop Soft Case","url": "https://www.temu.com/phone-case-phone--high-end--ladder-phone-case-suitable-for--iphone-18-17-16-15-14-13-12--pro--matte--pattern-phone-protective-case-anti-drop-soft-case-g-607667892360443.html","price": 4.46,"currency": "USD","priceText": "$4.46","soldCount": null,"rating": null,"reviewCount": null,"imageUrl": "https://img.kwcdn.com/product/open/46aba906605945e8a48411a12d2f7ff1-goods.jpeg","searchTerm": "phone case","page": 1,"position": 1,"scrapedAt": "2026-10-06T10:00:00.000Z"}
Use it as an API
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("lukehunter/temu-scraper").call(run_input={"searchTerms": ["phone case", "desk lamp"],"maxItems": 200,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["price"], item["currency"])
Pricing and cost control
Pay per delivered product.
$0.003 per product - 1,000 products = $3.
| Products delivered | Cost |
|---|---|
| 20 | $0.06 |
| 100 | $0.30 |
| 1,000 | $3.00 |
| 5,000 | $15.00 |
There is no charge for starting a run, and no charge for a search that is skipped, blocked, or produces no products. maxItems gives you a hard upper bound on cost, and your run's own spending limit is honoured too: the Actor never delivers a product the limit cannot pay for.
Notifications to Discord, Telegram, Slack, Teams, Google Chat, ntfy, Pushover and webhooks are free: you pay only for delivered products, never for messages sent.
Limitations
- About 40 products per search page. The two search pages this Actor was built against listed 40 products each. For more, it follows the page's own "next page" link, but only as far as Temu serves product data for it: if a later page comes back without products (or Temu answers with a bot-check), that search ends there, keeps what it already delivered, and the status message says so. You are charged only for products delivered. Plan around one page (about 40 products) per search term, and use more specific search terms rather than expecting deep result lists.
- Sold counts, ratings and review counts are usually empty. They are filled only when Temu's search page states a real figure. In the signed-out search pages captured for this Actor, none of the 80 products carried them (the sold-count field was a placeholder
0, which this Actor does not report as "0 sold"), so expectnullfor most or all rows. There is no original-price or discount field for the same reason: the page does not provide one. - Region and currency are Temu's choice. No country or currency input;
currencyshows what Temu served. - Search pages only. No product detail pages, variants, shipping, seller or review text, and no category browsing.
- No login, no cookies, no Temu API. A bot-check, verification or login page is reported honestly (per search, in the run's status message) and nothing is charged for it; this Actor does not try to get past it, and stops sending requests for the rest of that run.
- Prices and rankings reflect the page at scrape time and change often.
- This is an independent tool, not affiliated with, endorsed by, or connected to Temu. You are responsible for using the collected data in accordance with Temu's terms and applicable law.
Use it from your code, Make, Zapier or n8n
Built for automated pipelines: small runs, stable field names, one row per item, and you pay only for rows actually delivered.
One API call that runs the Actor and returns the data (replace $APIFY_TOKEN with your token from Apify Console → Settings → Integrations):
curl -s -X POST "https://api.apify.com/v2/acts/lukehunter~temu-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"searchTerms": ["phone case"], "maxItems": 20}'
JavaScript (npm i apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('lukehunter~temu-scraper').call({"searchTerms": ["phone case"],"maxItems": 20});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python (pip install apify-client):
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('lukehunter~temu-scraper').call(run_input={"searchTerms": ["phone case"], "maxItems": 20})items = client.dataset(run['defaultDatasetId']).list_items().items
Schedules, webhooks and no-code tools: save your input as a Task, add a Schedule (e.g. hourly or daily), and attach a webhook or one of the Integrations tab's connectors (Make, Zapier, n8n, Google Sheets, Slack) to push each run's results into your own system.
Only new items each run: set "onlyNewSinceLastRun": true on a scheduled Task and every run after the first delivers, and charges for, only items it hasn't delivered before for that same input. That makes it a ready-made change feed.
Reliability: an automated test runs this Actor's parser against the live site every day, and failures are fixed fast.
Feedback: an honest rating on the Store page, good or bad, helps others decide if this Actor fits their needs. Missing a field or found a problem? Open an issue on the Actor page.
FAQ
Does this collect seller or customer data?
No. Only product fields from the search page - see "Output fields".
Why are soldCount, rating and reviewCount null?
Temu's signed-out search page does not state them for most products, and this Actor never guesses a number. When the page does include a figure, it is returned.
Can I get more than one page of results?
The Actor follows the page's own next-page link while your maxItems cap allows and Temu serves product data. If Temu stops serving it, the search ends with what was delivered and says so in the status message. See "Limitations".
Can I choose the country or currency?
Not at the moment: Temu does not select the region through the URL without cookies. currency shows what was served.
Can I use my own Temu search URL?
Yes - paste it into startUrls. Only www.temu.com search pages are accepted.
How do I get only new products instead of the same ones every time?
Set onlyNewSinceLastRun: true and put the Actor on a schedule - see "New-product alerts". The first run delivers everything and remembers it; later runs deliver only what is new.
Can I get Temu alerts by email?
Not natively. There are two routes. (1) Set webhookUrl to a Zapier, Make or n8n catch hook and add an email or Gmail step: the webhook delivers the products as JSON, so the email can list them. (2) Apify's own run integrations and run notifications can email you when a run finishes, but they only send a link to the run or dataset, not the products themselves. For instant alerts without building anything, Telegram, ntfy or Pushover reach your phone directly.
Can I get Temu alerts in WhatsApp?
Not natively, and we do not use unofficial WhatsApp APIs, which risk getting your number banned. The official route is the WhatsApp Business Platform (Cloud API) with its own business account, message templates and pricing: point webhookUrl at a Zapier, Make or n8n flow that calls it. For free phone alerts use Telegram or ntfy instead.
Related Actors
Other data tools from the same developer, built to the same standard: official or public sources, hard cost caps, and honest documentation of limits.
- Shopify Product Scraper by URL: price, compare-at price and stock for specific Shopify product URLs, with a change-only feed.
- Walmart Category Scraper: product names, prices, was-prices and ratings from Walmart category pages.
- Shopify Store Products Scraper: full product catalogues from any Shopify store, with prices, sale prices, variants and stock.
- Vinted Cross-Country Price Comparison: compare the same search across Vinted country markets with EUR-normalized summaries and median price gaps.
- Vinted Scraper: Vinted search results with prices, brands and sizes in any Vinted country, plus scheduled new-listing alerts sent to Discord or Telegram.
- Vinted Item Scraper by URL: price-drop and sold alerts for specific Vinted item URLs: price, brand, size, condition and availability, with a changes-only mode.
- AliExpress Search Scraper: AliExpress search results with prices, discounts, ratings and sold counts, by keyword.
- YouTube Channel Scraper: new-video alerts and channel monitoring for any list of YouTube channels: subscribers, latest videos and a new-uploads-only mode for scheduled runs.