Lazada Scraper
Pricing
from $1.80 / 1,000 catalogue rows
Lazada Scraper
Scrape Lazada products across all six marketplaces: Singapore, Malaysia, Indonesia, the Philippines, Thailand and Vietnam. Search by keyword, browse a category or read a single product, and get the price with its currency, the seller, the brand, the rating and the stock state on every row.
Pricing
from $1.80 / 1,000 catalogue rows
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Read Lazada product data across all six Lazada marketplaces: Singapore, Malaysia, Indonesia, the Philippines, Thailand and Vietnam. Search by keyword, browse a category, or pull a single product in full detail. Every row comes back with the price, the currency that price is in, the marketplace country, the seller, the brand, the rating and the stock state.
Southeast Asia is six separate retail markets wearing one brand. The same search returns a different catalogue, different sellers and different prices in each one, and the prices are denominated in six different currencies. This Actor treats that as the main event rather than a footnote.
What you get
One row per unique product. Duplicates across pages are removed before anything is counted or billed.
| Field | What it is |
|---|---|
item_id | Lazada's product id, unique within a marketplace |
sku_id | The specific variant the listed price belongs to |
name | Product title as the seller wrote it |
url | Canonical product page |
image | Main product image |
price | Current selling price, as a number |
price_currency | ISO 4217 code for that price: SGD, MYR, IDR, PHP, THB or VND |
price_display | The price exactly as the marketplace renders it |
original_price | Pre-discount price when the product is on offer |
discount | The discount the marketplace advertises, as text |
rating | Average customer rating out of 5 |
review_count | How many reviews sit behind that rating |
sold_count_display | Units sold, when the marketplace shows it |
in_stock | Whether the product is flagged available |
is_sponsored | True when the product was placed as an ad, not earned by relevance |
seller_id, seller_name | Who is selling it |
brand_id, brand_name | Brand on the marketplace |
ships_from | Where it ships from, which is often not the marketplace country |
market, market_country | Which of the six marketplaces the row is from |
matches_query | Whether a search row genuinely relates to your term |
page, position_on_page | Where it ranked, so you can rebuild the results |
source, source_input | Which term or URL produced the row |
scraped_at | UTC timestamp of the read |
Product detail rows add the full seller description, the category path, the variant list, the availability statement and a currency code read from the product page itself.
Why price_currency is on every row
Lazada does not tell you what currency a price is in. The currency field on
every product it returns is empty, and the only hint on the response is a bare
symbol such as $ or RM. A dollar sign is not a currency. If you pool a
Singapore catalogue with a Philippine one and both prices arrive as bare
numbers, you now have a price history that is quietly wrong, and nothing in
the data will ever tell you.
So this Actor derives the denomination from the marketplace itself, which is
the one thing in the request that actually fixes it, and stamps
price_currency on every single row. For product detail rows it goes further:
the product page states a real currency code, and that code is compared
against the marketplace. If the two ever disagree, the row says so in
currency_agrees_with_host and the run summary lists the mismatch, rather
than picking one and hoping.
Why a search sometimes returns nothing on purpose
This is the part most Lazada tooling gets wrong, and it is worth understanding before you build on the output.
When Lazada cannot match your search term, it does not return an empty page. It returns a full page of forty completely unrelated products, reports success, and prints a line claiming that thousands of items were found. There is no error code, no empty flag and no clue in the response. A scraper that trusts the response hands you forty rows of confident nonsense, under a run that reports success.
This Actor measures how much of each result page actually relates to what you
asked for, by checking your search words against the product names, brands and
sellers that came back. A genuine search scores close to 100 percent. An
unmatched search scores zero. When a page falls below the threshold, the
products are discarded and the search term is listed under noMatchQueries in
the run summary, so you learn that the marketplace had nothing rather than
inheriting its consolation prizes.
You can turn this off with Keep recommended products when a search has no
real match. The products are then kept but flagged matches_query: false
and is_recommendation_fallback: true, so they still cannot be mistaken for
real results.
The same scepticism is applied to the marketplace's own result counts. Lazada
reports the same total for every query, matched or not, because the number is
a ceiling rather than a count. It is passed through as
claimedMatchCountsUnverified and clearly labelled, never as a fact.
Read the run summary
The run summary is not a log, it is part of the output. It exists so that a run returning fewer rows than you expected tells you which of several very different things happened.
outcome—ok,partial,blocked,no_matches,emptyorno_inputpriceCurrency— the currency of the marketplace you selectedcurrenciesInOutput— the currencies actually present in the dataset, which is usually one and is the field to check before you sum a columnmarketOverrides— any URL you pasted that belonged to a different marketplace than the one you selected. Those rows are priced in their own marketplace's currency, never the one from the dropdownitemCountandbillableCount— what you got and what you paid fornoMatchQueries— terms the marketplace could not matchpaginationStops— why each term stopped, per term: reached your limit, ran out of pages, started repeating itself, or was refuseddeadProducts— product URLs that still serve a page but no longer have a product on itcurrencyMismatches— any row where the page and the marketplace disagreedpagesFetched,requestAttempts,attemptsRefused— how much work the run did and how much of it was turned away
An empty dataset with outcome: no_matches means the marketplace genuinely
has nothing for your term. An empty dataset with outcome: blocked means the
run never got in and you should try again. Those are opposite conclusions and
no Actor should let you confuse them.
Pagination
One page is 40 products. Set Pages per search term to walk deeper, up to 25 pages per term in a single run. Lazada itself serves at most 102 pages for any query, which is roughly four thousand products, and a run stops early and says so when the marketplace reports no further pages, when a page starts repeating products already returned, or when your product limit is reached.
Searching one term across several pages costs one request per page, so deep pagination is cheap. Product detail is one request per product and is the expensive half, which is why it is billed separately.
Inputs
- Marketplace — which of the six, and therefore which currency
- Search terms — keywords, one per line
- Category URLs — copy them from your browser; filters in the URL are kept. A URL from another marketplace is read on its own marketplace and priced in its own currency, and the run summary tells you it did that
- Product URLs or item IDs — full detail for specific products. A bare ID is read on the marketplace you selected; a full URL is read on its own
- Maximum products — stop after this many unique products
- Pages per search term — how deep to go
- Sort results by — popularity, price ascending or descending, or newest
- Minimum query relevance — the no-match threshold described above
- Keep recommended products when a search has no real match
- Attempts per page — how hard to retry a page the marketplace declines
Typical uses
Price monitoring across Southeast Asia. Run the same search term on all six marketplaces and compare, safely, because every row carries its own currency and country. Sponsored placements are flagged so they do not pollute a ranking study.
Competitor and seller research. seller_id, seller_name and
ships_from show who is actually selling a category in each market and where
the stock comes from. A surprising share of Southeast Asian listings ship
cross-border, and ships_from is how you spot it.
Catalogue and assortment mapping. Walk a category several pages deep to see what a market actually stocks, and which brands hold shelf space.
Product research. Feed in item IDs you already care about and get the full description, the variants and the category path.
Market entry sizing. Rating and review counts across a category are a usable proxy for demand, and they differ sharply between the six markets.
Notes and limits
- Six marketplaces. Lazada does not operate anywhere else.
- Prices, sellers and stock are what the marketplace shows an anonymous visitor. Member-only and app-only prices are not visible and are not invented.
ships_fromis the marketplace's own claim, not a verified origin.- A product id that no longer exists still serves a page. Those are reported
under
deadProductsrather than silently dropped. - Runs are paced deliberately. This is a courtesy to the marketplace and it is also what keeps the success rate high.
Free plan
Free Apify accounts receive up to 10 rows per run. The limit is applied before the first request rather than after the work is done, so a free run does not sit waiting for pages it will never receive. Paying accounts are not limited. Billing follows delivery: you are charged for the rows you actually received, never for rows the limit removed.