OLX Scraper: olx.pl/ua/ro/pt/bg/kz/uz (search, filters, alerts) avatar

OLX Scraper: olx.pl/ua/ro/pt/bg/kz/uz (search, filters, alerts)

Pricing

from $0.80 / 1,000 result items

Go to Apify Store
OLX Scraper: olx.pl/ua/ro/pt/bg/kz/uz (search, filters, alerts)

OLX Scraper: olx.pl/ua/ro/pt/bg/kz/uz (search, filters, alerts)

OLX scraper for olx.pl, olx.ua, olx.ro, olx.pt, olx.bg, olx.kz and olx.uz: search by keyword, category, city, region and price. Rows carry price, currency, condition, location, coordinates, seller type, photos and every OLX parameter. Monitor mode alerts on new listings and price cuts. No login.

Pricing

from $0.80 / 1,000 result items

Rating

0.0

(0)

Developer

Viktor Dubnytskiy

Viktor Dubnytskiy

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

3

Monthly active users

0.4 hours

Issues response

9 days ago

Last modified

Categories

Features

Limited permissions

Share

Search seven OLX marketplaces from one actor: olx.pl (Poland), olx.ua (Ukraine), olx.ro (Romania), olx.pt (Portugal), olx.bg (Bulgaria), olx.kz (Kazakhstan) and olx.uz (Uzbekistan). Paste an OLX search page URL with your filters or search by keyword, and get structured listings. No login and no proxy needed.

Try it: the prefilled example returns 20 rows in about 5 seconds and costs about $0.020. Results cost $1 per 1,000.

What you get

Real rows from the example run (query rower, country: pl):

titleprice / currencycity / regionsellerTypesellerName
Rower elektryczny Specialized Turbo Vado 3 4.013999 / PLNCzęstochowa / Śląskieprivatenull
Rower Kross Trans Siberian350 / PLNWołowice / Małopolskieprivatenull
Aurum Essentia Sram Force e1 scope 619900 / PLNNekla / WielkopolskiebusinessBikeLove Bikes l Piotr l

Full row: id, url, platform, country, title, description (detail rows), price, currency, priceLabel, priceNegotiable, priceType, categoryId, condition, city, district, region, lat, lon, images, sellerId, sellerName, sellerType, createdAt, refreshedAt, validTo, isPromoted, deliveryAvailable, params, status, query, searchUrl, rank, source, scrapedAt. Monitor rows add changeType, changedFields and previous.

sellerName and sellerId are filled only for business sellers. For private sellers both are null, because OLX shows a private person's name there (sometimes their phone number). Phone numbers and e-mail addresses that private sellers type into the title or description are removed as well.

Use cases

  • Resale and arbitrage: watch a keyword across OLX countries, get an alert the moment a listing appears or its price drops.
  • Price research: pull a full category with price, condition and attributes to build a price curve before you buy or list.
  • Market monitoring: track how many business vs. private sellers are active in a category, and how fast listings rotate.

Try it in 10 seconds

Hit Start. The input already works: country: pl, queries: ["rower"], maxItems: 20, nothing required. Swap in your own country and keywords, or paste an OLX search page URL into searchUrls, and run again.

To track a search over time: save the input as a Task, set Mode to monitor and put it on a schedule. Each run then returns only what is new or changed since the previous run of that Task.

Search by OLX page URL

Set your filters on the OLX website (category, city or region, year, body type, price, private or business, sort), copy the address bar and put it in searchUrls. The actor opens that page once, reads the exact API request OLX itself builds for it (category path to category_id, city and region path to city_id / region_id, q-<text> to the query, every search[...] filter including filter_enum_* and filter_float_*:from/to, search[order], search[private_business]) and then pages through OLX's public offers API with those parameters. We checked this on olx.ua and olx.pl pages: the API with the translated parameters returned the same listings in the same order as the page.

  • The country comes from the URL host (olx.ua, m.olx.ua, olx.pl and so on), so one run can mix countries.
  • country, categoryId, cityId, regionId, priceFrom and priceTo do not apply to URL searches; the URL carries its own filters.
  • If the URL has no sort, sortBy is used (newest first by default).
  • In monitor mode the translation is kept with the Task for 24 hours, so a frequent run calls only the API.
  • When searchUrls is set, queries is ignored, so the prefilled keyword does not run alongside your URLs.
  • If OLX shows a wall instead of the page, monitor mode falls back to the last translation it saved. A URL that cannot be translated at all, or whose category or city path OLX does not resolve, ends the run as blocked in monitor mode, so you notice it.

Monitor mode

mode: monitor compares each run with the history this Task keeps and pushes only the differences. monitorReport decides what counts:

monitorReportWhat is returned and charged
all (default)New listings, plus any price, currency, status or refresh change of a known listing
new_and_priceNew listings and price (or currency) changes. Refreshes, bumps and status-only changes are not returned and not charged
newOnly listings this Task has never seen. A refresh or bump is never returned, and neither is an older ad that shows up for the first time because it was bumped

The first run sets the baseline. With new and new_and_price the first run of a Task records what is on OLX now and returns nothing (you pay one monitor-check and no rows). From the second run on you get what appeared since. With all the first run returns everything, as before.

History is updated on every run whatever you choose, so a listing that disappears and comes back later is not new again. With new and new_and_price, an ad seen for the first time is reported only if OLX created it after the Task's first run. Older ads reach the top of "newest" when their owner bumps them, and these count as bumps. Changed rows carry changedFields and previous, for example ["price"] and {"price": 9500}.

Early stop. On OLX, "newest first" means most recently posted or refreshed. With that sort, a monitor run stops paging a search once a page reaches 30 minutes below the newest listing of the last complete run (before the first complete run: once a page holds only listings the Task already knows). The 30-minute overlap is there because OLX sometimes shows a listing late, with a refresh time older than listings it already showed; the overlap is already in history, so it costs a page read and no rows. The paid ads OLX pins at fixed positions on every page are ignored for this check. A run every 10 minutes on all passenger cars of olx.ua reads about 4 pages (10 minutes of new activity plus the 30-minute overlap), because 30 to 45 car ads are posted or refreshed there every 10 minutes during the day. That point moves forward only after a run read everything down to it without a wall, an error or hitting maxPages/maxItems. If a run is cut short, the next one reads down to the old point again, so nothing in between is lost as long as maxPages × 40 covers it. If the backlog is deeper than that (for example after a long pause), the run moves the point on once its last page holds only listings the Task already has, and writes a warning to the log, because listings in between may have been missed. Turn early stop off with monitorEarlyStop: false to always read maxPages pages.

In monitor mode maxItems caps the rows returned and charged, not the rows read. Listings over the cap are not marked as seen and come with the next run.

History is stored compactly: only price, currency, status and refresh time per listing, compressed. 200,000 listings take about 3 MB. A listing that has not been refreshed for 60 days is dropped from history; if it comes back it still does not count as new with new and new_and_price, because only listings created after the Task started (or in the last 60 days, whichever is later) can be new. History is saved after every 20 pushed rows, and a run killed mid-save keeps the previous complete history.

Monitoring cars on OLX.ua every 10 minutes

One Task covers all passenger cars of Ukraine. Use either the category id or the page URL:

{
"country": "ua",
"queries": [],
"categoryId": 108,
"sortBy": "created_at:desc",
"maxPages": 10,
"maxItems": 600,
"mode": "monitor",
"monitorReport": "new",
"monitorEarlyStop": true
}
{
"queries": [],
"searchUrls": ["https://www.olx.ua/uk/transport/legkovye-avtomobili/?search[filter_float_motor_year:from]=2015&search[order]=created_at:desc"],
"maxPages": 10,
"maxItems": 600,
"mode": "monitor",
"monitorReport": "new",
"monitorEarlyStop": true
}

Save it as a Task and add a schedule with cron */10 * * * *. Use webhookUrl or telegramBotToken + telegramChatId to get a summary per run, or read the run's dataset from your own bot and route each listing to your users. maxPages: 10 costs nothing extra on a normal run, because early stop ends it after about 4 pages; the headroom is there for a run after an outage. The first run is the baseline and returns nothing.

Measured on 04.11.2026 with the first recipe (olx.ua, category 108, 512 MB, version 0.3.1). The first run of a Task is the baseline: it read 10 pages, recorded 446 listings, returned nothing and took 11 s with $0.0005 of platform usage. A run 9 minutes after the previous one read 4 pages, returned 19 new listings and took 8 s with $0.0007 of usage. After a 15-minute gap a run read 6 pages and returned 17 in 9 s ($0.0007). A run straight after another read 3 pages (the overlap), returned nothing and took 6 s ($0.0004).

What it costs per day at the prices below (before Store discounts):

Schedulemonitor-check1,000 new listingsPlatform usageTotal per day
every 10 min (144 runs)$0.72$1.00about $0.10about $1.82
every 20 min (72 runs)$0.36$1.00about $0.06about $1.42

How it works

Search goes through OLX's own public offers API, so rows arrive structured rather than scraped out of HTML. Each search is paginated separately (40 listings per page) until maxPages or maxItems is reached (in monitor mode, until early stop or maxPages). searchUrls read the search page once to learn OLX's own API parameters for it. In monitor mode the actor compares the result set with the history of the same Task and pushes only what monitorReport asks for, optionally POSTing a summary to your webhook or Telegram chat.

Input

FieldMeaningDefault
countryWhich OLX site: pl, ua, ro, pt, bg, kz, uzpl
queriesFree-text searches, e.g. ["rower"]; each is paginated separatelyprefilled ["rower"]
searchUrlsOLX search page URLs with your filters (replace queries when set), e.g. https://www.olx.ua/uk/transport/legkovye-avtomobili/?search[order]=created_at:descnone
categoryIdOLX numeric category id, e.g. 108 for passenger cars on olx.uanone
cityId / regionIdOLX numeric city / region id, e.g. 268 (Kyiv)none
priceFrom / priceToPrice range in the site's own currency, e.g. 100 / 900none
sortBycreated_at:desc, relevance:desc, filter_float_price:asc, filter_float_price:desccreated_at:desc
maxPagesPages per search, 40 listings each5
offerIdsNumeric offer ids for full detail rows, e.g. ["928010872"]none
maxItemsStop after this many listings (monitor mode: this many returned rows)20
modescrape, or monitor for new/changed onlyscrape
monitorReportall, new_and_price or new (monitor mode)all
monitorEarlyStopStop paging at already seen listings (monitor mode, newest first)true
monitorStateIdHistory id when you run monitor mode without a saved Tasknone
webhookUrl, telegramBotToken, telegramChatIdWhere monitor-mode change summaries are sentnone

Pricing

EventPrice
result$0.001 per listing ($1 per 1,000)
monitor-check$0.005 per monitor run
change$0.001 per new/changed listing

Charged only for listings actually pushed. A scrape run that finds nothing costs nothing; a monitor run always costs one monitor-check, except when OLX refused every request.

Why this actor

  • Seven OLX countries behind one input instead of one actor per domain.
  • Every category attribute is kept in params, so bike frame size, car mileage or flat rooms survive into your sheet.
  • Monitor mode that can ignore bumps and refreshes, stops after one page on frequent runs, and delivers to a webhook or Telegram.
  • Paste the OLX search URL you already use instead of looking up numeric ids.
  • No OLX account, no cookies and no proxy configuration.
  • Coordinates and sellerType on every search row, not only on detail pages.

Limits

  • categoryId, cityId and regionId take OLX numeric ids. If you do not know them, use searchUrls instead.
  • Phone numbers are not included (OLX shows them only to logged-in users).
  • Search rows carry the short description OLX returns in search; use offerIds for full text.
  • OLX serves at most 1,000 listings per search. Split by category or price range to go deeper.

FAQ

Can I monitor new listings for a search? Yes. Save your input as a Task, set mode: monitor and schedule it. Pick monitorReport: new if you only want listings you have never seen, so bumped ads do not cost you anything.

Will a bumped or refreshed ad come back as new? No. With new or new_and_price a refresh is never returned or charged, and the history keeps every listing the Task has seen.

Which countries does OLX support here? Poland (olx.pl), Ukraine (olx.ua), Romania (olx.ro), Portugal (olx.pt), Bulgaria (olx.bg), Kazakhstan (olx.kz) and Uzbekistan (olx.uz). One run covers one country; run several Tasks to cover more.

Do I need an OLX login or a proxy? No. The actor reads OLX's public offers API directly, so there is nothing to configure and no account to risk.

Changelog

  • 0.3.1 (04.11.2026): early stop keeps reading 30 minutes below the previous run's newest listing to catch listings OLX shows late; a backlog deeper than maxPages no longer freezes early stop; pruning old history cannot make an old listing new again.
  • 0.3 (04.11.2026): the first run in new / new_and_price is a baseline and returns nothing; the early-stop point only moves after a complete run, so a wall or a maxPages cut no longer loses listings; in monitor mode maxItems caps returned rows, not rows read; phone numbers and e-mails are removed from private sellers' titles and descriptions; history is saved atomically every 20 rows and drops listings not refreshed for 60 days; searchUrls replace queries and fall back to the saved translation on a wall. Breaking for API callers: a run with categoryId, cityId or regionId and no queries no longer adds the old default keyword rower; it searches the whole category or location.
  • 0.2 (04.11.2026): searchUrls (paste an OLX search page URL), monitorReport (all, new_and_price, new), early stop in monitor mode, compact monitor history (old Tasks keep their history and are converted on their next run). changedFields now lists only price, currency, status and refreshedAt. sellerName and sellerId are now null for private sellers and kept for business sellers. Rows from URL searches carry searchUrl.
  • 0.1: initial release with 7 countries, filters, details and monitor mode.

If this actor saved you time, please leave a review on its Store page. It is the main way other buyers find it. Bug reports and field requests are welcome in the Issues tab.