# Otodom.pl Property Scraper - Poland Real Estate Listings (`confidential_gnat/otodom-property-scraper`) Actor

Scrapes property listings from Otodom.pl: price, price per m², area, rooms, floor, address, GPS, photos, description, building details, agency and agent phone numbers. Search flats, houses, plots, rooms and commercial property for sale or rent by location, search URL or listing URL.

- **URL**: https://apify.com/confidential_gnat/otodom-property-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Otodom.pl Property Scraper - Poland Real Estate Listings

**Scrape property listings from Otodom.pl (otodom.pl)**, Poland's largest real estate portal: price, price per m², area, rooms, floor, full address with GPS coordinates, photos, floor plans, description, building details, agency and **agent phone numbers**. Search flats, houses, plots, rooms and commercial property for sale or rent by location and filters, or just paste an Otodom search URL and press Start. Repeat runs **skip listings you already scraped**, so daily monitoring of new Otodom listings costs only the new ones. Export the **Otodom real estate data** as JSON, CSV or Excel, or call the scraper as an **API**.

**Target website:** [otodom.pl](https://www.otodom.pl)

### ✨ Features of this Otodom property scraper

- **Property listing extraction** — price, price per m², monthly fee, living and plot area, rooms, floor, building year, type, material, condition, heating, ownership, availability date, location down to the neighbourhood, GPS, photos, floor plans, videos and features.
- **Nearby places (Okolica)** — the 3 nearest places in each category within 5 km (transport, shops, food and drink, schools, health, green areas, sport, culture, services, pets), with distance in metres and walking time in minutes.
- **Agent and owner contacts** — contact name, agency or developer name, agency page and phone numbers from each listing page.
- **Pagination support** — follows search result pages until your Max items limit is reached.
- **Location, price, area, rooms, market, advertiser type, build year and date filtering** — type a city or district (for example Kraków or Mokotów) and the scraper finds it on Otodom for you; or use any search URL with filters set on the site.
- **New listings only (cache)** — a cache project name skips Otodom listings you already scraped on earlier runs, so scheduled runs fetch and pay for new listings only.
- **Proxy support** — residential Apify Proxy is prefilled in the input form, because Otodom blocks many requests on the Apify platform without one.
- **No browser required** — the scraper works over plain HTTP, so runs are fast and cheap (hundreds of listings per minute).

### 🚀 How to scrape Otodom listings in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a location, a search URL or a listing URL).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing

This actor uses **pay-per-result** billing: you pay for each listing saved to the dataset, plus the small compute cost of the run.

- New Apify accounts include **$5 of free monthly credit**.
- It needs no browser, so it costs significantly less to run than browser-based scrapers.
- Residential proxy is prefilled because Otodom blocks many unproxied requests on the platform; its traffic is billed by Apify on top of the results. Remove it only if your runs succeed without it.
- Set a **Cache project name** on scheduled runs: listings you already scraped are skipped and not charged (see below).
- Turn off **Scrape listing details** for the cheapest runs (one request per 72 listings).

### 🔧 Input configuration

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| `startUrls` | array | — | `[]` (prefilled with a Warsaw flats search) | Otodom search results URLs (any filters set on the site) or single listing URLs. When set, the filter fields are ignored unless Locations is also filled. |
| `locations` | array | — | `[]` | Cities, districts or regions, e.g. Warszawa, Kraków, Mokotów. Each is searched separately. Empty = all of Poland. |
| `transaction` | string | — | `sale` | `sale` or `rent`. |
| `propertyType` | string | — | `flat` | `flat`, `house`, `room`, `plot`, `commercial`, `warehouse`, `garage`. |
| `market` | string | — | `all` | `all`, `primary` (new builds), `secondary` (resale). |
| `priceMin` / `priceMax` | integer | — | — | Total price in PLN, or monthly rent for rentals. |
| `areaMin` / `areaMax` | integer | — | — | Living area in m². |
| `rooms` | array | — | `[]` | Room counts to include, `"1"` to `"10"`. |
| `ownerType` | string | — | `all` | `all`, `private`, `agency`, `developer` (agency/developer filter sale searches only). |
| `buildYearMin` / `buildYearMax` | integer | — | — | Year of construction range. |
| `daysSinceCreated` | string | — | — | Only listings added in the last 1, 3, 7, 14, 30 or 90 days. |
| `sort` | string | — | `default` | `default`, `newest`, `priceAsc`, `priceDesc`, `areaAsc`, `areaDesc`. |
| `scrapeDetails` | boolean | — | `true` | Open each listing for phones, full description, GPS, all photos and building details. |
| `scrapeNearbyPlaces` | boolean | — | `true` | Add the nearest places per category with distance and walking time (one extra request per listing, only with listing details). Turn off for faster, cheaper runs. |
| `maxItems` | integer | — | `5` | Maximum unique listings per location or search URL. |
| `cacheProjectName` | string | — | — | Same name on each scheduled run = only new listings (marked `changeType: new`). |
| `maxConcurrency` | integer | — | `5` | Maximum parallel requests. |
| `proxyConfiguration` | object | — | residential Apify Proxy (prefill) | Apify Proxy settings. Residential is prefilled because Otodom blocks many unproxied requests on the platform. |

In the Console, locations, transaction, property type, market, price, area, rooms, owner type, build year, listing age and sorting sit in the collapsible **Search filters and more options** section. The optional proxy setting is in its own **Proxy** section at the bottom.

**How the cache saves money:**

With **Scrape listing details** on, every listing costs one extra detail request on top of the search request. Without a cache, a daily run over the same search opens the same Otodom listing pages again and pays for each result every time. With a **Cache project name**:

- The actor remembers every listing it has saved in a key-value store named after your project, and keeps it between runs.
- Each run still reads the search result pages, which are cheap and hold 72 listings each. Listings already in the cache are dropped right there, before a detail page is requested.
- Skipped listings cost no detail request and no result charge, and they do not count towards **Max items per search**. The limit is spent only on new listings.
- A listing URL you paste is skipped too if it is already cached, but the actor must open it once to read its ID, so only the result charge is saved there.

For example, a search with 2,000 matching flats that gets 40 new listings a day pays for 40 results and 40 detail pages on day 2 instead of 2,000 of each, which makes daily Otodom price and new-listing monitoring cheap.

Use a different project name for each search you track, because each name has its own memory. Pick a new name to start from scratch. A cached listing is not scraped again, so later price changes on it are not picked up.

**Supported URL types:**

- Search results: `https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa?priceMax=800000`
- Listing: `https://www.otodom.pl/pl/oferta/<title>-ID4CNxi`
- Development (investment): `https://www.otodom.pl/pl/inwestycja/<title>-ID4Ckte`
- English listing URLs (`/en/ad/...`, `/en/investment/...`) are accepted too.

### 📦 Otodom scraper output data

Each listing is one JSON record with these fields: `id`, `url`, `title`, `transaction`, `estate`, `market`, `price`, `currency`, `pricePerM2`, `priceFromPerM2`, `monthlyFee`, `areaM2`, `plotAreaM2`, `rooms`, `floor`, `totalFloors`, `buildYear`, `buildingType`, `buildingMaterial`, `condition`, `heating`, `ownership`, `availableFrom`, `street`, `residential`, `district`, `city`, `voivodeship`, `latitude`, `longitude`, `images`, `imageCount`, `floorPlans`, `videoUrl`, `virtualTourUrl`, `description`, `features`, `sellerType`, `agencyName`, `agencyId`, `agencyUrl`, `contactName`, `phones`, `isPrivateOwner`, `isExclusive`, `isPromoted`, `developmentTitle`, `developmentUrl`, `investmentState`, `investmentUnits`, `investmentDelivery`, `status`, `createdAt`, `modifiedAt`, `pushedUpAt`, `nearbyPlaces`, `scrapedAt` (and `changeType` when a cache project is used). Missing values are `null`. `nearbyPlaces` is a list of categories, each with its nearest places, for example `{ "category": "transportation", "places": [{ "type": "tram_stop", "name": "Plac Zawiszy 14", "distanceM": 166, "walkingMinutes": 3 }] }`; it is `null` when details or nearby places are turned off. Places the site shows without a name (for example playgrounds or bus stops) have `name: null` and are identified by `type`.

The dataset has 1 view: **Overview**, a compact table with the price, size, location, advertiser and contact phones of each listing.

**Output at a glance:**

| Listing | Price (PLN) | PLN/m² | m² | Rooms | District | Advertiser |
| ------- | ----------- | ------ | -- | ----- | -------- | ---------- |
| [Biały kruk, 125 m2 i ogród](https://www.otodom.pl/pl/oferta/bialy-kruk-125-m2-i-ogrod-150-m2-ID4Dyd5) | 7,900,000 | 63,200 | 125 | 4 | Mokotów | En Casa Premium Real Estate |
| [Nowe M2 + komfort na co dzień](https://www.otodom.pl/pl/oferta/nowe-m2-komfort-na-co-dzien-standard-premium-umow-dni-otwarte-ID4Dyd0) | 841,800 | 21,585 | 39 | 2 | Praga-Północ | Biuro Sprzedaży Nowych Mieszkań |
| [Duży taras 12 m2, gotowe do odbioru](https://www.otodom.pl/pl/oferta/duzy-taras-12-m2-gotowe-do-odbioru-top-lokalizacja-ID4DycX) | 792,720 | 21,396 | 37.05 | 2 | Mokotów | Platforma Mieszkaniowa |
| [2-pokojowe mieszkanie 43m2 + loggia](https://www.otodom.pl/pl/oferta/2-pokojowe-mieszkanie-43m2-loggia-bezposrednio-ID4xRcE) | 696,435 | 15,929 | 43.72 | 2 | Ursus | Ronson Development |
| [Apartamenty Grzybowska 11](https://www.otodom.pl/pl/inwestycja/apartamenty-grzybowska-11-ID4CjLz) | — | — | — | — | Śródmieście | Dom Development S.A. |

**Sample output (raw JSON):**

```json
{
    "id": "68531643",
    "url": "https://www.otodom.pl/pl/oferta/bialy-kruk-125-m2-i-ogrod-150-m2-ID4Dyd5",
    "title": "Biały kruk | 125 m2 i ogród 150 m2",
    "transaction": "SELL",
    "estate": "FLAT",
    "market": "SECONDARY",
    "price": 7900000,
    "currency": "PLN",
    "pricePerM2": 63200,
    "priceFromPerM2": null,
    "monthlyFee": 3000,
    "areaM2": 125,
    "plotAreaM2": null,
    "rooms": 4,
    "floor": "0",
    "totalFloors": 2,
    "buildYear": 2015,
    "buildingType": "apartment",
    "buildingMaterial": "other",
    "condition": "ready_to_use",
    "heating": "urban",
    "ownership": "full_ownership",
    "availableFrom": "2026-08-31",
    "street": "Park Morskie Oko",
    "residential": "Sielce",
    "district": "Mokotów",
    "city": "Warszawa",
    "voivodeship": "mazowieckie",
    "latitude": 52.20707,
    "longitude": 21.027126,
    "images": [
        "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6IjFqMDZweTU4NnQwZDMtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.gnA3ruLnv0vMWm6XXKqYSzvWumCwBhGo71-muqzRgHY/image;s=2048x1536;q=80",
        "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6InJvc3h1MWgybmMwczEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.GDtG9fVKf0yGTV_xFi86RHC5u_gkqkEqjvNSntxAgWc/image;s=2048x1536;q=80"
    ],
    "imageCount": 16,
    "floorPlans": [
        "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6IjZobGg1bjNhbHQ5ajEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.fnhbRM7C0DhhTP6RY4JR_fxzDZ6Vr7F_U7uFQ-6vq6w/image",
        "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Inc1N243aTlvM3A1cy1FQ09TWVNURU0iLCJ3IjpbeyJmbiI6ImVudmZxcWUxYXk0azEtQVBMIiwicyI6IjE2IiwiYSI6IjAiLCJwIjoiMTAsLTEwIn1dfQ.dnIz_XEvTav_ti3YwQVwXErPBtbtGWEUBUaXfgIam4A/image"
    ],
    "videoUrl": "https://www.youtube.com/embed/U9_19_buFUQ",
    "virtualTourUrl": null,
    "description": "Unikat na warszawskim rynku\nTOP Apartament premium z prywatnym ogrodem w Parku Morskie Oko | 4 pokoje | 125 m² | 2 miejsca parkingowe\n:: Dla kogo?\nNieruchomość dedykowana wymagającym klientom – zarówno parom, jak i rodzinom (2+1, 2+2), poszukującym komfortowej przestrzeni w prestiżowej i kameralnej ...",
    "features": ["furniture", "garden", "garage", "air_conditioning", "lift", "basement"],
    "sellerType": "agency",
    "agencyName": "En Casa Premium Real Estate",
    "agencyId": "816875",
    "agencyUrl": "https://www.otodom.pl/pl/firmy/biura-nieruchomosci/en-casa-premium-real-estate-ID816875",
    "contactName": "Michał Szczepkowski",
    "phones": ["+48664000231", "+48600830123"],
    "isPrivateOwner": false,
    "isExclusive": false,
    "isPromoted": false,
    "developmentTitle": null,
    "developmentUrl": null,
    "investmentState": null,
    "investmentUnits": null,
    "investmentDelivery": null,
    "status": "active",
    "createdAt": "2026-10-15T13:40:58Z",
    "modifiedAt": "2026-10-15T13:41:17Z",
    "pushedUpAt": null,
    "nearbyPlaces": [
        {
            "category": "transportation",
            "places": [
                { "type": "bus_stop", "name": null, "distanceM": 148, "walkingMinutes": 2 },
                { "type": "bus_stop", "name": "Plac Zawiszy 10", "distanceM": 148, "walkingMinutes": 2 },
                { "type": "tram_stop", "name": "Plac Zawiszy 14", "distanceM": 166, "walkingMinutes": 3 }
            ]
        }
    ],
    "scrapedAt": "2026-10-15T13:43:48.743Z"
}
```

### 🐍 How to scrape Otodom with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/otodom-property-scraper").call(run_input={
    "locations": ["Kraków"],
    "transaction": "rent",
    "propertyType": "flat",
    "maxItems": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/otodom-property-scraper').call({
    locations: ['Kraków'],
    transaction: 'rent',
    propertyType: 'flat',
    maxItems: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~otodom-property-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Kraków"], "transaction": "rent", "propertyType": "flat", "maxItems": 50}'
```

### 💡 What you can use Otodom real estate data for

- Track asking prices and price per m² by city, district or neighbourhood in Poland.
- Build rental yield models by combining sale and rent listings for the same area.
- Find new listings every day for buyers, renters or investors with a scheduled cached run.
- Generate leads of real-estate agencies and developers with their phone numbers and listing volume.
- Map supply of new developments (primary market) and their delivery dates.

This data is typically used by real-estate investors, agencies, proptech startups, mortgage and valuation teams, and market researchers working on the Polish housing market.

### ⚠️ Limitations & known issues

- **Development pages** — Otodom shows developments (investments) as one listing with a price-from per m² and no single total price, area or room count; those fields are `null` for them.
- **Personal data** — phone numbers and names of private sellers are personal data under GDPR; process them lawfully.
- **Search depth** — results follow Otodom's own search, which can include a few listings just outside the chosen location and pins promoted developments at the top.

### ❓ Frequently asked questions

#### Can I scrape Otodom.pl legally?

This actor only collects data that Otodom shows publicly to any visitor, without logging in. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with Otodom's terms and with GDPR, especially for sellers' names and phone numbers.

#### What data does the Otodom scraper return?

Price, price per m², area, rooms, floor, location, photos and advertiser come from the search results. With **Scrape listing details** on (the default) you also get phone numbers, the full description, GPS coordinates, all photos, floor plans, building details such as year, type, heating and ownership, and the nearest places per category with walking times (the "Okolica" section).

#### How many listings can I scrape from one search?

`maxItems` limits listings per location or search URL. The scraper reads 72 listings per results page and keeps paging until that limit or the end of the search, so large cities with 20,000+ listings can be scraped completely.

#### Do I need a proxy to scrape otodom.pl?

On the Apify platform, yes. The input form prefills **residential** Apify Proxy, because without it many requests are blocked and fail. From a home connection the site often worked without a proxy.

#### How do I scrape Otodom with Python?

Use the Python example above with the `apify-client` package, then iterate over the dataset items to get each listing as a dictionary.

#### Can I run this Otodom scraper on a schedule?

Yes, with Apify Schedules. Set the same **Cache project name** on every run: the actor drops listings it already saved before opening their detail pages, so each run fetches, returns and charges for only new listings, marked with `changeType: new`. See **How the cache saves money** above.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### How do I search a specific district or neighbourhood?

Type it in **Locations**, for example Mokotów or Nowa Huta; the scraper picks Otodom's best match and logs which location it used. For full control, set the location and filters on otodom.pl and paste the results URL into **Search or listing URLs**.

### 🔗 Other actors you may find useful

| Scraper | Description |
| ------- | ----------- |
| [🏡 OnTheMarket Property Scraper](https://apify.com/confidential_gnat/onthemarket-property-scraper) | UK sale, rent and new-home listings: price, address, agent contacts, EPC, tenure and delisting tracking. |
| [🏘️ Chaves na Mão Property Scraper](https://apify.com/confidential_gnat/chavesnamao-property-scraper) | Brazil property for sale and rent: price, condo fee, IPTU, area, GPS, agent phone and WhatsApp. |
| [🛏️ Spotahome Property Scraper](https://apify.com/confidential_gnat/spotahome-property-scraper) | European rental listings: price, address, coordinates, amenities and images, with duplicate removal. |
| [🏠 HousingAnywhere Property Scraper](https://apify.com/confidential_gnat/housinganywhere-property-scraper) | Rental listings from HousingAnywhere: price, city, coordinates, room count, house rules and facilities. |
| [✅ Rightmove Listing Availability Checker](https://apify.com/confidential_gnat/rightmove-listing-availability-checker) | Checks whether Rightmove property listings are still active or have been removed. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/otodom-property-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

## `startUrls` (type: `array`):

Otodom search results URLs with any filters applied on the site (for example https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa?priceMax=800000) or single listing URLs (for example https://www.otodom.pl/pl/oferta/...-ID4CNxi). When set, the filter fields below are ignored unless Locations is also filled.

## `scrapeDetails` (type: `boolean`):

Open every listing to get the phone numbers, full description, GPS coordinates, all photos and building details (year, type, heating, ownership, floors). Turn off for faster, cheaper runs with the search summary only. Listing URLs always include the details.

## `scrapeNearbyPlaces` (type: `boolean`):

Add the "Okolica" section of each listing: the 3 nearest places per category (transport, shops, schools, health, green areas and more) with distance and walking time. One extra request per listing, used only when listing details are scraped.

## `maxItems` (type: `integer`):

Maximum unique listings saved for each location or search URL.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only new listings. Listings already scraped under this name are skipped and not charged, and they do not count towards Max items. Each record gets changeType: new.

## `locations` (type: `array`):

Cities, districts or regions to search, for example Warszawa, Kraków or Mokotów. Each location is searched separately with the filters below. Leave empty to search all of Poland.

## `transaction` (type: `string`):

Buy or rent.

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

Type of property to search for.

## `market` (type: `string`):

Primary market (new builds from developers), secondary market (resale) or both.

## `priceMin` (type: `integer`):

Minimum total price, or monthly rent for rentals.

## `priceMax` (type: `integer`):

Maximum total price, or monthly rent for rentals.

## `areaMin` (type: `integer`):

Minimum living area in square meters.

## `areaMax` (type: `integer`):

Maximum living area in square meters.

## `rooms` (type: `array`):

Only listings with these room counts. Leave empty for any.

## `ownerType` (type: `string`):

Only listings from private owners, real-estate agencies or developers. The agency and developer options only filter sale searches (Otodom ignores them for rentals); private owner works for both.

## `buildYearMin` (type: `integer`):

Minimum year of construction.

## `buildYearMax` (type: `integer`):

Maximum year of construction.

## `daysSinceCreated` (type: `string`):

Only listings added in the last N days.

## `sort` (type: `string`):

Order of the search results.

## `proxyConfiguration` (type: `object`):

Residential proxies are recommended: Otodom blocks many requests from datacenter and unproxied IPs on the Apify platform.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
    }
  ],
  "scrapeDetails": true,
  "scrapeNearbyPlaces": true,
  "maxItems": 5,
  "locations": [],
  "transaction": "sale",
  "propertyType": "flat",
  "market": "all",
  "rooms": [],
  "ownerType": "all",
  "sort": "default",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/otodom-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 = {
    "startUrls": [{ "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/otodom-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 '{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call confidential_gnat/otodom-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/otodom-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/E6cj7rwo1vNYvYsge/builds/ZUAmJrNeuvGOVgQGh/openapi.json
