OLX Listings Scraper: Poland, Ukraine, Romania & More avatar

OLX Listings Scraper: Poland, Ukraine, Romania & More

Pricing

from $0.60 / 1,000 saved listings

Go to Apify Store
OLX Listings Scraper: Poland, Ukraine, Romania & More

OLX Listings Scraper: Poland, Ukraine, Romania & More

Scrape OLX listings from Poland, Ukraine, Kazakhstan, Portugal, Romania, Bulgaria and Uzbekistan by keyword, city, price or category URL. Price, params, dates, photos, seller type; only-new mode for monitoring.

Pricing

from $0.60 / 1,000 saved listings

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

OLX Listings Scraper collects public listings from OLX in Poland, Ukraine, Kazakhstan, Portugal, Romania, Bulgaria and Uzbekistan by keyword, city, price or a pasted OLX category URL, and returns one clean row per listing with price, location, category, parameters, dates, photos and seller type.

It is for resellers, price analysts, car dealers and real estate agents who watch OLX. The smallest run is one keyword: pl + iphone + 20 listings finishes in a few seconds.

OLX Listings Scraper: search OLX by keyword, city and price in 7 countries, get listings with price, params and photos, export JSON or CSV, or get only new listings

Table of contents

What it does

The Actor runs OLX searches for you and saves every listing it finds to a Dataset. You can search in two ways:

  • Keywords (queries): one OLX search per keyword on the site you choose in country. You can limit keyword searches by city.
  • OLX URLs (categoryUrls): paste any OLX results page. The category, city and filters from the page are kept.

priceMin, priceMax and sortBy apply to all searches. Each row has the listing price and currency, city and region, category path, listing parameters (for example model, year, mileage, area, rooms), created and refreshed dates, photo URLs and seller type (private or business).

Supported OLX sites: olx.pl, olx.ua, olx.kz, olx.pt, olx.ro, olx.bg, olx.uz. All sites use the same output fields, so you can compare markets in one table.

Good fit

  • Track prices of used phones, laptops or cars in one or more countries.
  • Build a list of apartments or cars in one city with price, area, year and mileage.
  • Watch a search on a schedule and get only listings that appeared since the last run.

Not a fit / limits

  • OLX Brazil (olx.com.br), OLX India and other non-listed OLX sites are not supported.
  • No phone numbers, e-mails or names of private sellers. The Actor does not log in and does not open single listing pages.
  • OLX shows at most about 1,000 listings per search. To get more, split the search by city, category or price range.

Quick start

  1. Open the Input tab.
  2. Keep Country = pl and Search keywords = iphone (the form prefill), or add your own keyword.
  3. Keep Max listings per search = 20 (prefill) for a first test.
  4. Click Start.
  5. Open the Output tab → Listings and check title, price and city.

Expected result: 20 OLX listings from olx.pl, newest first, in a few seconds.

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
countryCountry (OLX site)stringnodefault plpl, ua, kz, pt, ro, bg, uzSite for keyword searches. URLs always use their own site.uaChoose the market you watch.
queriesSearch keywordsarray of stringsone of queries / categoryUrlsprefill ["iphone"]up to 50 keywords and URLs togetherOne OLX search per keyword.["bmw x5", "audi a6"]Use the words buyers type on OLX in the local language.
categoryUrlsOLX category or search URLsarray of stringsone of queries / categoryUrlsemptyup to 10 OLX results pages on the 7 supported sitesOne search per URL; category, city and page filters are kept.["https://www.olx.pl/motoryzacja/samochody/bmw/warszawa/"]Best for categories (cars, apartments) and complex filters. Single listing pages are rejected.
cityCitystringnoempty = whole countrycity or region slug from the OLX address bar, up to 100 charactersLimits keyword searches to one city or region. Not used for URLs.warszawa, kiev, alma-ataCopy the slug from an OLX URL. Accents are removed (Kraków → krakow).
priceMinMinimum priceintegernoempty≥ 0, in the site currencyLowest price for all searches and URLs.500Must not be higher than priceMax.
priceMaxMaximum priceintegernoempty≥ 0, in the site currencyHighest price for all searches and URLs.3000Use it to skip fake very high prices.
sortBySort bystringnodefault newestnewest, relevance, price_asc, price_descOrder of results.price_ascKeep newest for monitoring and onlyNew.
maxItemsMax listings per searchintegernodefault 100, prefill 201–1000Each keyword or URL stops after this many listings.200You pay per saved listing, so set what you need.
onlyNewOnly new listings since the last runbooleannodefault falsetrue / falseReturns only listings not returned before for the same search.trueTurn on for scheduled runs.
includeDescriptionInclude description textbooleannodefault truetrue / falseAdds the full description as plain text.falseTurn off for smaller output.
includePromotedInclude promoted listingsbooleannodefault truetrue / falsefalse skips paid (promoted and TOP) listings.falseTurn off when you want only organic results.

Empty input: if both queries and categoryUrls are empty, the run fails at once with an input error and only the start event is charged. Repeated keywords (iphone and IPHONE) run as one search. A listing found by two searches in the same run is saved and charged once.

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
Both are filledqueriescategoryUrlsBoth run. Each keyword and each URL is a separate search.1 keyword + 2 URLs = 3 searchesUp to maxItems rows for each search.
A URL is usedcategoryUrlscountry, cityThe URL keeps its own site and city. country and city apply only to keywords.olx.ua URL with country: plURL rows have country: ua.
A price filter is setpriceMin / priceMaxcategoryUrlsThe price filter is added to every URL too.URL + priceMax: 3000Fewer rows, same request count per page.
priceMin > priceMaxpriceMinpriceMaxInput error, the run stops before any request.2000 / 100Only the start event.
MonitoringonlyNewsortByWorks best with newest; the Actor stops a search when it reaches listings older than the last run.onlyNew: trueUnchanged runs save 0 rows.
Paid listingsincludePromotedmaxItemsWhen false, paid listings are skipped and do not count toward maxItems.false, maxItems: 2020 organic rows.

Input examples

Phones in one city, price range

{
"country": "pl",
"queries": ["iphone 15"],
"city": "warszawa",
"priceMin": 1500,
"priceMax": 3000,
"maxItems": 200
}

Expected behavior: one OLX search on olx.pl in Warsaw, newest first. Expected output: up to 200 listings with title, price, currency, params, postedAt. Limit or cost note: you pay for each saved listing; the run stops at 200.

Apartments from an OLX category URL, scheduled

{
"categoryUrls": ["https://www.olx.ua/uk/nedvizhimost/kvartiry/kiev/"],
"onlyNew": true,
"maxItems": 250
}

Expected behavior: the first run returns current listings; next runs return only new ones. Expected output: apartments with price, params (area, rooms, floor), district, postedAt. Limit or cost note: an unchanged scheduled run saves 0 rows and costs only the start event.

Output

Each row is one OLX listing. The default view Listings shows title, price, currency, negotiable, city, region, categoryPath, sellerType, postedAt, refreshedAt, isPromoted, url. Export the Dataset as JSON, CSV, Excel or other Apify formats.

Output example

A real row from the prefill run (pl, iphone, 20 listings), trimmed: the description is shortened, only one photo and one detailed parameter are shown, sellerId is removed.

{
"id": 1009568339,
"url": "https://www.olx.pl/d/oferta/szklo-hartowane-na-obiektyw-3mk-apple-iphone-15-plus-CID99-ID16k2Qj.html",
"title": "Szkło hartowane na obiektyw 3MK Apple iPhone 15 Plus",
"description": "Lens Protection Pro to szkło ochronne na obiektyw aparatu iPhone'a, które odznacza się naj…",
"price": 25,
"priceLabel": "25 zł",
"currency": "PLN",
"priceType": "price",
"negotiable": false,
"previousPrice": null,
"priceConverted": null,
"convertedCurrency": null,
"city": "Kraków",
"cityId": 8959,
"district": "Mistrzejowice",
"region": "Małopolskie",
"regionId": 4,
"latitude": 50.09557,
"longitude": 20.00366,
"locationRadiusKm": 7,
"categoryId": 2911,
"category": "Folie i szkła ochronne",
"categoryPath": "Elektronika > Telefony > Akcesoria > Folie i szkła ochronne",
"categoryType": "electronics",
"params": { "state": "Nowe", "type": "Szkło hartowane" },
"paramsDetailed": [{ "key": "state", "name": "Stan", "value": "Nowe", "valueKey": "new" }],
"postedAt": "2025-06-21T16:36:04+02:00",
"refreshedAt": "2026-10-14T16:23:01+02:00",
"pushedUpAt": null,
"validTo": "2026-11-13T15:36:05+01:00",
"photos": ["https://ireland.apollo.olxcdn.com/v1/files/tz6bc091m3xh2-PL/image;s=750x1000"],
"photoCount": 1,
"sellerType": "private",
"sellerName": null,
"sellerSince": "2016-01-24T18:22:06+01:00",
"isPromoted": false,
"isHighlighted": false,
"isUrgent": false,
"hasDelivery": true,
"offerType": "offer",
"status": "active",
"country": "pl",
"domain": "www.olx.pl",
"search": "iphone",
"searchUrl": "https://www.olx.pl/api/v1/offers/?offset=0&limit=40&query=iphone&sort_by=created_at%3Adesc",
"position": 4,
"isNew": null,
"source": "olx",
"fetchedAt": "2026-10-14T14:26:33.531Z"
}

null means OLX did not give this value. It never means zero: a listing for exchange has price: null, and only a free listing has price: 0.

Output fields

FieldMeaningTypeCan be empty?Example / enumSource / notes
idOLX listing idintegerno1009568339OLX
urlListing pagestringnohttps://www.olx.pl/d/oferta/…OLX
titleListing titlestringyesiPhone 15 128GBOLX
descriptionFull description, plain textstringyes: includeDescription: falseHTML removed
priceAsking price in currencynumberyes: exchange or no price25; 0 = freeOLX
priceLabelPrice as OLX shows itstringyes25 zł, Za darmoOLX
currencyPrice currencystringyes, when price is nullPLN, UAH, KZT, EUR, RON, BGN, UZS, USDOLX
priceTypeKind of pricestringyesprice, arranged, free, exchangeOLX
negotiableSeller marked the price as negotiablebooleanyestrueOLX
previousPriceEarlier price after a price dropnumberyes2899OLX
priceConverted, convertedCurrencySecond price OLX shows (some sites)number, stringyes1250, USDOLX
city, cityIdCity name and idstring, integeryesKraków, 8959OLX
districtDistrict, if givenstringyesMistrzejowiceOLX
region, regionIdRegion (voivodeship, oblast)string, integeryesMałopolskie, 4OLX
latitude, longitude, locationRadiusKmApproximate point and its blur radiusnumberyes50.09, 20.00, 7OLX blurs the point
category, categoryIdLeaf category name and idstring, integeryesFolie i szkła ochronneOLX
categoryPathFull category pathstringyesElektronika > Telefony > …OLX category tree
categoryTypeOLX verticalstringyesgoods, automotive, real_estate, electronics, jobOLX
paramsParameters as key → valueobjectno, can be {}{"year": "2018", "milage": "120 000 km"}OLX, trimmed
paramsDetailedParameters with display name and value keyarrayno, can be [][{"key":"state","name":"Stan",…}]OLX
postedAtWhen the listing was createdstring (ISO 8601)yes2025-06-21T16:36:04+02:00OLX
refreshedAtLast refresh or bumpstringyes2026-10-14T16:23:01+02:00OLX
pushedUpAtLast paid push-upstringyesnullOLX
validToWhen the listing expiresstringyes2026-11-13T15:36:05+01:00OLX
photos, photoCountPhoto URLs and countarray, integerno, can be [] / 0OLX CDN
sellerTypePrivate person or businessstringyesprivate, businessOLX
sellerIdOLX seller id, to group by sellerintegeryesOLX
sellerNameBusiness seller namestringyes: always null for private sellersprivacy rule
sellerSinceWhen the seller account was createdstringyesOLX
isPromotedPaid listing (promoted slot or TOP ad)booleannofalseOLX
isHighlighted, isUrgentPaid highlight and urgent flagsbooleanyesfalseOLX
hasDeliveryOLX delivery is availablebooleanyestrueOLX
offerType, statusOLX offer type and statusstringyesoffer, activeOLX
country, domainOLX site of the rowstringnopl, www.olx.plActor
searchKeyword (with city) or URL that found the rowstringnoiphoneActor
searchUrlExact OLX results requeststringnoActor
positionPosition in its search in this runintegerno4Actor
isNewtrue in onlyNew mode, otherwise nullbooleanyesnullActor
sourceAlways olxstringnoolxActor
fetchedAtWhen the row was fetched (UTC)stringno2026-10-14T14:26:33.531ZActor

Output entities and surfaces

SituationWhereResult shapeUser action
Normal listingDataset, view Listingsone row per listingopen, export or use by API
No listings foundDataset is empty; RUN_SUMMARY search status no_resultsrun SUCCEEDEDcheck keyword, city or price filter
Unknown city or OLX URLRUN_SUMMARY search status not_foundother searches still runfix the city slug or URL
Stopped early (cost limit, time limit)Dataset has the saved rows; RUN_SUMMARY.status = PARTIAL with reasonrun SUCCEEDEDraise the limit and run again
OLX error or blockRUN_SUMMARY search status error, errorCoderows saved before the error stayretry later

RUN_SUMMARY (in the run's key-value store) has the run status (COMPLETE, PARTIAL, NO_RESULTS, NOT_FOUND, ERROR, INVALID_INPUT, CANCELLED), reason, counts, and one entry per search with status (complete, partial, no_results, not_found, error, skipped), listings, promoted, totalAvailable and skippedAsSeen.

Pricing and limits

Pricing unit

This Actor uses pay-per-event pricing. You pay for:

EventPriceWhen
Actor start$0.01once per run (one event per GB of memory, minimum one; runs use 256 MB by default, so one event)
Saved listing$0.0007 (Free plan), $0.00066 (Bronze), $0.00063 (Silver), $0.0006 (Gold and higher)for each listing saved to the Dataset

That is $0.70 per 1,000 listings on the Free plan, plus $0.01 per run. Platform usage (compute, storage) is included; you do not pay it separately.

  • A run with no listings (no results, filter with no match, unchanged onlyNew run, input error) costs only the start event: $0.01.
  • Listings that are skipped (onlyNew already seen, includePromoted: false, duplicates in one run) are not charged.
  • If you set a maximum cost for the run, the Actor stops when the next listing does not fit. The run still ends SUCCEEDED, with RUN_SUMMARY.status = PARTIAL and reason = CHARGE_LIMIT. Saved listings stay.

Cost examples

Free plan prices. Times are from real test runs.

ScenarioInput scopeListingsStartListings chargeTotalTime
First testpl, iphone, maxItems: 2020$0.01$0.014$0.0242–9 s
One city1 keyword, maxItems: 250250$0.01$0.175$0.185~8 s
Large5 searches × 1,0005,000$0.01$3.50$3.5183–143 s
Nothing found50 keywords with no results0$0.01$0$0.01~21 s
Unchanged monitoringonlyNew, no new listings0$0.01$0$0.01~3 s

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Resell phones and electronicsqueries, priceMaxlistingprice, params, postedAt, urlGoogle Sheets or CSV
Car market analysiscategoryUrls (cars category)listingprice, params (year, mileage, fuel), cityBI tool via API
Real estate in one citycategoryUrls or queries + citylistingprice, params (area, rooms), district, latitudemap or spreadsheet
Price comparison across countriessame keyword, different countrylistingprice, currency, countryDataset export
New listing alertsonlyNew on a schedulenew listingtitle, price, url, isNewwebhook, Slack or e-mail

Monitoring: only new listings

Turn on onlyNew and run the same input on an Apify schedule.

  • The first run returns current listings and remembers them.
  • Next runs return only listings that were created after the last run and were not returned before. They have isNew: true.
  • When nothing changed, the run saves 0 rows and RUN_SUMMARY.status is NO_RESULTS.
  • Memory is kept per search in your account, in the key-value store olx-listings-scraper-state. Change the input and the Actor starts a new memory for the new search.

API and integrations

  • API: start the Actor with the same JSON input as in the examples, then read the Dataset items. Use ?view=overview for the Listings columns.
  • Export: JSON, CSV, Excel, XML and other formats from the Dataset.
  • Scheduling: create an Apify schedule with onlyNew: true for monitoring.
  • Webhooks / no-code: use Apify integrations (Make, Zapier, Google Sheets, Slack) to send new rows on run finish.

Use with AI agents (MCP)

  • MCP server URL with only this Actor: https://mcp.apify.com?tools=cliqtomedia/olx-listings-scraper
  • Smallest useful input:
{ "country": "pl", "queries": ["iphone"], "maxItems": 20 }
  • Key output fields: title (listing title), price and currency (asking price; null = no numeric price), city (location), postedAt (created time), url (listing page).
  • A run with 20 listings takes a few seconds and costs $0.024 on the Free plan. Keep maxItems small; OLX gives at most about 1,000 listings per search.

Limits and partial results

  • At most about 1,000 listings per search (OLX limit). RUN_SUMMARY.searches[].totalAvailable shows how many OLX reports.
  • Up to 50 keywords and URLs per run, of them at most 10 URLs (each URL search first loads the OLX page to read its filters). 5 searches × 1,000 listings (5,000 rows) were tested in one run.
  • The run stops new requests shortly before its timeout and keeps saved rows (PARTIAL, TIME_LIMIT). The default timeout is 300 s; raise it for large runs.
  • Search relevance is OLX's own: a keyword can return related items (for example cases and glass for iphone). Use priceMin or a category URL to narrow.
  • OLX blurs coordinates: latitude and longitude are approximate.

Troubleshooting

The search returns 0 listings

Symptom: the Dataset is empty, search status no_results. Likely reason: the keyword, city or price filter matches nothing on this site. Check: open the same search on OLX in a browser. Action: try a shorter keyword, remove city or widen the price range.

Search status not_found

Symptom: one search has not_found; the others work. Likely reason: the city slug or the OLX URL does not exist on this site (for example almaty instead of alma-ata). Check: copy the city slug from an OLX URL. Action: fix the slug or URL and run again.

Run is PARTIAL with reason CHARGE_LIMIT

Symptom: fewer rows than maxItems. Likely reason: the maximum cost of the run was reached. Action: raise the maximum cost in run options, or lower maxItems.

Search status error

Symptom: errorCode such as BLOCKED, RATE_LIMITED or SOURCE_UNAVAILABLE. Likely reason: OLX did not answer or limited requests. This is not an empty result. Action: run again later. Rows saved before the error stay in the Dataset.

FAQ

Do I need an OLX account or proxy?

No. The Actor reads public OLX search results without login. If a request is blocked, it retries through Apify Proxy, which is included in the price.

Why is price null for some listings?

The listing has no numeric price: it is for exchange (priceType: exchange) or the seller did not give a price. Free listings have price: 0.

Does it collect phone numbers or seller names?

No. Phone numbers and e-mails are not collected. sellerName is filled only for business sellers; for private sellers it is always null.

Are the results complete and fresh?

Each row is what OLX showed at fetchedAt. OLX limits a search to about 1,000 listings, and paid listings can appear in several places. The Actor saves each listing once per run.

Can I search OLX Brazil or India?

No. Only olx.pl, olx.ua, olx.kz, olx.pt, olx.ro, olx.bg and olx.uz are supported.

Support

For a bug, question or feature request, open an issue on the Issues tab of this Actor. Include the run ID, the input (keywords, country, URLs) and the status message. Never send tokens or account data.