OLX Scraper - Listings Across 9 Countries
Pricing
from $1.00 / 1,000 results
OLX Scraper - Listings Across 9 Countries
Fast OLX scraper across 9 countries, including Poland, Romania, Portugal, Ukraine, Bulgaria, Kazakhstan, Uzbekistan, India and Brazil. Search or paste OLX URLs to extract structured listing data with pagination and multi-market support.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
4
Bookmarked
84
Total users
10
Monthly active users
6 days ago
Last modified
Categories
Share
OLX Scraper: Classifieds Listings, Prices, Sellers & Photos
OLX Scraper turns OLX classifieds into structured data. It covers nine OLX country sites (Poland, Romania, Portugal, Ukraine, Bulgaria, Kazakhstan, Uzbekistan, India and Brazil), and extracts title, price, category, full location with coordinates, seller profile, contact options, images, attributes and posting dates for every listing. Search by keyword and filters, or paste OLX search-result links and let the actor auto-paginate them. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Two ways to collect listings. Build a search from country, category, city, query and price filters, or paste OLX search-result URLs and the actor auto-paginates each one forward.
- Nine country sites from one actor. Poland, Romania, Portugal, Ukraine, Bulgaria, Kazakhstan, Uzbekistan, India and Brazil each run on their local OLX domain with the same output shape.
- 55+ named fields per listing. Price, category path, full location with latitude and longitude, seller profile, contact toggles, images, key attributes and posting dates, not just the search-result summary.
- Optional detail enrichment. Turn on "Fetch full details per listing" to fill in the complete description, full attribute list and any fields the search results leave empty, with one extra request per listing.
- Built for large catalogues. Resume a paused run without re-scraping listings you already have, or narrow with an advanced filter passthrough for site-specific query parameters.
- Built for schedules. Incremental mode returns only new, updated and reappeared listings on recurring runs, so a daily monitor does not re-bill what has not changed.
- Brazil handled automatically. The actor detects a Brazil run and switches the proxy to the setting that domain requires, so you do not have to configure it by hand.
Use Cases
- Price and market monitoring: track asking prices for a model, category or city over time across one or more OLX countries.
- Vehicle listings aggregation: pull car, motorcycle or parts listings by make, model and filters into your own marketplace or comparison site.
- Real estate lead sourcing: collect apartment and rental listings by city and price range for agents or lead-generation tools.
- Resale and dropshipping research: watch a category or search for newly posted items to act on quickly.
- Business intelligence: compare seller types, tags and pricing across categories and countries for competitive analysis.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
listingId | "789456123" |
country | "pl" |
title | "iPhone 13 Pro 128GB, jak nowy" |
price / priceCurrency | 3200 / "PLN" |
priceDisplay | "3 200 zł do negocjacji" |
priceNegotiable | true |
categoryName / categoryPath | "Telefony i Akcesoria" / "Elektronika / Telefony i Akcesoria" |
city / region | "Warszawa" / "Mazowieckie" |
fullLocation | "Mokotów, Warszawa, Mazowieckie" |
latitude / longitude | 52.1978 / 21.0224 |
sellerName / sellerType | "Kamil" / "private" |
sellerTag | "Approved dealer" (when present) |
businessFlag | false |
hasPhone / hasChat / hasCourier | true / true / true |
images / imageCount | list of photo URLs / 6 |
keyParams | ["Używany"] |
status | "active" |
isPromoted | true |
createdAt / validToTime | posting date / expiry date, both ISO |
url | link to the listing on its OLX country site |
Some fields are country-specific: score, kycVerified and sellerTag come from India, safedeal and delivery from countries that support those programs. With Incremental mode on, each row also gets changeType, changedFields, firstSeenAt and lastSeenAt.
How to Use
- Pick a mode:
search(filters) orurl(paste OLX search-result links). - For search mode, pick a country and fill in the filters you need; for URL mode, paste one or more links. Fields that belong to the other mode are ignored.
- Set Maximum listings and, optionally, Maximum pages to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search by keyword and price in Poland:
{"mode": "search","country": "pl","query": "iPhone 13","priceMax": 2500,"maxListings": 50}
Search a vehicle category in Romania with advanced filters:
{"mode": "search","country": "ro","categoryId": 9,"extraFilters": { "filter_enum_make": ["bmw"], "filter_float_year:from": 2018 },"sortBy": "price_asc","maxListings": 100}
Paste search-result URLs and auto-paginate:
{"mode": "url","urls": ["https://www.olx.pl/motoryzacja/samochody/bmw/"],"fetchDetails": true,"maxListings": 200}
Search Brazil (proxy is upgraded for you automatically):
{"mode": "search","country": "br","query": "iphone","maxListings": 50}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/olx-scraper").call(run_input={"mode": "search", "country": "pl", "query": "iPhone 13"})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price"], listing["priceCurrency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/olx-scraper').call({ mode: 'search', country: 'pl', query: 'iPhone 13' });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Resume and recurring updates
- Resume from a previous run (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and already-saved listings are skipped, so you do not pay to re-scrape them. - Incremental mode (
incrementalMode) is for repeating the same search on a schedule. Each listing is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED(only after a run that scanned the whole search, and only withemitExpiredon).stateKeynames or shares the tracked state; leave it empty and the actor derives one from the search itself.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (filters) or url (paste links). Only fields belonging to the chosen mode are used. |
urls | array | (none) | OLX search-result URLs to scrape (URL mode). Country is auto-detected per URL; each URL auto-paginates. Ignored in search mode. |
country | string | pl | Country to search: pl, ro, pt, ua, bg, kz, uz, in or br. Search mode only. |
query | string | (none) | Free-text search keyword. Combined with category and city filters when present. |
categoryId | integer | (none) | OLX numeric category ID. Find it by browsing OLX and reading the category page's URL or metadata. Not used for Brazil searches. |
cityId | integer | (none) | Numeric city ID for classic countries (PL, RO, PT, UA, BG, KZ, UZ). |
locationId | integer | (none) | Numeric location ID for India (state/city). Ignored for non-India searches. |
priceMin | integer | (none) | Lower bound for price, in the country's local currency. |
priceMax | integer | (none) | Upper bound for price, in the country's local currency. |
sortBy | string | default | Result order: default (relevance), created_desc, created_asc, price_asc or price_desc. |
extraFilters | object | (none) | Escape hatch for site-specific filters not exposed above. Keys are passed verbatim into the request URL; not validated. |
fetchDetails | boolean | false | Fetch each listing's detail endpoint to fill in the complete description, full attribute list and any fields the search results leave empty. One extra request per listing. |
maxListings | integer | 20 | Stop after this many listings across the whole run. 0 means unlimited, capped only by maxPages. |
maxPages | integer | (none, unlimited) | Per-search page cap. Leave empty to walk every result page until end of results or the site's own last-page signal. |
resumeFromRunId | string | (none) | Continue one interrupted run without re-scraping listings already saved there. |
incrementalMode | boolean | false | Turn on for recurring monitoring of the same search: later runs return only new, updated and reappeared listings. |
stateKey | string | (none) | Names or shares an incremental-mode state. Left empty, the actor derives one from the search itself. |
emitUnchanged | boolean | false | Also return (and bill) listings that have not changed since the last run, marked UNCHANGED. |
emitExpired | boolean | false | Also return (and bill) listings no longer found after a complete scan, marked EXPIRED. |
proxyConfiguration | object | Apify Proxy | Connection settings. Brazil automatically upgrades to Residential with country BR when needed. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"listingId": "789456123","country": "pl","url": "https://www.olx.pl/d/oferta/iphone-13-pro-128gb-jak-nowy-CID123.html","title": "iPhone 13 Pro 128GB, jak nowy","description": "Sprzedam iPhone 13 Pro 128GB w kolorze grafitowym. Stan idealny, komplet akcesoriów w oryginalnym pudełku.","createdAt": "2026-09-20T08:15:00+02:00","lastRefreshTime": "2026-09-25T10:00:00+02:00","validToTime": "2026-10-25T08:15:00+02:00","price": 3200,"priceCurrency": "PLN","priceDisplay": "3 200 zł do negocjacji","priceNegotiable": true,"offerType": "offer","categoryId": "1518","categoryName": "Telefony i Akcesoria","categoryPath": "Elektronika / Telefony i Akcesoria","city": "Warszawa","region": "Mazowieckie","district": "Mokotów","fullLocation": "Mokotów, Warszawa, Mazowieckie","latitude": 52.1978,"longitude": 21.0224,"sellerId": "44556677","sellerName": "Kamil","sellerType": "private","businessFlag": false,"hasPhone": true,"hasChat": true,"hasNegotiation": true,"hasCourier": true,"images": ["https://ireland.apollo.olxcdn.com/v1/files/sample/image;s=1000x700"],"imageCount": 6,"params": [{ "key": "state", "name": "Stan", "value": "Używany", "type": "select" }],"keyParams": ["Używany"],"status": "active","isPromoted": true,"searchUrl": "https://www.olx.pl/api/v1/offers/?category_id=1518&offset=0&limit=40","scrapedAt": "2026-09-27T20:00:00.000Z"}
Plan Requirement
The default proxy setting works on all nine supported countries. Brazil requires the Residential proxy group with country set to BR; the actor switches to it automatically when it detects a Brazil run, provided your plan has Residential access.
If the default connection is refused, the actor automatically escalates through a backup connection before giving up, and the run log says so when it happens — a successful run never silently hides which connection actually carried it.
If your Apify plan does not include proxy access at all (for example the free plan), every connection is refused in turn and the run stops with a message saying a paid plan with proxy access is required — for every country, not only Brazil.
FAQ
How much does it cost?
You pay per listing returned; detail enrichment and connector exports do not change the dataset price. The Pricing tab shows current rates. Use Maximum listings and Maximum pages to cap the cost of any run.
Is it legal to scrape OLX?
This actor collects only publicly available classifieds data. You are responsible for how you use it: follow OLX's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Do not use scraped contact details to spam sellers.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only new, updated and reappeared listings by default, and unchanged ones are not billed unless you opt in.
Why are some of my filter fields being ignored?
Search fields (country, query, category, city, price, sort, extra filters) only apply in search mode, and the URLs field only applies in URL mode. Filling in fields from the other mode has no effect; check Mode first if a run isn't behaving as expected.
Why did my run fail instead of returning an empty dataset?
The actor fails when scraping cannot start or nothing could be read: your custom proxy URLs could not be set up, Brazil was selected on a plan without proxy access, URL mode was chosen with no URLs, an unsupported country was set, the resumeFromRunId you pasted could not be loaded, Incremental mode was combined with resumeFromRunId on a search that already has saved state, or not a single results page could be read (a connection problem, which the message says is not an empty search). If a results page loads and simply has no listings, that is a genuine "nothing matched" and the run succeeds with an empty dataset. If some pages load and a later one keeps failing after retries, the run keeps what it collected and warns that the results may be incomplete.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 Want more classifieds data?
Pair this actor with these related scrapers from the same team:
| 🏷️ 2dehands & 2ememain Scrape classifieds from 2dehands.be and 2ememain.be by keyword, filters, or URLs. Returns... | 🏷️ Craigslist Scraper Scrape Craigslist postings in any of 700+ cities worldwide: price, title, posting text... |
| 🏷️ Finn.no From $0.8/1K. Scrape active Finn.no ads via search builder or URL. Returns 30+ fields per... | 🏷️ Kleinanzeigen.de Scraper From $1/1K. Scrape Kleinanzeigen.de ads by keyword, category, location, price, seller... |
| 🏷️ Gumtree AU Scraper Scrape gumtree.com.au classifieds across every vertical: for-sale goods, motors, real... | 🏷️ Chrono24 Scraper Scrape Chrono24 luxury watch listings by keyword, filters or URL. Extract 50+ fields... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.