OLX Property Scraper - Real Estate Listings & Prices
Pricing
from $2.64 / 1,000 property listings
OLX Property Scraper - Real Estate Listings & Prices
Scrape OLX real estate listings in seven countries: asking price, floor area, rooms, GPS, photos, the full description and the seller record. Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan and Uzbekistan, with a private-owner filter.
Pricing
from $2.64 / 1,000 property listings
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
OLX Property Scraper — Real Estate Listings, Prices & Sellers 🏘️
🏡 Seven OLX countries, one row shape — and the description is already in the row
Private-owner property leads, asking prices and GPS from Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan and Uzbekistan
OLX is where Central and Eastern European owners list property without an agent. That inventory never reaches the agency portals, and the people who want it — buyers' agents, lead-gen shops, valuation teams, market analysts — end up clicking through it by hand, one country and one city at a time.
This scraper takes a country, a property type and a place, and hands back clean rows: asking price, floor area, rooms, floor, district, GPS coordinates, every photo, the seller record and the complete listing description. Poland alone showed 98,171 private ads against 58,782 agency ones when that was measured. Test it on 25 listings free — no API key, no login, no proxy to configure.
🔎 What is the OLX Property Scraper — and when should you use it?
The OLX Property Scraper turns the public property sections of seven OLX country sites into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: property classifieds from Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan or Uzbekistan: asking price, floor or plot area, price per square metre, rooms, floor, city, district, GPS coordinates, every photo and the direct OLX link. The seller record comes with each row — private owner or agency, their profile, and how long the ad has been up. So does the complete listing description, in the same row and at the same price.
Use something else when: you want Poland's agency-portal inventory rather than its classifieds. Use Otodom Property Scraper for the Polish listings that agencies and developers publish through a portal, where OLX carries the owners who never hire one. Use CIAN Property Scraper for Russian-market property with its own metro and building data, which the OLX sites do not reach. This actor covers the seven OLX sites that share one row shape. OLX Brazil, India and South Africa run a different platform and are out of scope, and phone numbers are not returned — OLX keeps them behind a click, so each row says whether one is offered instead.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/olx-property-scraper
Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want property listings, prices and private-seller leads from OLX using the Apify Actor `sian.agency/olx-property-scraper`.Use it when I need: property classifieds from Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan or Uzbekistan: asking price, floor or plot area, price per square metre, rooms, floor, city, district, GPS coordinates, every photo and the direct OLX link. The seller record comes with each row — private owner or agency, their profile, and how long the ad has been up. So does the complete listing description, in the same row and at the same price.Don't use it when: you want Poland's agency-portal inventory rather than its classifieds — use otodom-property-scraper or cian-property-scraper instead.How to call it: set `country` to one of `pl`, `pt`, `ro`, `bg`, `ua`, `kz`, `uz` and pick a `propertyType` such as `apartments-sale`, `houses-rent` or `land`. Narrow it with `city`, `region`, `query`, `minPrice`, `maxPrice`, `minArea`, `maxArea` and `sellerType` (`private` or `business`), and order it with `sortBy`. Pass a `sellerId` to pull one agency's whole portfolio. To reuse a search you built on OLX itself, paste it into `searchUrls`; to refresh listings you already hold, set `operation` to `detail` and pass `listingUrls`.Start with this input:{"operation": "search","country": "pl","propertyType": "apartments-sale","city": "Warszawa","sellerType": "private","sortBy": "created_at:desc","maxResults": 200}Ask me which OLX country and property type they want, and whether they need private owners, agencies or both, then run the Actor and summarise the results as a table.
Things you can ask your agent for:
- Pull every privately listed flat for sale in Warszawa posted this week and rank them by price per square metre.
- Give me all the land listings in the Aveiro region of Portugal over 1,000 square metres, with their coordinates so I can map them.
- Track this Romanian agency's whole OLX portfolio weekly and tell me which listings dropped in price.
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/olx-property-scraper.md.
📋 Overview
Seven country sites, one row shape. The OLX Property Scraper turns the public property sections of the OLX network into rows you can sort, filter and load anywhere.
What you get:
- ✅ The description comes with the row: every search result already carries the full listing text, the attribute table, all photos, the coordinates and the seller record. There is no second charge to see what the ad actually says.
- 🌍 Seven markets, checked cell by cell: 63 country-by-property-type pairs, each one taken from the live site and then re-checked against the market it claims to cover. Nothing here is guessed, so a Romanian query never quietly returns Polish rows.
- 🎯 Private owners are filterable: one switch separates for-sale-by-owner listings from agencies and developers. Lead-gen buys one side of that line, competitive analysts buy the other.
- 🔗 Any filter OLX has, including the ones this form does not show: build the search on the site with rooms, floor, heating, furnished or building year, paste the address, and the run honours all of it.
- 💰 $3.00 per 1,000 listings with the description included. The two other OLX property actors on the Store charge $4.99 and $5.00 per 1,000, and the generalist ones bill the description again at $1.80–$5.00 per 1,000.
- 📍 Every row maps without geocoding: latitude and longitude come off the listing, along with city, district and region.
✨ Features
- 🔍 Property search: pick a country, a property type and a city, and page through the results
- 📄 Listing refresh: hand it OLX listing URLs or offer IDs and get the current price, status and expiry
- 🏠 Nine property types: apartments and houses for sale or rent, land, commercial, garages, rooms, or everything at once
- 🧑 Private-versus-agency filter: owners only, businesses only, or both
- 🆔 Seller portfolios: pass one seller ID and get that agency's entire live inventory
- 🎚️ Price and area bands: filter in the country's own currency and in square metres, applied by OLX before anything is billed
- 🏙️ City and region by name: type Warszawa, Porto, București, София or Київ — the spelling and the accents are resolved for you
- ↕️ Newest-first ordering: run it on a schedule and the top of the feed is everything posted since last time
- 🌐 Paste-a-URL mode: any OLX search address works, filters included
- 📊 HTML run report: a summary page in the key-value store with the counts, the failures and what they cost
🎬 Quick Start
Pick a country, pick a property type, press Start. Nothing else is required — the defaults return apartments for sale in Poland.
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~olx-property-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"country": "pl", "propertyType": "apartments-sale", "city": "Warszawa", "maxResults": 100}'
🚀 Getting Started (3 Simple Steps)
Step 1: Choose a market
Set OLX country site to Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan or Uzbekistan.
Step 2: Choose what you are after
Pick a Property type, then narrow it with a city, a price band, an area band or a keyword. Leave the rest empty to take the whole country feed.
Step 3: Press Start
Rows appear as they arrive. Export as CSV, JSON or Excel, or read them straight from the API.
That's it. In about a minute you'll have:
- Asking prices, floor areas and room counts as numbers you can sort
- Full listing descriptions and every photo URL
- GPS coordinates, seller records and the direct OLX link on every row
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| operation | string | No | search for listings, detail to refresh listings you already hold |
| country | string | No | pl, pt, ro, bg, ua, kz or uz |
| propertyType | string | No | all, apartments-sale, apartments-rent, houses-sale, houses-rent, land, commercial, garages, rooms |
| query | string | No | Free-text keyword, in the site's own language |
| city | string | No | City name as OLX spells it — Warszawa, Porto, București, София |
| region | string | No | Region, province or oblast name |
| minPrice / maxPrice | integer | No | Price band in the country's own currency |
| minArea / maxArea | integer | No | Floor or plot area band in square metres |
| sellerType | string | No | all, private or business |
| sellerId | string | No | Every property ad from one OLX seller |
| sortBy | string | No | created_at:desc, relevance:desc, filter_float_price:asc, filter_float_price:desc |
| maxResults | integer | No | Stop after this many listings (default 100) |
| searchUrls | array | No | Paste OLX search addresses instead of filling the form |
| listingUrls | array | No | OLX listing addresses or numeric offer IDs, for the detail operation |
Example — private owners, flats in Warsaw under 800,000 PLN:
{"operation": "search","country": "pl","propertyType": "apartments-sale","city": "Warszawa","maxPrice": 800000,"minArea": 35,"sellerType": "private","sortBy": "created_at:desc","maxResults": 500}
Example — refresh listings you already hold:
{"operation": "detail","listingUrls": ["https://www.olx.pl/d/oferta/mieszkanie-2-pokoje-IDZKhpP.html","633382509"]}
Example — paste a search you built on OLX, filters and all:
{"operation": "search","searchUrls": ["https://www.olx.pt/imoveis/apartamentos-casas-venda/lisboa/"],"maxResults": 300}
📤 Output
Every listing is one flat row, ready for Excel, a database or an AI agent.
| Field | Type | Description |
|---|---|---|
| offerId | number | OLX offer ID |
| listingTitle | string | Listing title |
| listingUrl | string | Direct link to the ad |
| price | number | Asking price as a number |
| priceLabel | string | Price as OLX displays it |
| currency | string | PLN, EUR, BGN, UAH, KZT or UZS |
| isNegotiable | boolean | Whether the seller marked the price negotiable |
| areaSqm | number | Floor or plot area in square metres |
| pricePerSqm | number | Price per square metre, where the ad states it |
| roomsLabel | string | Rooms, as the country records them |
| floorLabel | string | Floor, as the country records it |
| descriptionText | string | The complete listing description |
| city | string | City the property sits in |
| district | string | District or neighbourhood |
| region | string | Region, province or oblast |
| latitude | number | Latitude |
| longitude | number | Longitude |
| createdAt | string | When the ad was first posted (ISO 8601) |
| refreshedAt | string | When the seller last bumped it |
| validTo | string | When the ad expires |
| listingStatus | string | The ad's own state on OLX |
| isBusiness | boolean | Agency or developer, rather than a private owner |
| isPromoted | boolean | Whether OLX is promoting the ad |
| sellerId | number | Seller's OLX ID — reuse it to pull their whole portfolio |
| sellerName | string | Seller's display name |
| sellerCompany | string | Agency name, where there is one |
| sellerSince | string | When the seller joined OLX |
| sellerUrl | string | The seller's OLX profile |
| hasPhone | boolean | Whether the seller offers a phone number |
| imageUrl | string | First photo |
| imageUrls | array | Every photo, full size |
| imageCount | number | Number of photos |
| attributes | object | Every remaining attribute, exactly as the country records it |
| categoryId | number | OLX category the ad sits in |
| countryCode | string | Which OLX site the row came from |
Example:
{"offerId": 633382509,"listingTitle": "Terreno p/construção em Pedorido","listingUrl": "https://www.olx.pt/d/anuncio/terreno-p-construo-em-pedorido-IDGRBIW.html","price": 44000,"priceLabel": "44.000 €","currency": "EUR","isNegotiable": false,"areaSqm": 2180,"city": "Sobrado E Bairros","region": "Aveiro","latitude": 41.0417,"longitude": -8.2631,"createdAt": "2021-12-17T17:43:46+00:00","listingStatus": "active","isBusiness": true,"sellerName": "ImoBaptista","hasPhone": true,"imageCount": 9,"countryCode": "pt","sourcePropertyType": "land","status": "success"}
💼 Use Cases & Examples
1. For-sale-by-owner and landlord lead generation
Buyers' agents and lead-gen shops working the private side of a market.
Input: one city, one property type, seller type set to private, newest first. Output: the owner's own description, their asking price, the GPS point and their OLX profile. Use: call the seller before the listing is syndicated anywhere else. Poland showed 98,171 private property ads against 58,782 agency ones when it was measured.
2. Local price and yield research
Analysts and valuation teams pricing a district.
Input: a whole property type in one city, with a price band if you want the middle of the market. Output: price, area and price per square metre on every row, plus coordinates. Use: compare districts, or compare a district against the same one across the border, without geocoding anything first.
3. Agency and developer monitoring
Anyone who needs to know what a competitor is holding and at what price.
Input: a seller ID taken from an earlier run or from an OLX profile URL. Output: that seller's entire live portfolio, with how long each ad has been up and when it was last bumped. Use: run it weekly. What disappears is what sold; what changed price is what did not.
4. New-listing alerts on a schedule
Investors and relocation services who want the top of the feed, not the whole market.
Input: newest first, a few hundred rows, scheduled hourly or daily. Output: everything posted since the last run. Use: you pay for new inventory instead of re-downloading a market you already hold.
5. Cross-border market comparison
Funds and researchers comparing several markets at once.
Input: the same property type across several countries, one run each. Output: the identical row shape from Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan and Uzbekistan. Use: one schema, seven markets, no per-country parser to maintain.
6. Land and plot sourcing
Developers looking for buildable land outside the agency channel.
Input: the land property type, a region, a minimum plot area. Output: plot size, asking price, coordinates and the owner's description of access and services. Use: map every plot in a region in one pass, then filter it on the numbers.
🔗 Integration Examples
JavaScript/Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/olx-property-scraper').call({country: 'pl',propertyType: 'apartments-sale',city: 'Warszawa',sellerType: 'private',maxResults: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/olx-property-scraper').call(run_input={'country': 'ro','propertyType': 'apartments-rent','city': 'Bucuresti','maxResults': 200,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['listingTitle'], item['price'], item['areaSqm'])
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~olx-property-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"country": "pt", "propertyType": "houses-sale", "region": "Lisboa", "maxResults": 200}'
Automation Workflows (N8N / Zapier / Make)
- Trigger: a schedule — hourly for alerts, weekly for portfolio monitoring
- HTTP Request: start the run with newest-first ordering
- Process: filter on price, area or the business flag in your own workflow
- Action: append to a sheet, upsert into a CRM, or post the new listings to Slack
📊 Performance & Pricing
FREE Tier (Try It Now)
- 25 listings per run — every field, every country, every filter
- No credit card, no API key, no proxy
- Enough to check the columns against your own data before you commit
PAID Tier (Production Ready)
- Unlimited listings per run
- Pay per row returned, never for a failure
- Full descriptions, photos, GPS and seller records included in the row price
💰 $3.00 per 1,000 listings, description already in the row. The two other OLX property actors on the Store list at $4.99 and $5.00 per 1,000, and the generalist OLX actors add $1.80–$5.00 per 1,000 again for the description.
❓ Frequently Asked Questions
Q: Do I need an API key, a login or a proxy? A: No. Pick a country and a property type and press Start.
Q: Which countries are covered? A: Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan and Uzbekistan — the seven OLX sites that share one row shape. OLX Brazil, India and South Africa run a different platform and are not covered.
Q: How many listings can one search return? A: About 1,050. That is OLX's own paging ceiling, not a limit here. Split the search by city, price band or property type to go wider. The run still reports the true market total, so you always know how much of it you sampled.
Q: Does a search row include the full description, or do I pay twice for it? A: It is included. Every search row already carries the whole description, the attribute table, all photos, the coordinates and the seller record. There is no enrichment fee here.
Q: Then what is the Listing Detail operation for? A: Refreshing listings you already hold. Give it URLs or offer IDs from an earlier run or from your own CRM and it returns the current price, status and expiry for each.
Q: Can I paste an OLX search URL? A: Yes. Build the search on OLX with any filters you like — rooms, floor, furnished, heating, building year — and paste the address. Filters this form does not expose still work.
Q: Are seller phone numbers included? A: No. OLX keeps phone numbers behind a click, and several country sites flag them as protected. The output tells you whether a number is offered and gives you the seller profile. A phone column that could never populate would be worse than an honest gap.
Q: Why are some attribute names in Polish or Ukrainian? A: Because each country defines its own. The typed columns — price, area, rooms, floor — are normalised across all seven. Everything else is kept verbatim in the attributes object rather than mistranslated.
Q: What output formats are available? A: JSON, CSV, Excel, XML and RSS, straight from the dataset or the API.
🐛 Troubleshooting
A run returns one row saying nothing matched
- Widen the price or area band, or clear the keyword. A keyword is matched in the site's own language, so an English word will usually find nothing on olx.pl.
- Check the property type exists in that country. Portugal groups apartments and houses without a sale-versus-rent split, and Bulgaria has no separate rooms section. The run log says so when it happens.
"No OLX place matches …"
- Use the name as OLX spells it: Warszawa, not Warsaw. Porto, not Oporto. București or Bucuresti, not Bucharest.
- A few names sit at region level on their own site. Lisboa is a region on olx.pt rather than a city, so typing it searches the whole Lisboa region and the run log says so.
- If a city name exists twice in the country, add the region as well.
The run stops short of the number I asked for
- OLX refuses to page past its own ceiling, so a single search tops out near 1,050 rows. Split by city, price band or property type.
- On the free tier every run is capped at 25 rows.
A pasted search URL is rejected
- Copy the address from a results page, not from an individual ad. A listing address ends in
-ID….htmland belongs in the Listing Detail operation instead.
Fewer unique rows than pages fetched
- OLX repeats its promoted ads on every page. They are deduplicated before anything is saved or charged, so you are never billed twice for the same listing.
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
OLX is a trademark of OLX Global B.V. This actor is not affiliated with, endorsed by, or sponsored by OLX.
🤝 Support
Join our active support community
- For issues or questions, open an issue in the actor's repository
- Check SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools