Lelong.my Scraper | Malaysia Online Marketplace
Pricing
from $1.00 / 1,000 results
Lelong.my Scraper | Malaysia Online Marketplace
Lelong.my scraper & API (Malaysia marketplace): search products by keyword and category and export title, price, description, seller, ratings, stock, photos and URL. Malaysia e-commerce and product market data plus seller lead generation — fast, no login.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
Lelong.my Scraper — Malaysia Online Marketplace Product, Price & Seller Data Extractor
The most reliable Lelong.my data extraction tool on Apify. Pull live product listings, prices in Malaysian Ringgit (RM), shop names, availability, condition, images, view counts, and listing IDs from Malaysia's veteran e-commerce marketplace — straight from JSON-LD with no headless browser, no Cloudflare bypass, and no login required.
What This Actor Does
The Lelong.my Scraper is a production-grade Apify Actor that extracts structured product listings from Lelong.my — Malaysia's longest-running online marketplace (founded 1998), still actively used by Malaysian sellers and resellers across electronics, automotive parts, fashion, home goods, antiques, collectibles, and consumer staples.
The actor accepts three input modes — no filters are required, and an empty run returns a built-in mixed sample of popular products:
- Category mode (easiest) — tick one or more of 11 ready-made categories (
smartphone,laptop,electronics,home appliances,beauty,toys,car accessories,fashion,watch,sports,groceries); each becomes a catalog search. No typing needed. - Keyword mode — supply free-text search terms (
"toyota vios","samsung","air fryer","gaming chair"); the actor queries Lelong's live catalog search (/catalog/all/list?TheKeyword=…), reads the server-rendered product cards (title, price, image, listing ID), and enriches every hit by fetching the individual product page. Categories and keywords are merged. - URL mode (advanced) — paste any Lelong.my URL (search page, category browse, individual
*-Sale-I.htmitem,*-Sale-P.htmpromoted item, or shop page); the actor detects the page type and parses accordingly. Start URLs override categories and keywords.
Each output record contains the data Malaysian e-commerce, dropshipping, and reseller teams actually need:
- Title — full product name as listed on Lelong
- Price (RM) — numeric value in Malaysian Ringgit (
MYR) - Shop name and shop URL — the seller's storefront (e.g.,
STAR_ICON,AUTOBAGS,mobileshop2u) - Availability —
InStock,OutOfStock,PreOrder(Schema.org enum normalized) - Condition —
NewCondition,UsedCondition,RefurbishedCondition - Category — auto-derived from URL slug or breadcrumb (
Automotive > Parts,Mobile Phones, etc.) - Brand — when declared in JSON-LD
Product.brand - Listing type —
Item(regular) orPromoted(paid placement,-Sale-P.htm) - Images — full image gallery, sanitised of bank logos, app-store badges, and merchant banners
- View count and sold count — when surfaced in the page DOM
- Posted year/month — extracted from the canonical URL pattern (
YYYY-MM-Sale-X.htm) - Listing ID — numeric or
X-prefixed identifier parsed from the URL
This makes the actor the fastest path to a clean, structured Lelong.my dataset — for competitive analysis, dropshipping product research, reseller arbitrage, brand monitoring, or Malaysian consumer trend tracking.
Why scrape Lelong.my yourself when this exists?
Lelong is technically easier to scrape than most modern marketplaces — no Cloudflare, no aggressive WAF, no JS challenge — but the long tail of edge cases will still consume a week of engineering time:
- Lelong's search moved from the old
/kx/{keyword}.htmroute (now an empty SEO shell) to/catalog/all/list?TheKeyword=…; each search returns a server-rendered grid of matching products, so broad coverage requires multi-keyword / multi-category orchestration - Listing cards are split between three rendering strategies: JSON-LD
ItemList,<b data-id data-link data-name>attributes, and raw<a href*="-Sale-I.htm">anchors — you need all three as fallbacks - JSON-LD payloads occasionally contain trailing commas that break stock
JSON.parse— a permissive parser is mandatory - Detail-page image galleries are polluted with bank logos (Maybank, CIMB, Public Bank), App Store / Google Play badges, and "BPP Crest" trust seals — a whitelist on
c.76.my/UserImages/Items/is required - Listing IDs and posting dates are embedded in the URL pattern
-{ID}-{YYYY-MM}-Sale-{P|I}.htm— you need a regex to recover them - Promoted listings (
-Sale-P.htm) and regular listings (-Sale-I.htm) share the same page template but differ in placement and pricing — distinguishing them matters for arbitrage analysis - Availability and condition come back as full Schema.org URIs (
https://schema.org/InStock); they must be stripped to plain English for CSV exports - Shop names occasionally appear only in DOM (
a.catalogShop-name) rather than the JSON-LDsellerblock — dual extraction needed - Lelong serves a mix of English and Malay copy; encoding and whitespace normalization are non-trivial
This actor solves all of the above: it downloads, parses, normalises, deduplicates, and outputs JSON — no parsing scripts, no broken selectors, no image-junk to filter downstream.
Quick Start
One-Click Run
- Open the Lelong.my Scraper page on Apify and click Try for free
- Either keep the default keyword (
toyota vios) or paste your own keywords / start URLs - (Optional) tick Scrape Detail Pages for richer per-item data
- Hit Start — your dataset is live in 30–90 seconds for a small keyword set
API Run (Python)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/lelong-my-scraper").call(run_input={"keywords": ["toyota vios spare parts","perodua myvi accessories","iphone 15 pro max","samsung galaxy a55","air fryer",],"scrapeDetails": True,"maxRecords": 100,"requestDelay": 1000,"maxConcurrency": 4,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"RM {item['price']:>8} | {item['shopName'] or '-':<20} | "f"{item['listingType'] or '-':<8} | {item['title']}")
API Run (Node.js / TypeScript)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('haketa/lelong-my-scraper').call({keywords: ['xiaomi redmi note 13', 'logitech gaming mouse', 'durian'],scrapeDetails: true,maxRecords: 60,maxConcurrency: 6,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Got ${items.length} Lelong.my listings`);for (const it of items) {console.log(`${it.listingId ?? '?'} RM ${it.price} ${it.title}`);}
API Run (cURL)
curl -X POST "https://api.apify.com/v2/acts/haketa~lelong-my-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["perodua axia", "proton saga"],"scrapeDetails": true,"maxRecords": 40}'
Pasting a single item URL
{"startUrls": [{"url": "https://www.lelong.com.my/original-toyota-prius-camry-vios-altis-hilux-door-lamp-switch-star-icon-X526784-2007-01-Sale-I.htm"}],"scrapeDetails": true}
The actor auto-detects the URL pattern (-Sale-I.htm for an item, -Sale-P.htm for a promoted item) and skips search-page parsing.
How It Works
Lelong.my is one of the few large-scale marketplaces that still server-renders its product grid as plain HTML. The live catalog search (/catalog/all/list?TheKeyword=…) returns each product as a card carrying data-id, data-link, data-name and data-price attributes, and every individual item page ships a full JSON-LD Product block (price, brand, availability, condition, seller, category). That makes the scraping architecture refreshingly simple — and refreshingly cheap: pure HTTP + Cheerio, no headless browser.
Architecture at a glance
| Layer | Library | Purpose |
|---|---|---|
| HTTP client | got-scraping | Realistic browser headers, automatic TLS fingerprint, no Chrome process |
| HTML parser | cheerio | jQuery-style traversal of product cards and DOM enrichment |
| Structured data | Inline JSON-LD parser | Product, BreadcrumbList, ItemList extraction |
| Concurrency | Async worker queue | 1–20 parallel requests, default 4 |
| Storage | Dataset.pushData (Apify) | Streaming per-record writes |
No Playwright. No Chrome. No headless browser overhead. The Docker image is apify/actor-node:20 and the cold start is ~25 seconds. Memory: 256 MB is sufficient for keyword runs; 512–1024 MB headroom for very large URL lists.
Source endpoints
| Page type | URL pattern | Records returned |
|---|---|---|
| Keyword / category search | /catalog/all/list?TheKeyword={keyword} | A server-rendered grid of matching products (varies by term; typically a few to ~60 per page) |
| Item detail (regular) | /{slug}-{shop}-{id}-{yyyy-mm}-Sale-I.htm | 1 enriched product |
| Promoted item | /{slug}-{shop}-{id}-{yyyy-mm}-Sale-P.htm | 1 enriched product |
| Category browse | /{category-slug}/... | Varies |
| Shop page | /{shop-slug}/... | Varies |
Note: The legacy
/kx/{keyword}.htmroute is now only an SEO landing shell with no inline listings. If you paste an old/kx/search URL in Start URLs, the actor transparently rewrites it to the live/catalog/all/listsearch — so historical inputs keep working.
Extraction strategy (in priority order)
- Catalog product cards — primary source on search pages. Reads each card's
data-id,data-link,data-name,data-priceattributes plus the thumbnailsrc, giving a rich stub (title, price, image, listing ID) even with detail enrichment turned off. - JSON-LD
ItemList— used when a page still embeds structured list data. <a href*="-Sale-[IP].htm">regex — last-resort link scrape withtitle/text mining.- Detail-page enrichment — for each stub, fetch the product URL and parse the JSON-LD
Productblock (name,description,brand,category,offers.price,offers.priceCurrency,offers.availability,offers.itemCondition,offers.seller), plus DOM fallbacks forshopName,shopUrl, the full image gallery, andSold:/Views:counters.
Resilience
- 3-attempt retry with exponential backoff per fetch (2 s × attempt + random jitter), each attempt using freshly generated Chrome 120+ headers
- Shell-page re-fetch — Lelong occasionally returns a valid
200response of the same search URL without the product grid (header/footer chrome only). Because that shell is a real 200 with a >1 KB body, a naïve scraper accepts it and records "0 results". This actor detects a grid-less 200, re-fetches the same URL up to 3× with new headers (the grid reliably reappears), and only then treats the term as empty — so a cluster of transient shells never truncates a large multi-keyword sweep - Term-level skip, not run-level abort — a keyword that stays empty after re-fetch is simply skipped; the sweep continues to the remaining keywords/categories. Only consecutive hard fetch failures (non-200 / timeouts, i.e. a real Lelong outage) trip the run-abort guard
- Status message on zero records — if a whole run returns nothing, the actor sets a clear status message telling you to broaden keywords / check Start URLs
- Permissive JSON-LD parsing — falls back to a
,]→]normalization for Lelong's occasional trailing-comma bug - Image whitelist — filters out
BankLogo,app-store-badge,google-play-badge,bpp_crest, merchant banners, and SVG icons; keeps onlyUserImages/Items/andMalaysia/paths
Why no proxy?
Lelong has no Cloudflare, no DataDome, no PerimeterX, and no WAF challenge. Direct HTTP requests with realistic Chrome 120+ headers and en-MY locale succeed reliably. The proxy field is exposed in the input schema for users running very large URL lists who want IP rotation — but for the typical workload it is off by default and never needed.
Input Parameters
{"categories": ["smartphone"],"keywords": ["toyota vios", "perodua myvi"],"startUrls": [],"scrapeDetails": true,"maxRecords": 50,"requestDelay": 1000,"maxConcurrency": 4,"proxyConfiguration": { "useApifyProxy": false }}
No filters required. The easiest way to start is the category picker — just tick one or more categories and run. Leave everything empty and the actor falls back to a built-in diverse sample of popular products (automatically capped so a no-filter run stays fast and cheap).
Parameter reference
| Parameter | Type | Default | Description |
|---|---|---|---|
categories | array<string> (enum) | [] | Pick one or more product categories — no typing needed. Allowed values: smartphone, laptop, electronics, home appliances, beauty, toys, car accessories, fashion, watch, sports, groceries. Each becomes a catalog search. Leave empty for a mixed popular sample. |
keywords | array<string> | [] (prefill ["toyota vios"]) | Free-text search terms. Each runs a /catalog/all/list?TheKeyword=… search. Use multiple keywords for breadth. Merged with any selected categories. |
startUrls | array<{url: string}> | [] | Advanced: any Lelong.my URL — keyword search, category, item detail, promoted item, or shop page. When provided, overrides categories and keywords. Useful for narrow targeting or replaying historical URLs. |
scrapeDetails | boolean | true | Visit each item URL for richer data (description, condition, full image gallery, shop info, view count). Slower but much more complete. Adds ~1–3 seconds per item. |
maxRecords | integer | 0 | Cap total output across all categories / keywords / URLs. 0 = unlimited (bounded only by source pages). A no-filter default-sample run is automatically capped at 100 to stay fast and cheap. |
requestDelay | integer (ms) | 1000 | Delay between requests. Range 200–10 000. Lelong has no anti-bot WAF, but 800–2000 ms is polite. |
maxConcurrency | integer | 4 | Parallel HTTP requests during detail enrichment. Range 1–20. 4–8 is safe; higher may trigger rate limits. |
proxyConfiguration | object | {useApifyProxy: false} | Optional Apify Proxy. Not required. Use apifyProxyCountry: "MY" for Malaysian residential IPs only if needed. |
Output Schema
Every record is a flat JSON object — easy to load straight into Postgres, BigQuery, Snowflake, Google Sheets, or a pandas DataFrame without per-field branching.
Coverage note (from the latest verification run): on a broad multi-category sweep, every core and detail field below populated at ~100% when
scrapeDetailsis on —title,listingUrl,price,currency,listingId,image,images,brand,category,condition,availability,shopName,listingType,description,viewCount,postedYearMonth,sourceUrl,scrapedAt. A few fields are present only when the specific listing/page exposes them (model,shopUrl,shopLocation,soldCount) — they are emitted when available and omitted otherwise, which is normal for marketplace data.
Core fields (populate on virtually every record)
| Field | Type | Description |
|---|---|---|
listingId | string | null | Lelong internal ID parsed from the URL pattern. Formats seen: plain numeric (221826664), X-prefixed (X519193), and letter-wrapped (K5734421B) |
title | string | Product title exactly as listed |
description | string | null | Description from JSON-LD Product.description (detail-page enrichment) |
price | number | null | Numeric price in RM (Malaysian Ringgit) |
currency | string | Always "MYR" (Lelong's RM is normalized to the ISO code) |
availability | string | null | From offers.availability, normalized to plain English (e.g., InStock) |
condition | string | null | From offers.itemCondition, normalized (e.g., New, Used, Refurbished) |
category | string | null | From Product.category / breadcrumb (e.g., Watches & Clocks, Phone & Tablet, Sports & Outdoors) |
brand | string | null | From JSON-LD Product.brand (e.g., CASIO, SEIKO, SRAM; OEM for unbranded) |
listingType | string | null | Item (organic, -Sale-I.htm) or Promoted (paid placement, -Sale-P.htm) |
Shop fields
| Field | Type | Description |
|---|---|---|
shopName | string | null | Seller display name (e.g., DAVIS, comtalk, ecobuildhardware, AufaSufy) |
shopUrl | string | null | Seller storefront URL — present when a store link is exposed on the page |
shopLocation | string | null | Seller city/state — present when the page surfaces it (not in Lelong's JSON-LD by default) |
Media fields
| Field | Type | Description |
|---|---|---|
image | string | null | Primary product image (absolute c.76.my CDN URL) |
images | array<string> | null | Full sanitised image gallery — bank logos, app-store badges and merchant banners removed |
Engagement & metadata
| Field | Type | Description |
|---|---|---|
viewCount | number | null | Page-view count parsed from the detail page |
soldCount | number | null | Units-sold counter — present when the listing displays one |
model | string | null | Model code — present when declared in the schema |
postedYearMonth | string | null | YYYY-MM derived from the canonical URL (e.g., 2007-01, 2027-04) |
listingUrl | string | Canonical product URL (natural primary key) |
sourceUrl | string | The search/category/start URL that surfaced this record |
scrapedAt | string (ISO-8601) | Run timestamp |
Example record — branded watch (organic Item)
Real record from a fresh verification run (abbreviated description for readability):
{"listingId": "K5734421B","title": "CASIO EQB-501D EQB-501DB EQB-501DC EDIFICE smartphone bluetooth solar","description": "Buy CASIO EQB-501D EQB-501DB EQB-501DC EDIFICE smartphone bluetooth solar. Lots of discount and promotional sales.","price": 1445,"currency": "MYR","availability": "InStock","condition": "Used","category": "Watches & Clocks","brand": "CASIO","shopName": "DAVIS","listingType": "Item","image": "https://c.76.my/UserImages/Items/TB220/196/067/196067375.jpg","images": ["https://c.76.my/Malaysia/casio-eqb-501d-eqb-501db-eqb-501dc-edifice-smartphone-bluetooth-solar-davis-1709-07-DAVIS@1.jpg"],"viewCount": 3679,"postedYearMonth": "2007-01","listingUrl": "https://www.lelong.com.my/casio-eqb-501d-eqb-501db-eqb-501dc-edifice-smartphone-bluetooth-solar-davis-K5734421B-2007-01-Sale-I.htm","sourceUrl": "https://www.lelong.com.my/catalog/all/list?TheKeyword=smartphone&CategoryID=0","scrapedAt": "2026-11-02T00:10:35.130Z"}
Example record — Promoted listing with a full image gallery
{"listingId": "222342403","title": "SRAM AXS POD ULTIMATE 2 BUTTON ELECTRONIC CONTROLLER","description": "Buy SRAM AXS POD ULTIMATE 2 BUTTON ELECTRONIC CONTROLLER. Lots of discount and promotional sales.","price": 1073,"currency": "MYR","availability": "InStock","condition": "Used","category": "Sports & Outdoors","brand": "SRAM","shopName": "ecobuildhardware","listingType": "Promoted","image": "https://c.76.my/UserImages/Items/TB220/222/342/222342403.jpg","images": ["https://c.76.my/Malaysia/sram-axs-pod-ultimate-2-button-electronic-controller-ecobuildhardware-2409-21-ecobuildhardware@1.jpg","https://c.76.my/Malaysia/sram-axs-pod-ultimate-2-button-electronic-controller-ecobuildhardware-2409-21-ecobuildhardware@2.jpg","https://c.76.my/Malaysia/sram-axs-pod-ultimate-2-button-electronic-controller-ecobuildhardware-2409-21-ecobuildhardware@3.jpg"],"viewCount": 3063,"postedYearMonth": "2027-05","listingUrl": "https://www.lelong.com.my/sram-axs-pod-ultimate-2-button-electronic-controller-ecobuildhardware-222342403-2027-05-Sale-P.htm","sourceUrl": "https://www.lelong.com.my/catalog/all/list?TheKeyword=electronics&CategoryID=0","scrapedAt": "2026-11-02T00:10:35.130Z"}
On
condition/availabilityvalues: Lelong's JSON-LD frequently declares listings asUsed/InStockby default, so on many sweeps these two fields look uniform — that reflects the source data, not a parsing quirk. The full normalized value sets the actor can emit are listed below.
🔁 Pagination & Scale
Lelong's catalog search (/catalog/all/list?TheKeyword=…) is not numerically paginated — one request returns a single server-rendered grid of up to ~60 products for that term. So this Lelong.my scraper scales by breadth of terms, not by paging:
- Give it many keywords / categories. Each term is its own search; results across all terms are deduplicated on
listingUrlbefore output. A multi-category sweep of dozens of terms returns several hundred unique, fully enriched records. maxRecordsis the hard ceiling. Set it to the total you want across every term (0= unlimited, bounded only by Lelong's supply for your terms). A no-filter default-sample run is auto-capped at 100 to stay cheap.- Transient "shell" 200s are retried, not fatal. Lelong intermittently returns a valid 200 of a search URL without the product grid. The actor detects this and re-fetches the same URL up to 3× with fresh headers (the grid reliably reappears). A term still empty after retries is skipped, and the sweep continues — so a cluster of shell responses can no longer cut a large job short. Only consecutive hard fetch failures (a real outage) abort the run.
- Concurrency controls detail-page speed.
maxConcurrency(default 4, verified stable at 8) parallelises the per-item detail fetches that enrich every stub with description, condition, shop, gallery and view count. - Verified: a broad multi-category sweep produced 160+ unique records at ~100% core-field coverage in ~90 seconds with zero duplicates and zero value bugs.
For deeper coverage of a single vertical or seller, paste a category URL or shop URL in startUrls instead of relying on keyword grids.
Listing Type & Availability Reference
Listing types
| Value | Meaning | URL marker |
|---|---|---|
Item | Standard organic listing | -Sale-I.htm |
Promoted | Paid placement (sponsored / featured slot) | -Sale-P.htm |
Promoted listings are typically Lelong's "Best Sellers", "Spotlight", or carousel slots. Filter on listingType === "Promoted" to study what shops are paying to push, or listingType === "Item" for purely organic supply.
Availability values
| Value | Meaning |
|---|---|
InStock | Ready to ship |
OutOfStock | Seller currently has none |
PreOrder | Available on backorder / built to order |
Discontinued | No longer offered |
Condition values
| Value | Meaning |
|---|---|
New | Brand-new, unopened |
Used | Pre-owned, working |
Refurbished | Restored to working condition |
Damaged | Sold as-is for parts |
Common top-level categories on Lelong.my
| Category | Typical sellers |
|---|---|
| Mobile Phones & Gadgets | Apple, Samsung, Xiaomi, Huawei, Realme, Oppo, Vivo |
| Computer & Networking | Logitech, Razer, Asus, MSI, TP-Link, Synology |
| Automotive — Parts & Accessories | Perodua, Proton, Toyota, Honda, Nissan, Mitsubishi parts shops |
| Home & Living | Petronas-branded merch, kitchen appliances, smart home |
| Fashion & Accessories | Padini, Habib, Bonia, Vincci, Pestle & Mortar |
| Health & Beauty | Watsons-stocked SKUs, supplements, skincare |
| Books, Music & Movies | English / BM textbooks, vinyl, K-pop |
| Antiques & Collectibles | Malaysian vintage coins, stamps, comics, watches |
| Sports & Outdoors | Bicycles, fishing tackle, badminton (Yonex / Victor) |
| Toys & Hobbies | Lego, Gundam, RC cars, scale models |
Use Cases
Malaysian E-Commerce Competitive Intelligence
Shopee, Lazada, TikTok Shop Malaysia, and PG Mall merchants use Lelong as a competitive benchmark:
- Track competing shops by name (
AUTOBAGS,STAR_ICON,mobileshop2u) and snapshot their price ladder weekly - Spot price gaps between Lelong and Shopee for identical SKUs
- Identify high-velocity SKUs via
viewCountandsoldCountdeltas across runs - Monitor promoted-listing density — which categories are flooded with paid placements vs. organic
- Build long-tail catalogs of products that Lelong serves but Shopee underweights
Dropshipping Product & Price Research
Malaysian and Singaporean dropshippers source from Lelong because listing fees are zero and many sellers operate as direct importers:
- Discover trending categories by harvesting
Promotedlistings across 50+ keywords - Margin model with verified RM prices before posting to Shopify, TikTok Shop, or WhatsApp commerce
- Find suppliers with deep stock by counting listings per
shopName - Cross-check supplier reliability via
viewCount(popularity) and listing recency (postedYearMonth) - Auto-translate listings into English / Bahasa Indonesia / Thai for cross-border launch
Reseller Arbitrage (Lelong → Shopee / Lazada / TikTok Shop)
Independent resellers run nightly Lelong sweeps to spot mispriced items they can flip:
- Watch a fixed keyword set (
"iphone 14 pro max","playstation 5","perodua axia") for 20%+ price gaps - Filter for
Usedcondition on Lelong to catch resale arbitrage opportunities - Track new-stock arrivals by diffing
listingIdsets across runs - Auto-bid on niche categories like antique Malayan coins or vintage Petronas F1 collectibles
- Build a "Lelong-only" SKU catalog — items Shopee doesn't carry, ideal for high-margin niche stores
Brand Monitoring & Counterfeit Detection
Brand owners (Padini, Habib, Bonia, Toyota Malaysia, Perodua, Proton, Yonex, Asus) use the data to enforce IP:
- Daily sweep for unauthorised use of brand names in listing titles
- Flag suspicious pricing — a
RM 45Apple Watch Series 9 is almost certainly counterfeit - Identify repeat-offender shops by counting violations per
shopName - Snapshot evidence with
scrapedAt, full image URLs, andlistingUrlfor takedown notices - Benchmark grey-market saturation for parts that bypass authorised distributors
Market Research & Consumer Trend Analytics
Research consultancies, academic teams, and MIDA/MATRADE analysts use Lelong as a low-cost Malaysian retail signal:
- Track consumer-electronics inflation via average RM-price drift on benchmark SKUs (e.g., entry-level smartphones, air fryers, gaming consoles)
- Quantify Malaysian appetite for refurbished vs. new by condition mix in major categories
- Spot seasonal lift — Hari Raya (April–May), Merdeka (August), Deepavali (November) spending peaks
- Geographic supply patterns when sellers disclose
shopLocation(Klang Valley vs. Penang vs. Johor) - Compare with Mudah.my data for full second-hand vs. new-good market modelling
Price Benchmarking for Malaysian SMEs
Small retailers in Selangor, KL, Johor, and Penang use Lelong to benchmark before pricing inventory:
- Median, P25, P90 pricing for any keyword across the top-9 organic + top-N promoted listings
- Identify Klang Valley vs. East Coast price differentials when shop location is exposed
- Detect predatory price floors — listings sub-RM 10 in normally RM 50+ categories
- Power MSME pricing tools with a clean RM-denominated dataset
- Validate distributor RRP compliance for authorised retailers
Used Auto-Parts Pricing Data
Lelong has unusually deep automotive supply for Perodua (Myvi, Axia, Bezza, Ativa), Proton (Saga, Persona, X70, X50), Toyota (Vios, Camry, Hilux, Alphard), Honda (City, Civic, HR-V, CR-V), and Nissan (Almera, X-Trail):
- Build a parts-price index for insurance and accident-write-off valuation
- Source aftermarket vs. OEM by parsing
brandand listing title keywords - Track regional shops (KL, Johor Bahru, Ipoh, Penang) for sourcing logistics
- Power workshop quoting tools with live RM pricing from real Malaysian suppliers
- Salvage-yard inventory matching for collision-repair shops
Antiques, Coins & Collectibles Valuation
Lelong remains Malaysia's largest open marketplace for vintage Petronas F1 merchandise, Malayan-era coins (1900s pre-Independence), Malaysian comics (Gila-Gila, Ujang), pre-2010 video games, and Habib jewellery resales:
- Build a price guide for numismatic dealers and pawn shops
- Authenticate provenance via cross-referencing seller history
- Track auction-style listings for high-value collectibles
- Insurance valuation evidence with timestamped market data
- Heritage curation — museums and academic projects studying Malaysian material culture
SEO & Affiliate Content (Malaysian Product Reviews)
Affiliate publishers, Malaysian tech YouTubers, and product-review blogs use Lelong data to:
- Generate "Top 10 air fryers in Malaysia 2026" style articles with verified live pricing
- Power affiliate comparison widgets with daily-refreshed RM prices and stock status
- Track product launch coverage — first appearance dates via
postedYearMonth - Auto-update structured-data feeds for Google Shopping eligibility
- Build niche price-tracker websites ("Vios spare parts under RM 100", "Refurbished iPhones in Penang")
Sample Queries & Recipes
Recipe 1 — Toyota Vios spare parts price benchmark
{"keywords": ["toyota vios bumper","toyota vios headlight","toyota vios door handle","toyota vios brake pad","toyota vios spark plug"],"scrapeDetails": true,"maxRecords": 60}
Recipe 2 — Smartphone market snapshot (Apple + Samsung + Xiaomi)
{"keywords": ["iphone 15 pro max","iphone 14","samsung galaxy s24 ultra","samsung galaxy a55","xiaomi redmi note 13","xiaomi 14"],"scrapeDetails": true,"maxRecords": 100}
Recipe 3 — Promoted-only sweep for a specific category
{"keywords": ["gaming chair", "air fryer", "robot vacuum"],"scrapeDetails": true,"maxRecords": 80}
Then post-filter listingType === "Promoted" downstream.
Recipe 4 — Single-item enrichment for a specific URL
{"startUrls": [{"url": "https://www.lelong.com.my/original-toyota-prius-camry-vios-altis-hilux-door-lamp-switch-star-icon-X526784-2007-01-Sale-I.htm"}],"scrapeDetails": true}
Recipe 5 — Antiques & collectibles sweep
{"keywords": ["malayan coin","petronas formula 1","vintage watch seiko","habib jewellery","gila-gila magazine"],"scrapeDetails": true,"maxRecords": 80}
Recipe 6 — Fashion brands monitor (Padini, Habib, Bonia)
{"keywords": ["padini", "habib", "bonia", "vincci"],"scrapeDetails": true,"maxRecords": 50}
Recipe 7 — Quick test (no detail enrichment, 9 items)
{"keywords": ["durian"],"scrapeDetails": false,"maxRecords": 9,"maxConcurrency": 2}
Useful for sanity-checking the actor before committing to a large run.
Integration Examples
Google Sheets
Schedule the actor daily on Apify, then connect the dataset to Google Sheets via the built-in Apify → Google Sheets integration. You get a fresh Lelong product sheet every morning, ready for VLOOKUP-driven pricing tools and conditional formatting on price drift.
Make.com / Zapier / n8n
Wire the Apify connector to trigger downstream workflows on:
- New
listingIdvalues (additions to a watched keyword) - Price drops above N% on tracked SKUs
- Stock changes (
InStock→OutOfStock) - Promoted-listing entries from a competitor
shopName - Daily Slack/Telegram digests of trending Lelong searches
Power BI / Tableau / Looker Studio
Connect the Apify REST API as a data source. Build dashboards for:
- RM price heat-maps per category
- Promoted vs. organic share over time
- Top-10 sellers by listing volume and
viewCount - Stock-availability time series for tracked SKUs
Postgres / Snowflake / BigQuery
Use the Apify webhook integration to POST the dataset URL to your ingestion endpoint after every scheduled run. listingId is a natural primary key; upserting is trivial.
CREATE TABLE lelong_listings (listing_id TEXT PRIMARY KEY,title TEXT,price_myr NUMERIC(10,2),currency TEXT,availability TEXT,condition TEXT,category TEXT,brand TEXT,listing_type TEXT,shop_name TEXT,shop_url TEXT,image TEXT,view_count INTEGER,sold_count INTEGER,posted_year_month TEXT,listing_url TEXT,scraped_at TIMESTAMPTZ);
Shopify / WooCommerce / EasyStore catalog sync
Map Lelong records → product drafts in your storefront. title, description, price, images and category cover the minimum Shopify product spec. Override RM → currency conversion (MYR → SGD / USD) before publish.
Salesforce / HubSpot / Pipedrive
Treat each shopName as a Lead or Account record. Use listing volume, viewCount, and presence of Promoted placements as scoring signals for B2B outreach to active Lelong sellers.
Slack / Telegram / Discord alerts
POST the dataset summary to a webhook for instant team visibility:
import requestsitems = list(client.dataset(run["defaultDatasetId"]).iterate_items())hot = [i for i in items if i.get("viewCount", 0) > 1000]requests.post(WEBHOOK, json={"text": f"Lelong sweep: {len(items)} listings, {len(hot)} hot (>1k views)"})
Major Malaysian Markets & Seller Hubs
| Hub | State | Why it matters on Lelong |
|---|---|---|
| Kuala Lumpur (KL) | Federal Territory | Largest concentration of electronics + fashion shops |
| Petaling Jaya | Selangor | Klang Valley auto-parts and home-goods cluster |
| Shah Alam | Selangor | Wholesale-leaning shops, heavy in automotive and industrial |
| Subang Jaya | Selangor | Mobile and gadget importers |
| George Town | Penang | Antiques, collectibles, photography, vintage electronics |
| Bayan Lepas | Penang | Computer parts and refurb electronics (free-trade-zone proximity) |
| Johor Bahru | Johor | Cross-border (Singapore) electronics arbitrage, automotive |
| Ipoh | Perak | White goods, vintage Malaysian collectibles |
| Kuching | Sarawak | East Malaysia specialty goods, fishing tackle |
| Kota Kinabalu | Sabah | Outdoor / adventure gear |
| Melaka | Melaka | Antiques and Peranakan collectibles |
| Seremban | Negeri Sembilan | Automotive aftermarket |
Lelong does not surface seller location in JSON-LD by default; the actor fills shopLocation when the field appears in DOM (a.catalogShop-name, breadcrumb tail, or shop-page enrichment).
Cost & Performance
| Metric | Value |
|---|---|
| Engine | HTTP-only — got-scraping + cheerio (no headless browser) |
| Docker image | apify/actor-node:20 |
| Cold-start build | ~25 seconds |
| Memory footprint | 256 MB sufficient; 512–1024 MB ceiling |
| Runtime — 1 keyword (detail on) | ~20–30 seconds |
| Runtime — 5 keywords (~45 items, detail on) | ~90–150 seconds |
| Runtime — broad multi-category sweep (160+ enriched items, detail on, concurrency 8) | ~90 seconds (verified) |
| Runtime — 1 keyword (detail off) | ~5 seconds |
| Cost per run | Typically a few cents in pay-per-event |
| Pricing model | Pay-per-event (transparent per-record) |
| Data freshness | Live at run time |
| Auth required | None |
| Proxy required | None (Lelong has no Cloudflare/WAF) |
| Concurrency | 1–20 (default 4); verified stable at 8 |
| Anti-bot tactics handled | Grid-less "shell" 200s auto-retried; no CAPTCHA/WAF to bypass |
| Records per catalog search | A few to ~60 per term (varies with Lelong supply) |
Compliance, Privacy & Legal Notes
- Public data only — every field is what Lelong.my serves to any unauthenticated visitor at the URL
- No PII — the actor extracts shop display names (business identities), not buyer information, phone numbers, or addresses unless the seller posted them publicly in their own listing
- No payment data — no card numbers, no banking information
- Respect
robots.txt— the defaultrequestDelay: 1000andmaxConcurrency: 4are deliberately conservative; tune higher only with the same courtesy - Lelong.my Terms of Service — review them at lelong.com.my before running large-scale extractions; commercial redistribution is your responsibility
- GDPR / PDPA Malaysia — even when a
shopNameis a business, downstream use must comply with PDPA 2010 (Personal Data Protection Act) if you derive anything personal - Counterfeit reporting — if you use this actor for IP enforcement, follow Lelong's seller-reporting workflow rather than acting unilaterally
Important: This actor is a tool. You are responsible for ensuring your particular use case complies with Malaysian law, Lelong.my's Terms of Service, and any contracts you hold with brand owners or platforms you republish data to.
Frequently Asked Questions
How fresh is the data?
Live at the moment of the run. Every record is fetched from Lelong.my at runtime — there is no cached index, no upstream snapshot, no overnight refresh window.
How many records can I extract?
Each keyword or category runs one /catalog/all/list?TheKeyword=… search and returns that term's server-rendered product grid — anywhere from a handful to ~60 products depending on how much supply Lelong has for the term. For broader coverage, supply more keywords / categories: a long multi-category sweep (dozens of terms) yields several hundred fully enriched records in a couple of minutes. Because there is no numbered pagination on the catalog search, breadth comes from the number of terms, not from paging — set maxRecords to your desired ceiling and give the actor plenty of keywords/categories to reach it. URL mode (paste category or shop URLs) can return more depending on the page.
Does this actor require login or Apify proxy?
No to both. Lelong has no Cloudflare, no WAF, and no JS challenge — direct HTTP succeeds. The proxy field is exposed only for users who want IP rotation on very large jobs (optionally with apifyProxyCountry: "MY" for Malaysian IPs).
How do I get deeper coverage for one term?
Each search returns Lelong's product grid for that term. To go deeper:
- Run more granular keywords (
"toyota vios bumper"instead of"toyota vios") - Add more entries to the category picker and keyword list
- Paste category or shop URLs in Start URLs to scrape a single vertical or seller
What's the difference between "Item" and "Promoted" listings?
Item— regular organic listing, URL ends in-Sale-I.htmPromoted— paid placement / spotlight slot, URL ends in-Sale-P.htm
Promoted listings are valuable for understanding which sellers are spending to push particular SKUs.
What history does this actor have?
Honest answer: this actor ID has had three lives.
mudah-scraper— originally targeted Mudah.my (Malaysia's #1 classifieds). It worked until Mudah deployed a WAF that became impassable without browser automation and residential proxies — at which point the actor was rewritten.carlist-my-scraper— pivoted to Carlist.my, Malaysia's car classifieds. Carlist sits behind Cloudflare Bot Management Pro, which blocked every approach (HTTP, Playwright, residential proxies, even browser-fingerprint randomisation). After exhausting reasonable options, the actor was pivoted again.lelong-my-scraper— the current and working successor. Lelong has no WAF, no Cloudflare, and a JSON-LD-rich page structure — so this version is fast, cheap, and reliable.
For Mudah and Carlist data, see Mudah.my Scraper (legacy listing — note current site limitations) and consider Carbase.my or the YallaMotor Scraper for GCC automotive equivalents.
Can I use this for the entire Lelong catalogue?
Practically, no — Lelong does not publish a sitemap, and each catalog search returns only that term's product grid. But you can:
- Build a long keyword list (hundreds of seed terms) and run nightly
- Paste category URLs to mine specific verticals
- Iterate shop pages by
shopNameonce you've identified the active sellers
Does this work outside Malaysia?
The Lelong.my source is Malaysia-only. For neighbouring markets, see Chotot Vietnam or Lamudi Philippines.
What export formats are available?
JSON, CSV, Excel (XLSX), HTML, XML, RSS, and JSON Lines — all directly from the Apify dataset view.
Can I schedule this actor?
Yes — Apify's built-in Scheduler supports cron expressions. A common pattern: every 6 hours sweep 20 priority keywords, daily at 02:00 KL time sweep the long-tail keyword list.
Does it work on the Apify Free Plan?
Yes — full functionality on free tier. A single-keyword run costs cents and runs well within free-tier compute units.
What happens if Lelong is down or returns empty results?
The actor retries 3× per request with exponential backoff. If Lelong returns a valid 200 without the product grid (a "shell" page — this happens intermittently), the actor re-fetches the same search URL up to 3× with fresh headers until the grid comes back; the grid reliably reappears on a retry, so transient shells no longer cost you records. A term that is still empty after re-fetching is simply skipped, and the sweep continues to the next keyword/category — one unlucky cluster of shell responses never truncates a large job. Only consecutive hard fetch failures (non-200 / timeouts, i.e. a genuine Lelong outage) abort the run. If a run finishes with zero records, the actor sets a descriptive status message so you immediately know to broaden your keywords or verify any pasted Start URLs.
Are images downloaded or just linked?
Just linked (absolute URLs on c.76.my, Lelong's CDN). Downloading would multiply costs and storage; downstream pipelines typically pull on demand.
What's a "promoted" listing worth tracking?
If a competitor consistently runs promoted placements on the same keyword cluster for weeks, that's a strong signal they're profitable on those SKUs. Track promoted-listing density to reverse-engineer competitor strategy.
Can I combine this with Shopee / Lazada scrapers?
Yes — title and brand are clean enough for fuzzy matching across marketplaces. We don't publish a Shopee scraper directly, but the schema is designed to merge cleanly with any Malaysian e-commerce dataset.
What if a shop name contains special characters?
Shop names are passed through as-is (STAR_ICON, mobileshop2u, 蝶之恋). Use shopName as a string and avoid treating it as a URL component — that's what shopUrl is for.
How are prices in non-RM currencies handled?
Lelong is RM-only; currency is always MYR. If a listing is cross-listed at USD or SGD (rare), the JSON-LD priceCurrency is preserved verbatim.
How do I report a bug?
Open an issue on the Apify Store page or use the "Contact developer" link.
🔗 Related Apify Actors by Haketa
E-Commerce & Product Scrapers (Closest Siblings)
If you benchmark Lelong.my against other online marketplaces, these product and price scrapers share the same clean, flat, export-ready schema:
- Tokopedia Scraper (Indonesia) — Indonesia's largest e-commerce marketplace: products, prices, sellers
- Wildberries Scraper — CIS mega-marketplace product and price data
- AliExpress Product Scraper — cross-border product listings, pricing, ratings
- Zalando Scraper — European fashion catalog, prices, availability
- Flipp Scraper — North American retail flyers and weekly deal prices
- Oscaro Product Scraper — European auto-parts catalog and pricing
Marketplaces & Classifieds (Direct Siblings)
- Mudah.my Scraper (Malaysia) — Malaysia's #1 classifieds (legacy; see actor README for current status)
- Chotot.com Scraper (Vietnam) — Vietnam's largest classifieds
- Mourjan Scraper (MENA) — Middle East & North Africa classifieds
- Kleinanzeigen.de Scraper (Germany) — eBay Kleinanzeigen replacement
- Marktplaats.nl Scraper (Netherlands) — Dutch classifieds leader
- OfferUp Scraper (US) — US peer-to-peer marketplace
- Kijiji.ca Scraper (Canada) — Canada's #1 classifieds
- TradeMe Scraper (New Zealand) — NZ's largest marketplace
Automotive
- YallaMotor Scraper (GCC) — Saudi/UAE/Kuwait/Qatar/Oman car listings
Real Estate (Useful for Cross-Region SEA Coverage)
- Lamudi Philippines Real Estate Scraper
- Realestate.com.kh Cambodia Scraper
- Zameen.com Pakistan Real Estate Scraper
- Domain.com.au Property Scraper (Australia)
Healthcare & Care (For Cross-Niche Reseller Research)
Comparison vs. Alternatives
| Approach | Setup time | Data freshness | Cost (100 listings) | Maintenance | Anti-bot handling |
|---|---|---|---|---|---|
| This actor | < 1 minute | Live at run | < $0.05 | Zero | N/A (Lelong is open) |
| Manual browse + spreadsheet | Hours per sweep | Live but stale by hand | Free | High (human) | N/A |
| Custom Node/Python scraper | 1–2 days dev | Live | Free + infra | High (selector drift) | DIY (none needed today) |
| Headless browser (Playwright) | 1–2 days dev | Live | Expensive (RAM/CPU) | High | Overkill — Lelong is open |
| Paid commercial dataset | Days of sales calls | Weekly / monthly | $$$$ | None | Vendor's problem |
| No data | Free | N/A | Free | N/A | N/A |
The HTTP-only architecture is the key differentiator: it costs an order of magnitude less than browser-based scrapers (no Chrome, no 1 GB RAM, no 30-second cold starts), runs faster, and is easier to extend.
Why Pay-Per-Event Pricing?
Most data scrapers either lock you into a flat monthly subscription (you pay even if you don't run) or charge by compute-unit (you can't predict the bill). This actor uses pay-per-event, which means:
- You only pay when the actor runs and produces data
- Charges scale with actual records delivered — not duration
- Transparent line-item billing inside the Apify Console
- No monthly minimums, no commitments
- Free to evaluate with
maxRecords: 9for cents - Predictable per-keyword cost makes budgeting trivial
Changelog
| Version | Date | Notes |
|---|---|---|
| 1.1.0 | 2026-11-02 | Shell-page resilience + larger yields. Lelong intermittently returns a valid 200 of a search URL without the product grid; the old logic accepted that shell as "0 results" and aborted the whole sweep after 3 such pages in a row — truncating large multi-keyword jobs far below maxRecords. Now a grid-less 200 triggers an up-to-3× re-fetch of the same URL (the grid reliably reappears), and a term that stays empty is skipped rather than aborting the run; only consecutive hard fetch failures stop a run. Verified a broad multi-category sweep at ~100% core-field coverage, 0 duplicates, 0 value bugs. README refreshed with real fresh-run output examples and corrected field/behaviour docs. |
| 1.0.4 | 2026-10-25 | Search migration + enrichment. Lelong retired inline listings on /kx/{keyword}.htm (now an SEO shell) and moved search to /catalog/all/list?TheKeyword=…. Re-pointed keyword/category search to the live endpoint and added a data-id/data-link/data-name/data-price catalog-card parser (rich stubs even without detail pages). Also: recover listingId for the new I… ID format, populate category from Product.category, normalize currency RM → MYR. Legacy /kx/ Start URLs are auto-rewritten. Verified: core fields at ~100% coverage. |
| 1.0.0 | 2026-05-18 | Initial public release as Lelong.my Scraper — HTTP-only via got-scraping + cheerio, JSON-LD primary extraction with three fallback strategies, detail enrichment, 3-attempt retry, descriptive status message on zero records |
| 0.9.0 | 2026-05 | Internal pivot from carlist-my-scraper (Cloudflare Bot Management Pro blocked all approaches); architecture re-targeted at Lelong.my |
| 0.5.0 | 2026-04 | Internal pivot from mudah-scraper (Mudah WAF became impassable); short-lived Carlist.my attempt |
Keywords
Lelong.my scraper · Malaysia online marketplace data · Malaysia e-commerce scraper · Lelong product data API · Malaysian dropshipping research · Lelong price scraper · Malaysia shopping data · Kuala Lumpur online marketplace · Lelong.my API alternative · HTTP-only marketplace scraper · Lelong product extraction · Malaysia classifieds scraper · RM price tracker Malaysia · Lelong seller monitoring · Lelong shop scraper · Malaysia reseller arbitrage data · Lelong category extraction · Lelong JSON-LD scraper · Lelong promoted listings · Lelong organic listings · Malaysian product price API · Selangor seller data · Penang marketplace data · Johor Bahru online listings · Petaling Jaya retail data · Perodua spare parts scraper · Proton parts price data · Toyota Vios parts Malaysia · Honda City accessories scraper · iPhone Malaysia price scraper · Samsung Galaxy Malaysia data · Xiaomi Malaysia listings · air fryer Malaysia price · gaming chair Malaysia · antiques Malaysia scraper · Petronas collectibles · Habib jewellery monitor · Padini fashion data · MIDA market research · MATRADE intelligence · Malaysia PDPA compliant scraper · Apify Lelong actor · Malaysia consumer trends data · Lelong vs Shopee benchmarking · Lazada Malaysia alternative data · TikTok Shop Malaysia research
Support
- Bug reports — open an Issue on the Apify Store actor page
- Feature requests — same place; please describe your use case and target keyword / URL pattern
- Direct contact — message via the Apify developer profile
If this actor saves you a week of engineering and a recurring Cloudflare headache, a 5-star rating on the Apify Store helps other Malaysian e-commerce, reseller, and dropshipping teams find it. Terima kasih!
📅 Changelog & Maintenance
Last updated: 2026-11-02 — Added shell-page re-fetch resilience so intermittent grid-less 200s no longer truncate large multi-keyword sweeps; empty terms are now skipped instead of aborting the run. Re-verified on a fresh broad sweep: 160+ unique records, ~100% core-field coverage, 0 duplicates, 0 value bugs, ~90 s. README refreshed with real fresh-run output examples and corrected field/behaviour documentation.