Scrape Temu product listings in real-time — title, price, original price, rating, reviews, sold count, shop, images. Perfect for dropshipping research.
All notable changes to this Actor will be documented here.
[2.3] — 2026-08-03 — Reliability & result-quality
Fixed
An invalid or empty "Retail markup" value no longer aborts the run (safely
falls back to the 3× default).
Changed
Results with no price and no sold count are no longer returned — you only
get (and pay for) products that carry the core commerce data the Actor
promises. Thin, incomplete hits are dropped automatically.
[2.2] — 2026-07-19 — Multi-region, Video URL, Seller info
Added — Multi-region support (20 countries)
New region input field: US, UK, DE, FR, ES, IT, NL, AU, CA, BR, MX, JP,
KR, PL, SE, AT, BE, PT, CZ, IE.
Prices, availability, and trending products differ by region.
Search URLs and product pages use region-specific Temu domains.
Added — Video URL extraction
Product pages now extract videoUrl (product video hosted on Temu CDN).
hasVideo boolean flag added — conversion signal for dropshipping.
Hot product score now awards +5 for products with video.
Added — Seller / Shop info
shopUrl — direct link to seller's mall page on Temu.
mallId — unique seller identifier (extracted from shopUrl).
Both included in TOP_PRODUCTS aggregate.
Improved — Enrichment pipeline
priceText, originalPriceText, soldCountText, reviewsCountText are now
properly parsed into numeric fields during enrichment (previously only worked
for search results, not single-product scrapes).
Unchanged
Pricing: $0.003/product.
[2.1] — 2026-07-18 — DuckDuckGo search fallback
Added — DDG fallback for keyword search
When Thunderbit returns fewer results than maxProductsPerKeyword, the actor
now automatically falls back to DuckDuckGo site:temu.com queries to fill
the gap. This guarantees results even when Temu blocks Thunderbit rendering.
DDG results include product ID, title, price (if found in snippet), and URL.
All enrichment layers (demand score, margin, hot product score, etc.) are
applied to DDG results the same way as Thunderbit results.
Products are deduplicated by productId across both sources.
Source field: "source": "ddg_search" for DDG-originated products.
Added — ddgs dependency
ddgs>=6.0.0 added to requirements.txt.
Unchanged
All 14 enrichment layers, Shopify/Google export, filters, aggregates.
Pricing unchanged: $0.003/product.
[2.0] — 2026-07-18 — Search via Thunderbit, any URL, no external tokens
Changed — Thunderbit for everything (search + product pages)
Search: Thunderbit renders search_result.html?search_key=X, extracts
product grid as rows (title, price, sold, rating, image, URL). One request
per keyword → multiple products returned.
Product pages: same Thunderbit approach as v1.x (proven, stable).
No external tokens, no browser, no proxy, no accounts.
Thunderbit public API uses anonymous user IDs — no auth needed.
Added — Accept any URL format
Bare numeric IDs (601099527041816) → auto-resolved
goods.html?goods_id=X → resolved
App share links with goods_id in query → resolved
Added — Shared Thunderbit layer (submit + poll)
Unified _thunderbit_submit / _thunderbit_poll used by both search and
product scraping. Cleaner, DRY.
Unchanged
All 14 enrichment layers
Shopify CSV / Google Merchant export
SUMMARY + TOP_PRODUCTS KV aggregates
Sort, price filters, demand/hot-score filters
Pricing: $0.003/product ($3/1K)
Requires
Nothing. No env vars, no tokens.
[1.4.3] — 2026-06-28 — Real product images recovered from the URL
Fixed — images were generic / empty
Temu loads its product gallery via JavaScript, so the logged-out HTML our
scraper sees often has only a placeholder image (or none). Result: images /
imageUrl came back generic or empty even on a successful scrape.
The full Temu URL (address-bar / "Share → Copy link") carries the real
product image in its query string (top_gallery_url=…img.kwcdn.com…jpg).
We previously stripped the whole query before scraping, discarding it.
Now the Actor mines real Temu CDN image URLs (kwcdn.com / kwimg.com) from
the original URL's query string and uses them as the primary image /
gallery when the scraped page didn't provide real ones. Recovered images are
flagged with imageSource: "url-gallery".
Passing the full URL (with top_gallery_url) now yields better images
than a hand-cleaned link. URL cleaning/validation is unchanged, so noisy URLs
are still handled automatically.
Note
transient-error on a run is an upstream backend stall, not input-related;
a re-run normally succeeds (automatic retries already built in).
[1.4] — 2026-06-18 — Graceful exit on empty / unsupported input (no false failures)
Fixed — Actor no longer fails when there's nothing to scrape
When no product URLs are provided, or all provided URLs are
unsupported (short app links / bare IDs / generic slugs that Temu can't
serve to scrapers), the Actor now exits cleanly with a clear status
message instead of returning a FAILED run.
These are user-input situations, not Actor errors. Failing on them produced
misleading FAILED runs and risked tripping the platform's daily health check.
Unsupported inputs are still skipped and NOT charged (unchanged from 1.3).
Fixed — wrong product returned for app links / bare IDs
Temu serves scrapers a generic placeholder product for any URL that isn't
the full SEO product link (verified: goods.html?goods_id=..., bare numeric
IDs, and generic product-g-<id>.html all return the same wrong default
product). The scraper now validates URLs up front and only scrapes full
product URLs that contain the product-name slug
(https://www.temu.com/<product-name>-g-<id>.html).
Unsupported inputs are skipped and NOT charged (previously they were
scraped and billed, returning a wrong title). A clear INPUT_ERRORS record is
written to the key-value store explaining how to get the correct URL.
Tracking / session parameters are stripped from URLs before scraping.