Lelong.my Scraper | Malaysia Online Marketplace avatar

Lelong.my Scraper | Malaysia Online Marketplace

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Lelong.my Scraper | Malaysia Online Marketplace

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

Haketa

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

1

Monthly active users

6 days ago

Last modified

Security

Limited permissions

Share

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.

Apify Actor


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:

  1. 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.
  2. 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.
  3. URL mode (advanced) — paste any Lelong.my URL (search page, category browse, individual *-Sale-I.htm item, *-Sale-P.htm promoted 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) or Promoted (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}.htm route (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-LD seller block — 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

  1. Open the Lelong.my Scraper page on Apify and click Try for free
  2. Either keep the default keyword (toyota vios) or paste your own keywords / start URLs
  3. (Optional) tick Scrape Detail Pages for richer per-item data
  4. Hit Start — your dataset is live in 30–90 seconds for a small keyword set

API Run (Python)

from apify_client import ApifyClient
client = 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

LayerLibraryPurpose
HTTP clientgot-scrapingRealistic browser headers, automatic TLS fingerprint, no Chrome process
HTML parsercheeriojQuery-style traversal of product cards and DOM enrichment
Structured dataInline JSON-LD parserProduct, BreadcrumbList, ItemList extraction
ConcurrencyAsync worker queue1–20 parallel requests, default 4
StorageDataset.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 typeURL patternRecords 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.htm1 enriched product
Promoted item/{slug}-{shop}-{id}-{yyyy-mm}-Sale-P.htm1 enriched product
Category browse/{category-slug}/...Varies
Shop page/{shop-slug}/...Varies

Note: The legacy /kx/{keyword}.htm route 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/list search — so historical inputs keep working.

Extraction strategy (in priority order)

  1. Catalog product cards — primary source on search pages. Reads each card's data-id, data-link, data-name, data-price attributes plus the thumbnail src, giving a rich stub (title, price, image, listing ID) even with detail enrichment turned off.
  2. JSON-LD ItemList — used when a page still embeds structured list data.
  3. <a href*="-Sale-[IP].htm"> regex — last-resort link scrape with title/text mining.
  4. Detail-page enrichment — for each stub, fetch the product URL and parse the JSON-LD Product block (name, description, brand, category, offers.price, offers.priceCurrency, offers.availability, offers.itemCondition, offers.seller), plus DOM fallbacks for shopName, shopUrl, the full image gallery, and Sold: / 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 200 response 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 only UserImages/Items/ and Malaysia/ 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

ParameterTypeDefaultDescription
categoriesarray<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.
keywordsarray<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.
startUrlsarray<{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.
scrapeDetailsbooleantrueVisit 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.
maxRecordsinteger0Cap 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.
requestDelayinteger (ms)1000Delay between requests. Range 200–10 000. Lelong has no anti-bot WAF, but 800–2000 ms is polite.
maxConcurrencyinteger4Parallel HTTP requests during detail enrichment. Range 1–20. 4–8 is safe; higher may trigger rate limits.
proxyConfigurationobject{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 scrapeDetails is 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)

FieldTypeDescription
listingIdstring | nullLelong internal ID parsed from the URL pattern. Formats seen: plain numeric (221826664), X-prefixed (X519193), and letter-wrapped (K5734421B)
titlestringProduct title exactly as listed
descriptionstring | nullDescription from JSON-LD Product.description (detail-page enrichment)
pricenumber | nullNumeric price in RM (Malaysian Ringgit)
currencystringAlways "MYR" (Lelong's RM is normalized to the ISO code)
availabilitystring | nullFrom offers.availability, normalized to plain English (e.g., InStock)
conditionstring | nullFrom offers.itemCondition, normalized (e.g., New, Used, Refurbished)
categorystring | nullFrom Product.category / breadcrumb (e.g., Watches & Clocks, Phone & Tablet, Sports & Outdoors)
brandstring | nullFrom JSON-LD Product.brand (e.g., CASIO, SEIKO, SRAM; OEM for unbranded)
listingTypestring | nullItem (organic, -Sale-I.htm) or Promoted (paid placement, -Sale-P.htm)

Shop fields

FieldTypeDescription
shopNamestring | nullSeller display name (e.g., DAVIS, comtalk, ecobuildhardware, AufaSufy)
shopUrlstring | nullSeller storefront URL — present when a store link is exposed on the page
shopLocationstring | nullSeller city/state — present when the page surfaces it (not in Lelong's JSON-LD by default)

Media fields

FieldTypeDescription
imagestring | nullPrimary product image (absolute c.76.my CDN URL)
imagesarray<string> | nullFull sanitised image gallery — bank logos, app-store badges and merchant banners removed

Engagement & metadata

FieldTypeDescription
viewCountnumber | nullPage-view count parsed from the detail page
soldCountnumber | nullUnits-sold counter — present when the listing displays one
modelstring | nullModel code — present when declared in the schema
postedYearMonthstring | nullYYYY-MM derived from the canonical URL (e.g., 2007-01, 2027-04)
listingUrlstringCanonical product URL (natural primary key)
sourceUrlstringThe search/category/start URL that surfaced this record
scrapedAtstring (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"
}
{
"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 / availability values: Lelong's JSON-LD frequently declares listings as Used / InStock by 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 listingUrl before output. A multi-category sweep of dozens of terms returns several hundred unique, fully enriched records.
  • maxRecords is 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

ValueMeaningURL marker
ItemStandard organic listing-Sale-I.htm
PromotedPaid 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

ValueMeaning
InStockReady to ship
OutOfStockSeller currently has none
PreOrderAvailable on backorder / built to order
DiscontinuedNo longer offered

Condition values

ValueMeaning
NewBrand-new, unopened
UsedPre-owned, working
RefurbishedRestored to working condition
DamagedSold as-is for parts

Common top-level categories on Lelong.my

CategoryTypical sellers
Mobile Phones & GadgetsApple, Samsung, Xiaomi, Huawei, Realme, Oppo, Vivo
Computer & NetworkingLogitech, Razer, Asus, MSI, TP-Link, Synology
Automotive — Parts & AccessoriesPerodua, Proton, Toyota, Honda, Nissan, Mitsubishi parts shops
Home & LivingPetronas-branded merch, kitchen appliances, smart home
Fashion & AccessoriesPadini, Habib, Bonia, Vincci, Pestle & Mortar
Health & BeautyWatsons-stocked SKUs, supplements, skincare
Books, Music & MoviesEnglish / BM textbooks, vinyl, K-pop
Antiques & CollectiblesMalaysian vintage coins, stamps, comics, watches
Sports & OutdoorsBicycles, fishing tackle, badminton (Yonex / Victor)
Toys & HobbiesLego, 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 viewCount and soldCount deltas 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 Promoted listings 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 Used condition on Lelong to catch resale arbitrage opportunities
  • Track new-stock arrivals by diffing listingId sets 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 45 Apple Watch Series 9 is almost certainly counterfeit
  • Identify repeat-offender shops by counting violations per shopName
  • Snapshot evidence with scrapedAt, full image URLs, and listingUrl for 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 brand and 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 listingId values (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 requests
items = 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

HubStateWhy it matters on Lelong
Kuala Lumpur (KL)Federal TerritoryLargest concentration of electronics + fashion shops
Petaling JayaSelangorKlang Valley auto-parts and home-goods cluster
Shah AlamSelangorWholesale-leaning shops, heavy in automotive and industrial
Subang JayaSelangorMobile and gadget importers
George TownPenangAntiques, collectibles, photography, vintage electronics
Bayan LepasPenangComputer parts and refurb electronics (free-trade-zone proximity)
Johor BahruJohorCross-border (Singapore) electronics arbitrage, automotive
IpohPerakWhite goods, vintage Malaysian collectibles
KuchingSarawakEast Malaysia specialty goods, fishing tackle
Kota KinabaluSabahOutdoor / adventure gear
MelakaMelakaAntiques and Peranakan collectibles
SerembanNegeri SembilanAutomotive 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

MetricValue
EngineHTTP-only — got-scraping + cheerio (no headless browser)
Docker imageapify/actor-node:20
Cold-start build~25 seconds
Memory footprint256 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 runTypically a few cents in pay-per-event
Pricing modelPay-per-event (transparent per-record)
Data freshnessLive at run time
Auth requiredNone
Proxy requiredNone (Lelong has no Cloudflare/WAF)
Concurrency1–20 (default 4); verified stable at 8
Anti-bot tactics handledGrid-less "shell" 200s auto-retried; no CAPTCHA/WAF to bypass
Records per catalog searchA few to ~60 per term (varies with Lelong supply)

  • 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 default requestDelay: 1000 and maxConcurrency: 4 are 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 shopName is 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.htm
  • Promoted — 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.

  1. 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.
  2. 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.
  3. 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 shopName once 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.


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:

Marketplaces & Classifieds (Direct Siblings)

Automotive

Real Estate (Useful for Cross-Region SEA Coverage)

Healthcare & Care (For Cross-Niche Reseller Research)


Comparison vs. Alternatives

ApproachSetup timeData freshnessCost (100 listings)MaintenanceAnti-bot handling
This actor< 1 minuteLive at run< $0.05ZeroN/A (Lelong is open)
Manual browse + spreadsheetHours per sweepLive but stale by handFreeHigh (human)N/A
Custom Node/Python scraper1–2 days devLiveFree + infraHigh (selector drift)DIY (none needed today)
Headless browser (Playwright)1–2 days devLiveExpensive (RAM/CPU)HighOverkill — Lelong is open
Paid commercial datasetDays of sales callsWeekly / monthly$$$$NoneVendor's problem
No dataFreeN/AFreeN/AN/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: 9 for cents
  • Predictable per-keyword cost makes budgeting trivial

Changelog

VersionDateNotes
1.1.02026-11-02Shell-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.42026-10-25Search 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.02026-05-18Initial 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.02026-05Internal pivot from carlist-my-scraper (Cloudflare Bot Management Pro blocked all approaches); architecture re-targeted at Lelong.my
0.5.02026-04Internal 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.