# Otodom Scraper (`ribtools/otodom-scraper`) Actor

Scrape Otodom.pl property listings (flats, houses, plots, rooms, commercial, developments) from any search, ad, agency or developer URL: prices, areas, locations, agency contacts.

- **URL**: https://apify.com/ribtools/otodom-scraper.md
- **Developed by:** [RibTools](https://apify.com/ribtools) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 property data 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 Scraper

Extract property listings from **Otodom**, Poland's largest real-estate portal. Each listing comes with price, area, rooms, floor, monthly building fee, full location and agency, for sale or rent. Optional add-ons fetch the full ad details and agency office phone numbers.

### What is Otodom Scraper?

**Otodom Scraper** collects property listings from [Otodom](https://www.otodom.pl/), the Polish portal for flats, houses, plots, rooms, commercial property and new developments. You give it starting URLs and it returns structured data for each listing:

- property type, sale or rent, and price in złoty (including price per m²)
- area and plot area, rooms, floor and the monthly building fee (czynsz)
- voivodeship, county and commune (rural ads), city, district, housing estate and street
- the agency or developer, plus promotion and exclusivity flags
- for new developments: construction stage, delivery date, number of units and the range of unit areas

Two optional add-ons go further. Ad details adds the full description, every photo, map coordinates, the build year, the unit's condition, primary or secondary market and every listed attribute. Seller data adds the agency's or developer's office phone numbers and address.

The scraper handles pagination, retries and data normalization itself, so the dataset is ready to analyze or feed into your systems.

### What can this Actor do?

- **Extract every property type**: flats, houses, rooms, plots, commercial premises, garages and new developments, for sale and for rent
- **Handle multiple entry points**: searches with any filters, single ad URLs, development URLs, and agency or developer pages
- **Automatic pagination**: crawls through every search result page, 72 properties per page
- **Ad details add-on**: full description, every photo, map coordinates, update date, build year, condition, market, features and every listed attribute
- **Seller data add-on**: agency or developer office phone numbers, address and Otodom page
- **No duplicates**: each property is returned (and charged) once per run, even when listings move between pages
- **Premium proxies included**: Polish residential proxies built in at no additional cost
- **Structured output**: JSON, CSV and Excel formats
- **API integration**: real-time data access through the Apify API
- **Scheduled runs**: automated daily or weekly collection

### What data can Otodom Scraper extract?

| Field | Description | Example |
| ----- | ----------- | ------- |
| **ID** | Otodom ad identifier | 68496313 |
| **Title** | Ad title | Blisko metra. Stan idealny. Razem z wyposażeniem |
| **Property Type** | What is for sale or rent | flat, house, room, terrain, commercial_property, hall, garage, investment |
| **Transaction** | Sale or rent | sale, rent |
| **Price** | Asking price or monthly rent in złoty, and price per m² | 1056100, 17900 |
| **Building fee** | Monthly czynsz in złoty | 1030 |
| **Area** | Usable area and plot area in m² | 59 |
| **Rooms / Floor** | Room count and floor (0 = ground floor) | 2, 0 |
| **Location** | Voivodeship, county, commune, city, district, housing estate, street | mazowieckie, Warszawa, Mokotów, Ksawerów |
| **Development** | Construction stage, delivery, units and unit area range for new developments | in_building, 2027-Q1, 2 |
| **Seller** | Seller type, agency or developer name and page | agency, Partners International Sp. z o.o. |
| **Flags and badges** | Promoted, exclusive, search highlights | BALCONY, PARKING_SPOT |
| **Media** | Thumbnail, photo count, video and virtual tour links | |
| **Dates** | Original publication and last push-up | 2026-10-06T09:21:26+00:00 |
| **Details** (add-on) | Description, photos, coordinates, condition, market, attributes | See below |
| **Seller** (add-on) | Agency or developer office phones and address | See below |

### How to scrape Otodom

#### Step-by-step tutorial:

1. **Add starting URLs**: paste Otodom search, ad, development or agency URLs (see compatible formats below)
2. **Configure options** (optional): turn on the ad details and/or seller data add-ons
3. **Run the scraper**: click "Start" and watch progress in real time
4. **Download results**: export the data as JSON, CSV or Excel

Proxies are included automatically — no setup required.

#### Compatible URL examples:

- **Search for sale**: `https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa`
- **Search for rent**: `https://www.otodom.pl/pl/wyniki/wynajem/dom/malopolskie/krakow/krakow/krakow`
- **Filtered search (price, rooms, sort)**: `https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa?priceMax=900000&roomsNumber=%5BTWO%5D&by=LATEST&direction=DESC`
- **All of Poland**: `https://www.otodom.pl/pl/wyniki/sprzedaz/dzialka/cala-polska`
- **New developments**: `https://www.otodom.pl/pl/wyniki/sprzedaz/inwestycja/cala-polska`
- **Older search links**: `https://www.otodom.pl/pl/oferty/sprzedaz/mieszkanie/warszawa`
- **Single ad** (with or without `.html`): `https://www.otodom.pl/pl/oferta/blisko-metra-stan-idealny-razem-z-wyposazeniem-ID4Dp1f`
- **Single development**: `https://www.otodom.pl/pl/inwestycja/kwiatowy-zakatek-twoj-nowy-dom-pod-wroclawiem-ID4DqUv`
- **Agency page (whole inventory, sale and rent)**: `https://www.otodom.pl/pl/firmy/biura-nieruchomosci/dobry-dom-nieruchomosci-ID616869`
- **Developer page**: `https://www.otodom.pl/pl/firmy/deweloperzy/wawel-development-ID10556424`

**Important**: only URLs that match these patterns will work, in Polish (`/pl/`): Otodom doesn't serve other language versions. Search URLs are run exactly as you copied them, with every filter. Otodom answers a search for a property type it doesn't recognise with flats from all of Poland. The scraper skips such a URL rather than return results you didn't ask for.

### How much does it cost to scrape Otodom?

Otodom Scraper uses **pay-per-result (PPR)** pricing: you only pay for properties it successfully extracts.

#### Is scraping Otodom free?

The scraper follows Apify's PPR model with the following structure:

- **Base extraction**: one charge per scraped property (price, area, rooms, location, agency)
- **Ad details add-on**: one additional charge per property, only when the details add-on is on and the ad returns data
- **Seller data add-on**: one additional charge per property, only when at least one office phone number is returned. You are never charged it for private owners or for agencies without a published phone.

The scraper keeps compute usage low while maintaining a high success rate. Contact support for volume discounts on large-scale projects.

### Input configuration

The scraper accepts the following inputs:

#### Start URLs

Otodom URLs copied from your browser:

- searches for sale (`/pl/wyniki/sprzedaz/...`) or rent (`/pl/wyniki/wynajem/...`), for any property type and with any filters applied (location, price, area, rooms, sort), and older `/pl/oferty/...` search links
- single ad URLs (`/pl/oferta/...-ID4Dp1f`) and development URLs (`/pl/inwestycja/...`)
- agency or developer pages (`/pl/firmy/biura-nieruchomosci/...-ID616869`, `/pl/firmy/deweloperzy/...`)

#### Maximum items

Maximum number of properties to scrape (each result is a charged event). Leave empty for no limit.

#### Fetch ad details (add-on)

Opens each ad to add:

- the full description and every photo
- map coordinates and the update date
- bathrooms, build year, energy certificate, the unit's condition and primary or secondary market
- features and every listed attribute

Charged per property with details.

#### Fetch seller data (add-on)

Adds the seller profile: the agency's or developer's office phone numbers, address and Otodom page. You are charged only when a phone number is returned.

### Output example

```json
{
  "type": "property",
  "id": 68496313,
  "url": "https://www.otodom.pl/pl/oferta/blisko-metra-stan-idealny-razem-z-wyposazeniem-ID4Dp1f",
  "title": "Blisko metra. Stan idealny. Razem z wyposażeniem",
  "property_type": "flat",
  "transaction": "sale",
  "price": 1056100,
  "currency": "PLN",
  "price_per_m2": 17900.0,
  "price_from_per_m2": null,
  "area_m2": 59.0,
  "terrain_area_m2": null,
  "rooms": 2,
  "rooms_label": "TWO",
  "floor": 0,
  "condo_fee": 1030,
  "region": "mazowieckie",
  "county": null,
  "commune": null,
  "city": "Warszawa",
  "neighborhood": "Mokotów",
  "residential_area": "Ksawerów",
  "street": "Puławska",
  "construction_status": null,
  "development_delivery": null,
  "development_units": null,
  "development_area_min_m2": null,
  "development_area_max_m2": null,
  "seller_type": "agency",
  "seller_id": "470647",
  "seller_name": "Partners International Sp. z o.o.",
  "seller_url": "https://www.otodom.pl/pl/firmy/biura-nieruchomosci/partners-international-sp-z-o-o-ID470647",
  "is_promoted": false,
  "is_exclusive": false,
  "badges": [
    "SEPARATE_KITCHEN",
    "BASEMENT",
    "GROUND_FLOOR"
  ],
  "thumbnail": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImwxeHl5ejdxZ2RpZzEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.wupWuQ8ALwSZjSPJ1bq78Ylh1AD6uyQGMTniYEnvXAs/image;s=1280x1024;q=80",
  "photo_count": 15,
  "video_url": null,
  "virtual_tour_url": null,
  "listed_at": "2026-10-06T09:21:26+00:00",
  "bumped_at": "2026-10-14T18:09:04+02:00",
  "details": {
    "description": "Z PEŁNYM WYPOSAŻENIEM. GOTOWE DO WPROWADZENIA\n\nMIESZKANIE W ODRESTAUROWANEJ KAMIENICY\n\nGotowe do wprowadzenia I Pełne wyposażenie w cenie | 5 min do Stacji...",
    "photos": [
      "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImwxeHl5ejdxZ2RpZzEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.VD85gS-3Uo0nMIbErQ7-qE_8Ey456nOZq2ykktfEosg/image;s=1280x1024;q=80"
    ],
    "latitude": 52.1861521,
    "longitude": 21.023947,
    "updated_at": "2026-10-14T18:09:03+02:00",
    "bathrooms": null,
    "build_year": 1958,
    "energy_certificate": null,
    "condition": "ready_to_use",
    "market": "secondary",
    "building_type": "tenement",
    "features": [
      "meble",
      "winda",
      "piwnica",
      "oddzielna kuchnia"
    ],
    "attributes": {
      "price": "1056100",
      "m": "59",
      "price_per_m": "17900",
      "rooms_num": "2",
      "market": "secondary",
      "building_type": "tenement",
      "floor_no": "ground_floor",
      "building_floors_num": "7"
    }
  },
  "seller": {
    "type": "agency",
    "id": "470647",
    "name": "Partners International Sp. z o.o.",
    "phones": [
      "+48226465202"
    ],
    "address": "Wiejska 19, 00-480, Warszawa, mazowieckie",
    "profile_url": "https://www.otodom.pl/pl/firmy/biura-nieruchomosci/partners-international-sp-z-o-o-ID470647"
  }
}
```

This example is shortened: real items carry the full description, every photo and every listed attribute.

The search-only fields (`is_promoted`, `badges`, `photo_count`, `rooms_label`, `development_delivery`, `development_units`, `development_area_min_m2`, `development_area_max_m2`) are empty for single ad and development URLs. `photo_count` is also empty for agency pages.

You can download the dataset extracted by **Otodom Scraper** as **JSON, HTML, CSV or Excel**. The data is already cleaned and normalized, ready for analysis tools, databases or business applications.

### Use cases and applications

- **Housing market research**: track asking prices, rents, building fees and price per m² by voivodeship, city, district and property type across Poland
- **Property valuation**: compare comparable listings by area, rooms, floor, build year and condition
- **New-development tracking**: follow developments, their construction stage, delivery dates, unit counts and price per m²
- **Agency lead generation and monitoring**: build lists of agencies and developers with office phones, or follow an agency's whole inventory on a schedule

### Integrations and API access

Otodom Scraper integrates with these platforms:

- **Zapier**: automate data workflows and notifications (via the [Apify Zapier integration](https://docs.apify.com/platform/integrations/zapier))
- **Make (Integromat)**: build multi-step automations (via the [Apify Make integration](https://www.make.com/en/integrations/apify))
- **Google Sheets**: export data directly for analysis
- **REST API**: programmatic access to the extracted data ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api))
- **Python/Node.js SDKs**: integrate the scraper into your applications ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api#javascript-and-python-client))

### FAQ and Support

#### Do I need to configure a proxy?

No. The Actor includes Polish residential proxies automatically at no additional cost. There's nothing to configure.

#### Why are there no phone numbers, names or streets for private owners or agents?

To protect individuals' privacy under the EU's GDPR, the scraper returns only agency and developer business data: their trading name, office phone numbers and office address. Private owners come back as `seller_type: "private"` with no name, no phone and no street, and they are not charged for the seller add-on. Individual agents' names and personal mobiles are never returned as fields. The details add-on ships the ad description as the advertiser wrote it, which sometimes includes an agent's contact.

#### What are `rooms` and `condo_fee`?

`rooms` is Otodom's own room count (pokoje), which includes the living room. `condo_fee` is the monthly building fee (czynsz) the ad states; it is empty when the ad leaves it at 0 or doesn't give it. `price` is empty for new developments (the units have their own prices) and for "price on request" ads.

#### How often is the data updated?

Otodom updates listings in real time. For fresh data, schedule regular runs or call the API on demand.

#### What if some URLs don't work?

The scraper only supports the Otodom URL patterns listed above, and it skips any other URL. That includes searches for a property type Otodom doesn't recognise and non-Polish language URLs.

#### Do you offer custom solutions?

Yes. We can customize the scraper for specific requirements, extra data points, or integration with your existing systems. Contact us through the Issues tab for enterprise solutions.

#### Need help or have feedback?

- **Report issues**: use the Issues tab for bug reports and feature requests
- **Custom development**: contact us for tailored solutions and enterprise integrations

### Po polsku

**Otodom Scraper** pobiera ogłoszenia nieruchomości na sprzedaż i wynajem z [Otodom](https://www.otodom.pl/). Każde ogłoszenie zawiera:

- rodzaj nieruchomości i cenę w złotych (także cenę za m²)
- powierzchnię, powierzchnię działki, liczbę pokoi, piętro i czynsz
- województwo, powiat i gminę (ogłoszenia wiejskie), miasto, dzielnicę, osiedle i ulicę
- biuro nieruchomości lub dewelopera
- w inwestycjach: etap budowy, termin oddania, liczbę lokali i zakres powierzchni

Proxy w cenie, bez konfiguracji.

**Obsługiwane adresy URL:**

- wyszukiwania na sprzedaż (`/pl/wyniki/sprzedaz/...`) lub wynajem (`/pl/wyniki/wynajem/...`), dowolny rodzaj nieruchomości i dowolne filtry, a także starsze linki `/pl/oferty/...`
- pojedyncze ogłoszenia (`/pl/oferta/...-ID4Dp1f`, także z `.html`) i inwestycje (`/pl/inwestycja/...`)
- strony biur nieruchomości i deweloperów (`/pl/firmy/biura-nieruchomosci/...-ID616869`, `/pl/firmy/deweloperzy/...`), z całą ofertą sprzedaży i wynajmu

**Dodatki (add-ons):**

- **Szczegóły ogłoszenia**: pełny opis, wszystkie zdjęcia, współrzędne, data aktualizacji, rok budowy, stan wykończenia, rynek pierwotny lub wtórny, cechy i wszystkie atrybuty ogłoszenia. Płatne za każdą nieruchomość ze szczegółami.
- **Dane sprzedawcy**: telefony biura agencji lub dewelopera, adres i strona w Otodom. Zgodnie z RODO tylko dane firm: osoby prywatne zwracają `seller_type: "private"`, bez imienia, telefonu i ulicy, a dodatek nie jest za nie naliczany. Imiona i prywatne telefony agentów nie są zwracane jako pola; opis ogłoszenia (dodatek szczegółów) jest przekazywany tak, jak napisał go ogłoszeniodawca, i czasem zawiera kontakt agenta. Płatne tylko wtedy, gdy zwrócono co najmniej jeden numer telefonu.

**Uwagi:**

- Każda nieruchomość jest zwracana (i płatna) tylko raz na uruchomienie.
- `rooms` to liczba pokoi według Otodom (z salonem).
- `price` jest puste w inwestycjach i ogłoszeniach z ceną „zapytaj o cenę”; `condo_fee` jest puste, gdy czynsz wynosi 0 lub nie podano go.

# Changelog

This Actor's version history is a separate document: https://apify.com/ribtools/otodom-scraper/changelog.md

# Actor input Schema

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

Otodom URLs copied from your browser. Search URLs for sale (`/pl/wyniki/sprzedaz/...`) or rent (`/pl/wyniki/wynajem/...`) of any property type, with any filters applied (location, price, area, rooms, sort), e.g. `https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa?priceMax=900000`. Older `/pl/oferty/...` search links, single ad URLs (`/pl/oferta/...-ID4Dp1f`, with or without `.html`), development URLs (`/pl/inwestycja/...`) and agency or developer pages (`/pl/firmy/biura-nieruchomosci/...-ID616869`, `/pl/firmy/deweloperzy/...`) also work.

## `maxRequests` (type: `integer`):

Maximum number of properties to scrape (each result is a charged event). Leave empty for no limit.

## `detailsAddon` (type: `boolean`):

Open each ad to add the full description, every photo, map coordinates, the update date, bathrooms, build year, energy certificate, the unit's condition, primary or secondary market, features and every listed attribute. Charged per property with details.

## `sellerDataAddon` (type: `boolean`):

Add the seller profile: agency or developer office phone numbers, address and Otodom page. Phone numbers are returned for agencies and developers only, never for private owners. You are charged only when a phone number is returned.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"
    }
  ],
  "maxRequests": 10,
  "detailsAddon": false,
  "sellerDataAddon": false
}
```

# Actor output Schema

## `items` (type: `string`):

All scraped items.

# 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"
        }
    ],
    "maxRequests": 10,
    "detailsAddon": false,
    "sellerDataAddon": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("ribtools/otodom-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" }],
    "maxRequests": 10,
    "detailsAddon": False,
    "sellerDataAddon": False,
}

# Run the Actor and wait for it to finish
run = client.actor("ribtools/otodom-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"
    }
  ],
  "maxRequests": 10,
  "detailsAddon": false,
  "sellerDataAddon": false
}' |
apify call ribtools/otodom-scraper --silent --output-dataset

```

## MCP server setup

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