Lazada Singapore Geo-Price Scraper
Pricing
from $1.00 / 1,000 products
Lazada Singapore Geo-Price Scraper
Landed cost for Lazada Singapore: the auto-applied voucher price, shipping fee, guaranteed delivery date and stock. Every page is fetched through a real Singapore mobile line and every row carries the IP it came from. Run-over-run change detection is free.
Pricing
from $1.00 / 1,000 products
Rating
0.0
(0)
Developer
Xavier Fok
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
43 minutes ago
Last modified
Categories
Share
Lazada Singapore Scraper — real SG mobile IPs, real landed cost
Most marketplace scrapers give you a price. A price alone doesn't tell a Singapore buyer what the thing actually costs, or whether it arrives this week.
This actor returns landed cost and availability truth: price plus the auto-applied
voucher, plus shipping fee, plus the guaranteed delivery date, plus stock, plus seller
trust metrics — captured from a genuine Singapore mobile-carrier IP. Vouchers, shipping
fees and delivery estimates are computed by Lazada from the requesting network. A
datacenter or geo-parameter scraper either can't see them or sees the wrong ones. We run
on real SG mobile lines, so what you get is what a Singapore shopper gets. Every single row
carries egress_ip and egress_geo, so the Singapore claim is checkable on every record —
no screenshot needed.
Record types
The dataset mixes four record types, each tagged with record_type — plus uncharged
error rows naming any input that produced no data.
product — one row per product, flat and spreadsheet-ready:
position, item_id, nid, name, url, image, price, original_price,
price_text, discount_pct, currency, rating, reviews, sold, in_stock,
brand_name, brand_id, seller_name, seller_id, sku, sku_id, cheapest_sku,
category_ids, location, is_lazmall, is_sponsored, traffic_type (organic vs ad),
free_shipping, restricted_age, description (the seller's feature bullets) — and
every row carries search_term, fetched_at, and egress_ip / egress_geo proving
Singapore egress.
Plus the promo layer, which is where the SG price actually gets decided:
| Field | Example | Why it matters |
|---|---|---|
voucher_text | "Voucher save 58%" | auto-applied at checkout |
voucher_discount_pct | 58 | |
voucher_price | 4.20 on a 10.00 listing | the real price to rank on |
coin_cashback | 0.14 | LazCoin rebate |
in_campaign | true | LazFlash / PAYDAY / campaign badge |
is_new_arrival | false | |
badges | ["campaign","coins","lazmall","voucherapplied"] | every badge, so a new promo type is never silently dropped |
In a live 80-result Singapore capture, 79 of 80 products carried a voucher badge.
Sorting that page by price and sorting it by voucher_price do not produce the same
ranking. A scraper that only returns price is telling you the sticker, not the sale.
product_detail — opt-in via enrichProductDetails. This is the differentiated data:
| Field | Example |
|---|---|
price | 103.0 |
shipping_fee | 0.49 |
landed_cost | 103.49 — what a Singapore buyer actually pays |
shipping_method | "Standard" |
delivery_from / delivery_to | "2026-07-31" / "2026-08-01" |
delivery_guaranteed | true |
stock_hint | "Almost sold out, buy now!" |
cash_on_delivery | false |
gtin | "194644216283" — barcode, for matching against any other catalogue |
seller_positive_rating | "99%" |
seller_ship_on_time | "100%" |
seller_chat_response | "93%" |
warranty | ["100% Authentic", "Local Seller Warranty 18 months"] |
variants | per-SKU price matrix (sale_price + original_price + image) |
max_order_qty | 5 |
rating_histogram | [206, 5, 3, 0, 1] — 5★ down to 1★ |
specifications | full spec key/value map |
flash_sale_remaining | 13 — units left in the LazFlash allocation (total - sold) |
flash_sale_status | "started" / "notStart" / "soldOut" |
flash_sale_ends_at | "2026-07-31T02:00:00Z" |
price_labels | ["Lowest Price Guarantee"] |
top_reviews | the reviews Lazada embeds — text, rating, reviewer, photo URLs |
flash_sale_remaining is hard inventory: Lazada allocates a fixed unit count to a flash
deal, so total - sold is the actual number left, not a "selling fast" string.
top_reviews is a sample of review_count, not the whole corpus — it rides along in the
payload we already fetch, so it costs nothing extra.
change — opt-in via detectChanges, and free. Set it once and every later run
tells you what moved since the last one, instead of handing you another full snapshot to
diff yourself:
change_type | Meaning |
|---|---|
price_drop / price_rise | sticker price moved — with before, after, delta, delta_pct |
voucher_price_drop / voucher_price_rise | the effective price moved, even when the sticker didn't |
out_of_stock / back_in_stock | availability flipped |
entered_results / left_results | opt-in via reportResultChurn — see below |
Every row also carries position_before / position_after, so you get rank movement
without a rank-churn row for every product on every run. The first run of a keyword stores
a baseline and reports nothing — there is no signal to report yet. Baselines live in a
named key-value store (changeStateStore), so you can track the same keywords as separate
series.
Why membership changes are off by default. Lazada rotates and personalises search
results. Two runs of the same keyword ten minutes apart shared only 22 of 40 results in a
measured pair — so entered_results / left_results would have fired 36 times while zero
prices actually moved. Reporting that as "change" would bury the signal it exists to
surface. Turn reportResultChurn on when you fixed the item set via productUrls, where
a product going missing genuinely means something.
listing_meta — market structure for the keyword: total_results (how many products
compete for it), brands (the brand facet Lazada shows), services (LazFlash, Choice,
store pick-up), ship_from (Singapore / China / overseas), categories, breadcrumb.
Example
{ "record_type": "product_detail", "item_id": "3392809159","price": 103.0, "shipping_fee": 0.49, "landed_cost": 103.49,"delivery_from": "2026-07-31", "delivery_to": "2026-08-01","delivery_guaranteed": true, "stock_hint": "Almost sold out, buy now!","gtin": "194644216283", "seller_positive_rating": "99%","seller_ship_on_time": "100%", "rating_histogram": [206, 5, 3, 0, 1] }
Two products on the same keyword, from one real run — the reason price alone
isn't enough: $103.00 + $0.49 guaranteed by 1 Aug, versus $2.79 + $1.99
arriving 4–8 Aug. Shipping is 71% of the second item's cost.
Track a fixed SKU list
Pass productUrls to skip search entirely and fetch detail records straight
from product pages — for monitoring a known catalogue daily. You are billed
only for the detail records, not for listing pages you didn't need.
Good for
SG price and MAP monitoring where vouchers and shipping change the ranking ·
landed-cost comparison · promo and campaign tracking (who is running vouchers, how deep) ·
stock and delivery-promise tracking · seller vetting before you buy or partner ·
keyword competition sizing via total_results and the brand facet.
Inputs
searchTerms and/or categoryUrls drive it. maxPages walks past the 80-per-page limit,
maxProductsPerTerm caps the total, sortBy picks Lazada's own ordering, and
enrichProductDetails + maxDetailsPerTerm control the detail pass. detectChanges
turns on run-over-run deltas, changeStateStore names the baseline store, and
reportResultChurn adds result-membership rows.
captureScreenshot is off by default. It saves a PNG of the results grid, which is
useful as a shareable artifact but adds nothing analytically — egress_ip / egress_geo
already prove Singapore egress on every row — while costing storage and up to ~20s of
compute per keyword waiting for the grid and its thumbnails to paint. Turn it on when you
want the picture.
Pricing
Pay-per-event, so you only pay for data that actually arrived:
| Record | Price | Per 1,000 |
|---|---|---|
product | $0.001 | $1.00 |
product_detail (landed cost, GTIN, seller trust) | $0.005 | $5.00 |
listing_meta (one per keyword) | $0.002 | $2.00 |
Plain product rows are the cheapest in the category — and they already carry the voucher layer, so you get the effective SG price at $1.00 / 1,000. The enrichment tier adds the shipping-and-delivery half of landed cost, and it's opt-in.
You are never charged for a blocked page, a non-Singapore egress, or a page that returned zero products. Enrichment is off by default.
The lines this runs on
Every row above came off a Singtel SIM in a dongle on a rack in Singapore. Not a datacenter range wearing an SG label. That is the entire reason the voucher prices and shipping fees are the ones a local actually gets.
We sell those lines. If you're building your own scraper and the Singapore part is what keeps breaking, dedicated SG mobile proxies are at singaporemobileproxy.com. Code APIFY15 takes 15% off your first payment.
Worth saying plainly: it's a line, not an unblocker. Shopee still blocks us on a clean SG mobile IP, because that one is app-layer fingerprinting and no proxy fixes it. Lazada works because it serves its listing JSON to an ordinary browser session.