OLX Listings Scraper
Pricing
from $1.05 / 1,000 results
OLX Listings Scraper
Search live OLX Group marketplace listings across 7 countries (Poland, Ukraine, Kazakhstan, Uzbekistan, Romania, Bulgaria, Portugal) — price, condition, seller, photos and location, routed to whichever surface each country's robots.txt actually allows.
Pricing
from $1.05 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
OLX Listings Scraper — PL/UA/KZ/UZ/RO/BG/PT
Search live OLX Group classifieds across 7 countries — Poland, Ukraine, Kazakhstan, Uzbekistan, Romania, Bulgaria, Portugal — with one unified schema. No login, no cookies, no browser. HTTP only.
Why one actor across 7 countries
Every OLX Group country domain runs the identical platform and answers the
identical ad-object shape — verified by cross-checking fields between the
JSON API and the site's own server-rendered state. The only real variation
between countries is transport, and that variation is forced by each
country's own robots.txt, not by choice:
| Countries | robots.txt says | Strategy used |
|---|---|---|
| Poland, Ukraine, Kazakhstan, Uzbekistan | /api/ allowed | S1-api — the JSON search API directly |
| Romania, Bulgaria, Portugal | /api/ disallowed, search+detail HTML allowed | S2-ssr — the site's own server-rendered __PRERENDERED_STATE__, same ad fields |
A user picks country; the actor picks the strategy that host's own policy
permits. This is a routing table, not a mode switch — there's exactly one
behaviour (search → listings) and the registry just says how to reach it.
What you get
One record type per search result, one SEARCH_SUMMARY per query.
LISTING
| Field | Notes |
|---|---|
adId, title, description, url | |
priceAmount | None for genuinely priceless listings — swap-only ("Zamienię") and giveaway ("Za darmo") ads carry no real number. See priceType. |
priceType | price (fixed) / arranged (negotiable, still a real number) / free / exchange — the honest signal for "is there a price at all" |
priceCurrency, priceNegotiable, priceLabel | |
city, region | |
category, condition, params | params is every category-specific attribute (model, mileage, size, …) as raw passthrough — no fixed schema is possible across OLX's whole category tree |
photos, photoCount | |
isBusiness, isPromoted, sellerName | |
createdAt, validToAt | ISO 8601 UTC |
SEARCH_SUMMARY — one per query
reachableCount vs upstreamTotalCount are different numbers, both
real: OLX's own API caps total_elements at 1000 regardless of how many
results actually exist (visible_total_count carries the true figure — a
popular query can show 148,000+ there while reachableCount stays 1000).
Also reports pagesFetched, duplicatesSkipped (see below), and
queryEchoed — the literal query string upstream received, useful because
OLX's own search falls back to fuzzy token matching on a query with no real
hits rather than returning empty.
ERROR — one per query that failed
Every query maps to at least one row.
Known limits — read before relying on volume figures
- Offset ceiling is exactly 1000, enforced identically on every query regardless of popularity. This is a platform limit, not something this actor could paginate past.
- Promoted ads recycle independently of pagination. OLX interleaves
paid-placement listings into every page at fixed slots, and once a
query's promoted pool runs dry it starts repeating earlier promoted ids.
Deduplicated automatically —
duplicatesSkippedonSEARCH_SUMMARYreports how many were dropped, typically ~5% of a deep (1000-item) walk. - Romania/Bulgaria/Portugal return one page only. Their robots.txt
allows the search page but not the paginated API, and the page itself
doesn't expose a working offset parameter for deeper pages without a
browser — out of scope for an HTTP-only actor.
noteson the summary row says so explicitly when it happens. - A nonsense search query does not come back empty. This is upstream's
own site behaviour (their search box does the same fuzzy fallback), not a
bug —
queryEchoedlets you see exactly what was searched.
Countries probed and found out of scope this session
olx.ba, olx.com.br — robots.txt itself answers behind a Cloudflare
challenge (policy unreadable). olx.in, olx.co.za, olx.com.pk — a
different, non-OLX-Group platform (404s / no JSON, no __PRERENDERED_STATE__).
Proxy
Residential is the default. No WAF was observed anywhere in this family during recon (6-profile TLS ladder × 7 hosts × both surfaces, all 200 OK), but a shared datacenter IP is still the fastest way onto a rate limit on a high-traffic marketplace.