OLX Scraper avatar

OLX Scraper

Pricing

Pay per event

Go to Apify Store
OLX Scraper

OLX Scraper

Pricing

Pay per event

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Search OLX and get the ads back as rows: title, asking price as a number, the seller's town, whether the item is new or used, and whether the price is negotiable. Covers Poland, Romania, Bulgaria, Ukraine and Portugal from one actor.

No login, no cookie, no API key. It reads the ordinary results page from an exit inside the market's own country.

What you get

  • Five markets, one actor. Each OLX country runs its own domain and its own search path: /oferty/ in Poland, /oferte/ in Romania, /ads/ in Bulgaria and Portugal, /uk/list/ in Ukraine. Pick a market and the right shape is used
  • Currency read off the price, not assumed. Bulgaria has moved to the euro, so olx.bg now prints 139.99 €. Anything with BGN hard-coded is mislabelling every Bulgarian row today
  • Prices parsed per row, not per locale. Portugal writes 1.400 € meaning fourteen hundred; Bulgaria writes 139.99 € meaning a hundred and forty. Same character, opposite meanings, same website. Both come out right
  • price_type instead of a bare null. A free ad, a swap-only ad and an ad with no stated price are three different things, and none of them is a parse failure
  • negotiable as its own flag, because "6 800 zł do negocjacji" is an opening position rather than a price
  • Condition in the market's own wording where the seller set it, read from the card rather than translated
  • Ad id, town and posting date on every row, so consecutive runs diff cleanly

Why OLX

OLX is the classifieds market across Central and Eastern Europe and Portugal. In Poland it is where used goods are actually bought and sold, the way Marktplaats is in the Netherlands or Kleinanzeigen is in Germany. For second-hand pricing in those countries there is no meaningful second source.

Because it is one platform under many domains, the same query can be run across five countries and compared directly. That is the part most tooling misses: the country-scoped actors on the Store cover one market each, so a cross-border comparison means running several and reconciling their formats yourself. The formats are the hard part, and they are not consistent even within OLX.

Input

FieldTypeRequiredDefaultWhat it does
querystringone of the tworowerWhat to search for, in the market's language
marketselectnoplpl, ro, bg, ua or pt
urlstringone of the twoAn OLX search or category URL. Takes precedence
price_minintegernoLower bound in the market's currency
price_maxintegernoUpper bound in the market's currency
limitintegerno50Ads to return, 1 to 1000. A page carries about 50
retriesintegerno3Retry attempts per page

Output

{
"position": 1,
"ad_id": "1023770665",
"url": "https://www.olx.pl/d/oferta/rower-elektryczny-mtb-gorski-storm-...",
"title": "Rower Elektryczny MTB Górski Storm E-Stella 3.0 Bafang M410 720WH",
"price": 6800.0,
"price_text": "6 800 zł do negocjacji",
"price_type": "asking price",
"negotiable": true,
"currency": "PLN",
"location": "Bełchatów",
"posted_label": "26 sierpnia 2026",
"condition": "Nowe",
"is_promoted": false,
"image": "https://ireland.apollo.olxcdn.com/...",
"market": "pl",
"query": "rower"
}

Use cases

Second-hand pricing in a country you do not live in. Run your product term, filter to price_type: asking price, and take the median. condition lets you separate the new-in-box listings from the used ones, which usually sit in different price bands.

Cross-border arbitrage. The same query in pl, ro and ua returns three price distributions in three currencies. Traders live on that spread, and running it from one actor means the parsing is consistent across all three rather than three different scrapers' idea of a number.

Watching supply in a category. Schedule a query and count rows per run. posted_label shows how fresh the top of the results is, and diffing ad_id between runs tells you what appeared and what sold.

Finding dealers among private sellers. A seller posting many Nowe items in the same category is trading, not clearing out a garage. Group by location and condition to find them.

Lead lists. ad_id, title, location and url are enough to build a contact list for a category, with the ad page one fetch away.

How it compares

this actorsolidcode/olx-brazil-scraperpiotrv1001/olx-listings-scraper
Per 1.000 ads$1,00$1,00$1,00
Actor-start fee$0,001declared$0,00005
Markets in one actor5 (PL, RO, BG, UA, PT)Brazilnot stated
Currency derived per rowyes
Free / swap / negotiable separatedyes
Monthly usersnew5336

Honest about the other side: this is a crowded category and the two leaders have 53 and 36 monthly users against this actor's none. On row price all three are identical, so there is no reason to switch unless you need more than one market or you have been bitten by the price formats.

Pricing

Two events. run_start costs $0,0010 per run. listing costs $0,0010 per ad written to the dataset, which is $1,00 per 1.000. Pages that stay blocked never reach the dataset and are never billed. All pricing is pay-per-event, with no per-compute-unit charges.

Limits and gotchas

  • The search path differs per country. If you paste a URL, paste it from that country's own site. A Polish path on the Romanian domain returns a 404 page that still renders the site chrome, so it looks like a working request with no results.
  • Bulgaria prices in euro now. currency is read from the price text, so Bulgarian rows come back as EUR. If you have historical BGN data, the changeover is yours to reconcile.
  • posted_label is not a timestamp. OLX writes dates in the market's own language ("26 sierpnia 2026", "Обновено на 31 август 2026 г."), and it is returned verbatim rather than parsed through a month-name table per market that would silently be wrong somewhere.
  • Condition is optional for sellers. Coverage runs from about 97% in Romania down to roughly 23% in Bulgaria. The summary reports it per run so you know before you filter on it.
  • A free ad is 0, a swap ad is null. price_type distinguishes them. Filter to asking price before averaging anything.
  • OLX never 404s a search term. A misspelled query returns a "no exact results" page carrying suggested ads instead, so the run comes back full of listings that do not match what you asked for. There is no signal in the response to catch this: check that title actually contains your term before trusting a run with a hand-typed query.
  • Promoted ads repeat across pages. The walk deduplicates on ad_id, so a deep run returns slightly fewer rows than pages times 50. That is correct, not loss.

FAQ

Which OLX countries are supported? Poland, Romania, Bulgaria, Ukraine and Portugal, through the market field. OLX runs more domains than that; these five are the ones verified working.

Why is my Bulgarian result in euro? Because that is what OLX shows there now. The currency comes from the price on the page rather than a table in the code.

Why do some ads have no price? Check price_type. Swap-only ads have no asking price at all, and a small number of ads state none. Free ads come back as 0 with price_type: free.

Can I filter by price? Yes, price_min and price_max, in the market's own currency.

How many ads can I get in one run? Up to 1000, about 20 pages.

Does it return seller phone numbers? No. The results page does not carry them and this actor reads only the results page.