# OLX Property Scraper - Real Estate Listings & Prices (`sian.agency/olx-property-scraper`) Actor

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.

- **URL**: https://apify.com/sian.agency/olx-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.64 / 1,000 property listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## OLX Property Scraper — Real Estate Listings, Prices & Sellers 🏘️

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Otodom Property Scraper](https://img.shields.io/badge/Store-Otodom%20Property%20Scraper-1AE392)](https://apify.com/sian.agency/otodom-property-scraper?fpr=sian) [![CIAN Property Scraper](https://img.shields.io/badge/Store-CIAN%20Property%20Scraper-0468FF)](https://apify.com/sian.agency/cian-property-scraper?fpr=sian) [![Idealista Scraper](https://img.shields.io/badge/Store-Idealista%20Scraper-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian)

#### 🏡 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](https://apify.com/sian.agency/otodom-property-scraper?fpr=sian) 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](https://apify.com/sian.agency/cian-property-scraper?fpr=sian) 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](https://mcp.apify.com)? 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](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — 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:

```text
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](https://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.

```bash
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:**

```json
{
  "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:**

```json
{
  "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:**

```json
{
  "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:**

```json
{
  "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

```javascript
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

```python
from apify_client import ApifyClient
client = 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

```bash
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)

1. **Trigger**: a schedule — hourly for alerts, weekly for portfolio monitoring
2. **HTTP Request**: start the run with newest-first ordering
3. **Process**: filter on price, area or the business flag in your own workflow
4. **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.

🔗 [View current pricing](https://apify.com/sian.agency/olx-property-scraper?fpr=sian)

***

### ❓ 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….html` and 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](https://blog.apify.com/is-web-scraping-legal/).

OLX is a trademark of OLX Global B.V. This actor is not affiliated with, endorsed by, or sponsored by OLX.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Property Listing returns listing rows for a country, property type and location; Listing Detail takes OLX listing URLs or offer IDs and returns the same full record for each.

## `country` (type: `string`):

Which OLX country site to search. Each country is a separate marketplace with its own listings, currency and language, so pick one per run and run again for the next. Poland, Portugal and Romania each carry over 150,000 live property ads.

## `propertyType` (type: `string`):

Which slice of the country's property section to take. Every option was checked against the live market in all seven countries. Two of them do not split the same way: Portugal groups apartments and houses without a sale-versus-rent split, and Bulgaria has no separate rooms section. Where that happens the nearest parent section is searched and the run log says so.

## `query` (type: `string`):

Optional free-text keyword, matched the way OLX's own search box matches it, in the site's language. Leave it empty to take the whole property type for the location.

## `city` (type: `string`):

City name in the country's own language and spelling — Warszawa, Kraków, Porto, București, София, Київ, Алматы. The name is resolved to OLX's own location at run time, so accents and case do not matter. A few names sit at region level on their own site (Lisboa is a region on olx.pt, not a city); those search the whole region and the run log says so. Leave it empty to search the whole country.

## `region` (type: `string`):

Region, province or oblast name — Mazowieckie, Lisboa, Cluj, Одеська. Use it on its own to cover a whole region, or together with a city to disambiguate a name that exists twice.

## `minPrice` (type: `integer`):

Lowest asking price to include, in the country's own currency (PLN, EUR, BGN, UAH, KZT, UZS). 0 means no lower bound.

## `maxPrice` (type: `integer`):

Highest asking price to include, in the country's own currency. 0 means no upper bound. For rentals this is the monthly rent, not the sale price.

## `minArea` (type: `integer`):

Smallest floor area in square metres. 0 means no lower bound. Land listings measure plot area with the same filter.

## `maxArea` (type: `integer`):

Largest floor area in square metres. 0 means no upper bound.

## `sellerType` (type: `string`):

Private owners are the for-sale-by-owner side of OLX and the reason most people scrape it; agencies and developers are the competitive-intelligence side. Poland alone showed 98,171 private and 58,782 business property ads when this was measured.

## `sellerId` (type: `string`):

Return every property ad from one OLX seller. Take the numeric id from the sellerId column of an earlier run, or from an OLX profile URL. It combines with the filters above, so you can also take just one agency's rentals in one city.

## `sortBy` (type: `string`):

Newest first is what you want on a schedule — the top of the feed is everything posted since your last run. Cheapest or most expensive first is how you take the tails of a market without paging through the middle.

## `maxResults` (type: `integer`):

Stop after this many listings. Rows arrive in pages of about 65, so the run finishes the page that crosses your limit and then stops. OLX itself caps any single search near 1,050 rows — to go wider, add a city, a price band or another property type.

## `searchUrls` (type: `array`):

Paste OLX search addresses instead of filling the fields above. Build the search on the site with whatever filters you like — rooms, floor, furnished, building year, heating — and paste the address bar. Filters this form does not expose still apply, because the address is read the way OLX reads it.

## `listingUrls` (type: `array`):

Used by the Listing Detail operation: OLX listing addresses such as https://www.olx.pl/d/oferta/...-ID1c1Lqa.html, or bare numeric offer IDs. This is how you refresh price and status on a list you already hold.

## Actor input object example

```json
{
  "operation": "search",
  "country": "pl",
  "propertyType": "apartments-sale",
  "query": "",
  "city": "Warszawa",
  "region": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "sellerType": "all",
  "sellerId": "",
  "sortBy": "created_at:desc",
  "maxResults": 100,
  "searchUrls": [],
  "listingUrls": []
}
```

# Actor output Schema

## `olxListings` (type: `string`):

Every listing this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "operation": "search",
    "country": "pl",
    "propertyType": "apartments-sale",
    "query": "",
    "city": "Warszawa",
    "region": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minArea": 0,
    "maxArea": 0,
    "sellerType": "all",
    "sellerId": "",
    "sortBy": "created_at:desc",
    "maxResults": 100,
    "searchUrls": [],
    "listingUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/olx-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "operation": "search",
    "country": "pl",
    "propertyType": "apartments-sale",
    "query": "",
    "city": "Warszawa",
    "region": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minArea": 0,
    "maxArea": 0,
    "sellerType": "all",
    "sellerId": "",
    "sortBy": "created_at:desc",
    "maxResults": 100,
    "searchUrls": [],
    "listingUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/olx-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "operation": "search",
  "country": "pl",
  "propertyType": "apartments-sale",
  "query": "",
  "city": "Warszawa",
  "region": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "sellerType": "all",
  "sellerId": "",
  "sortBy": "created_at:desc",
  "maxResults": 100,
  "searchUrls": [],
  "listingUrls": []
}' |
apify call sian.agency/olx-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/olx-property-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/nYX3qZMdHYoyUG0n6/builds/RHbf1r1jZsdsDdkre/openapi.json
