# Otodom Scraper - Poland Real Estate Listings & Phones (`clearpath/otodom-scraper`) Actor

Every listing an otodom.pl search reports, with phone numbers. Flats, houses, plots, rooms, commercial premises and new developments for sale or rent across Poland: price per m², monthly fee, area, rooms, floor, coordinates, photos and agency details. Search by city or paste an otodom link.

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

## Pricing

from $1.39 / 1,000 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?

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

[![152,000+ Otodom listings. One dataset. Flats for sale across Poland, with an Otodom property listing view.](https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/otodom-scraper-readme-hero-15053e3d8268.png)](https://console.apify.com/actors/2rOc6obFDHnGHokbV/input)

From **Clearpath**, creators of [ImmoScout24 Pro](https://apify.com/clearpath/immoscout24-api-pro), [Leboncoin Immobilier](https://apify.com/clearpath/leboncoin-immobilier), [Sahibinden Real Estate](https://apify.com/clearpath/sahibinden-real-estate) and [Zillow](https://apify.com/clearpath/zillow-bulk-search-unlimited-scraper). **1.2 million+ combined lifetime runs** across these four real-estate scrapers.

### Why choose this actor?

- **Nationwide collection.** A local run over flats for sale across Poland saved **152,123 listings** in summary mode (`includeDetails: false`). Collect a city, a region or a nationwide search in one dataset.
- **Seller contacts and property detail.** Full details add source-provided phones, contact people and agency information, plus floor plans and tour links where available, with no extra detail charge. Keep price per m², area, rooms, monthly fees, coordinates and photos together.
- **Keep your search criteria.** Choose locations and filters, or paste an Otodom search link to retain its criteria. Search sale or rental listings across nine property categories.

<a href="https://console.apify.com/actors/2rOc6obFDHnGHokbV/input"><img src="https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/otodom-scraper-readme-cta-d3484d1f12e6.svg" width="256" height="48" alt="Scrape Otodom listings" /></a>

### Quick input

Try **20 flats for sale across Poland** in summary mode:

```json
{
  "locations": [],
  "transaction": "sale",
  "propertyType": "flat",
  "maxItems": 20,
  "includeDetails": false
}
```

[Open actor input](https://console.apify.com/actors/2rOc6obFDHnGHokbV/input). Empty `locations` with no listing links searches all Poland. Leave **Maximum results** empty for an uncapped search, subject to your run budget and time limit. Set `includeDetails` to `true` for contact and detailed property data. Export JSON, CSV or Excel; JSON preserves nested contacts, images and location data.

<table>
<tr>
<td colspan="2" style="padding:10px 12px;background:#3DD37A;border:none;border-radius:4px 4px 0 0"><span style="color:#102A21;font-weight:700">Clearpath Real Estate</span></td>
</tr>
<tr>
<td style="padding:10px 12px;border:1px solid #B9E4C9;background:#C9F2D8;vertical-align:top;width:50%"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-2rOc6obFDHnGHokbV-DfDgQeGfAe-otodom-scraper-logo.png" width="20" height="20" alt="Otodom logo" style="vertical-align:middle">&nbsp; <a href="https://apify.com/clearpath/otodom-scraper" style="color:#102A21;font-weight:700;font-size:13px">Otodom</a><br><span style="color:#354E40;font-size:12px">Poland, you are here</span></td>
<td style="padding:10px 12px;border:1px solid #B9E4C9;background:#E7F7ED;vertical-align:top;width:50%"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-s609dyAJSrju54QSh-zj5NeZTykb-ImmoScout24-canva2.png" width="20" height="20" alt="ImmoScout24 logo" style="vertical-align:middle">&nbsp; <a href="https://apify.com/clearpath/immoscout24-api-pro" style="color:#102A21;font-weight:700;font-size:13px">ImmoScout24</a><br><span style="color:#354E40;font-size:12px">Germany, property listings</span></td>
</tr>
<tr>
<td style="padding:10px 12px;border:1px solid #B9E4C9;background:#E7F7ED;vertical-align:top;width:50%"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-JUFnhDjGAS8VM64Or-NK2uxNA7xa-leboncoin-api-scraper.png" width="20" height="20" alt="Leboncoin logo" style="vertical-align:middle">&nbsp; <a href="https://apify.com/clearpath/leboncoin-immobilier" style="color:#102A21;font-weight:700;font-size:13px">Leboncoin</a><br><span style="color:#354E40;font-size:12px">France, seller contacts</span></td>
<td style="padding:10px 12px;border:1px solid #B9E4C9;background:#E7F7ED;vertical-align:top;width:50%"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-z4v4lnrbobs8Nnf3N-CaRg48OBfX-sahibinden-phone-scraper-logo.png" width="20" height="20" alt="Sahibinden logo" style="vertical-align:middle">&nbsp; <a href="https://apify.com/clearpath/sahibinden-real-estate" style="color:#102A21;font-weight:700;font-size:13px">Sahibinden</a><br><span style="color:#354E40;font-size:12px">Turkey, seller contacts</span></td>
</tr>
</table>

#### Copy to your AI assistant

```text
clearpath/otodom-scraper on Apify returns otodom.pl (Poland) property listings, one row each and every listing a search reports: price, price per m², monthly fee, area, rooms, floor, building details, address with coordinates, description and photos; with includeDetails=true (the default, no extra charge) also phone numbers, contact people, agency licence and office phones, floor plans and tour links. Search with locations (city, district or region names; empty with no startUrls means all of Poland), transaction (sale or rent) and propertyType (flat, studio, house, investment for whole new developments, room, plot, commercial, hall, garage), plus optional filters such as priceMin/priceMax, areaMin/areaMax, rooms (strings "1" to "10" or "more"), market, sellerType, postedWithinDays and radiusKm (strings), keyword and sortBy; or put otodom search or listing links in startUrls to keep their own filters. Omit maxItems to get every listing; maxItemsPerSearch caps each location. Charges: $1.99 per 1,000 listings on the free plan plus $0.0099 per run start, see https://apify.com/clearpath/otodom-scraper/pricing. Full input and output: https://api.apify.com/v2/actors/clearpath~otodom-scraper/builds/default. To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: feature requests, a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### How to scrape otodom.pl listings

1. Enter one or more **Locations**: a city (`Warszawa`, `Kraków`, `Gdynia`), a district with its city (`Mokotów, Warszawa`) or a region (`pomorskie`). Polish letters are optional. Each location is its own search.
2. Pick **Sale or rent** and a **Property type**, then any filters.
3. Set **Maximum results**, or leave it empty for every listing. Start the run and download the dataset.

You can also paste otodom.pl links into **Otodom links**: a search result page keeps all the filters and the sort order you set on the site, and a single listing link returns that one listing.

| Input | Default | What it does |
|---|---|---|
| `locations` | all of Poland | Cities, districts, regions or location paths from an otodom link. Empty, with no links, searches the whole country. |
| `districts` | none | Narrows each location to these districts, for example `["Mokotów", "Wola"]` for Warszawa. |
| `startUrls` | none | otodom.pl search links (filters kept) or listing links. |
| `transaction` | `sale` | `sale` or `rent`. |
| `propertyType` | `flat` | `flat`, `studio`, `house`, `investment` (new developments), `room`, `plot`, `commercial`, `hall`, `garage`. |
| `priceMin`, `priceMax` | none | Total price in PLN, or monthly rent for rentals. |
| `pricePerSquareMeterMin`, `pricePerSquareMeterMax` | none | Price per m² in PLN. |
| `areaMin`, `areaMax` | none | Floor area in m². |
| `rooms` | any | Any of `"1"` to `"10"` and `"more"`. |
| `buildYearMin`, `buildYearMax` | none | Construction year range. |
| `market` | `all` | `primary` (new build), `secondary` (resale) or `all`. |
| `sellerType` | `all` | `private`, `agency`, `developer` or `all`. |
| `postedWithinDays` | any age | `"1"`, `"3"`, `"7"`, `"14"` or `"30"`. |
| `radiusKm` | `"0"` | Adds listings up to `"5"`, `"10"`, `"15"`, `"25"`, `"50"` or `"75"` km outside each location. |
| `keyword` | none | Only listings whose description mentions this word, for example `balkon`. |
| `sortBy` | `default` | `newest`, `oldest`, `price_lowest`, `price_highest`, `area_smallest`, `area_largest`, `price_per_m_lowest`, `price_per_m_highest`. |
| `includeDetails` | `true` | Phones, contacts, agency details, features, floor plans, tour links and listing status. |
| `maxItems` | every listing | Total cap across all searches. |
| `maxItemsPerSearch` | none | Cap per location or link, so one large city does not use up the total. |

Filters narrow the result, so none is set unless you choose it. The `investment` property type returns whole new developments; the individual flats inside them are already included under `flat`.

#### Examples

Two Warsaw districts, 2 or 3 rooms, resale only, newest first:

```json
{
  "locations": ["Warszawa"],
  "districts": ["Mokotów", "Wola"],
  "rooms": ["2", "3"],
  "market": "secondary",
  "sortBy": "newest",
  "maxItems": 200
}
```

Flats for rent in Kraków from private owners, posted in the last 7 days:

```json
{
  "locations": ["Kraków"],
  "transaction": "rent",
  "sellerType": "private",
  "postedWithinDays": "7"
}
```

A search you already set up on otodom.pl, plus one listing:

```json
{
  "startUrls": [
    { "url": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/pomorskie/gdynia/gdynia/gdynia?priceMax=900000&areaMin=40" },
    { "url": "https://www.otodom.pl/pl/oferta/2-pokoje-do-remontu-gdynia-ul-slaska-ID4D0Pg" }
  ]
}
```

Houses for sale within 25 km of Gdańsk:

```json
{
  "locations": ["Gdańsk"],
  "propertyType": "house",
  "radiusKm": "25"
}
```

### What data do you get from otodom.pl?

Each row is one listing, with the same fields on every row. A field the listing does not have is `null` or an empty list.

- **Listing:** id, otodom offer code, link, title, property type, sale or rent, market, status, created, updated and bumped dates, promoted, exclusive and premium flags.
- **Price:** price and currency, price per m², monthly fee (czynsz), deposit, negotiable flag, price on request.
- **Property:** area, plot area, rooms, floor, building floors, build year, building type and material, ownership, condition, heating, windows, energy class, lift, parking, available from, extras, equipment, security, utilities, surroundings.
- **Location:** one-line address, province, county, municipality, city, district, neighbourhood, street, house number, postal code, latitude and longitude, whether the pin is exact, and every location level with otodom's location id.
- **Contacts:** phone and all phones found, contact person, contact people with phones, assigned agent, seller type (private, agency, developer), agency id, name, profile link, logo, licence number, office phones and address.
- **Media and text:** photos in four sizes, photo ids, floor plans, video, 3D tour, walk-around and local plan links, full description as text and as formatted HTML, features grouped as on the listing page, highlight tags.
- **New developments:** development name and link for units inside one, and for whole developments their stage, completion date, unit count, units still available, unit area and room range and starting price per m².
- **Run context:** which of your locations or links found the row, the equivalent otodom search link, rank in that search (empty for the few listings on very large searches that otodom's result order skips), a change fingerprint and the collection time.

Every coded value, such as `buildingType: "block"` or `heating: "urban"`, comes with a readable label next to it, and `attributes` keeps otodom's complete raw attribute map.

Here is a real row from a Gdynia run. Phone numbers and the contact person's surname are masked in this example, and the `images`, `imageVariants`, `imageIds` and `agencyFeatures` lists are shortened (this listing has 14 photos and 44 agency features).

```json
{
  "id": 68365591,
  "offerCode": "ID4CR0P",
  "url": "https://www.otodom.pl/pl/oferta/gdynia-dzialki-lesne-zadbane-2-pok-z-balkonem-ID4CR0P",
  "slug": "gdynia-dzialki-lesne-zadbane-2-pok-z-balkonem-ID4CR0P",
  "title": "Gdynia Działki Leśne. Zadbane 2-pok z balkonem",
  "listingKind": "listing",
  "estate": "FLAT",
  "estateLabel": "Flat",
  "transaction": "sale",
  "market": "secondary",
  "marketLabel": "Secondary market (resale)",
  "price": 599000,
  "priceCurrency": "PLN",
  "priceFormatted": "599 000 PLN",
  "pricePerSquareMeter": 12744.68,
  "pricePerSquareMeterFormatted": "12 745 PLN/m²",
  "pricePerSquareMeterFrom": null,
  "isPriceHidden": false,
  "isPriceNegotiable": false,
  "monthlyFee": 430,
  "deposit": null,
  "areaSquareMeters": 47,
  "terrainAreaSquareMeters": null,
  "rooms": 2,
  "roomsLabel": "2",
  "floor": 2,
  "floorLabel": "Floor 2",
  "buildingFloors": 4,
  "buildYear": 1987,
  "buildingType": "block",
  "buildingTypeLabel": "Block of flats",
  "buildingMaterial": null,
  "buildingMaterialLabel": null,
  "ownershipType": "full_ownership",
  "ownershipTypeLabel": "Full ownership",
  "condition": "ready_to_use",
  "conditionLabel": "Ready to move in",
  "heating": "urban",
  "heatingLabel": "District heating",
  "heatingTypes": [],
  "windowsType": null,
  "windowsTypeLabel": null,
  "energyCertificate": null,
  "hasElevator": false,
  "parking": null,
  "availableFrom": null,
  "extras": [
    "Balcony",
    "Basement",
    "Separate kitchen"
  ],
  "equipment": [
    "Fridge",
    "Oven",
    "Stove",
    "Tv",
    "Washing machine"
  ],
  "security": [
    "Entryphone"
  ],
  "utilities": [],
  "surroundings": [],
  "peoplePerRoom": null,
  "features": [
    "domofon / wideofon",
    "lodówka",
    "piekarnik",
    "kuchenka",
    "telewizor",
    "pralka",
    "balkon",
    "piwnica",
    "oddzielna kuchnia"
  ],
  "featuresByCategory": [
    {
      "category": "Zabezpieczenia",
      "values": [
        "domofon / wideofon"
      ]
    },
    {
      "category": "Wyposażenie",
      "values": [
        "lodówka",
        "piekarnik",
        "kuchenka",
        "telewizor",
        "pralka"
      ]
    },
    {
      "category": "Informacje dodatkowe",
      "values": [
        "balkon",
        "piwnica",
        "oddzielna kuchnia"
      ]
    }
  ],
  "tags": [
    {
      "value": "SEPARATE_KITCHEN",
      "label": "Separate kitchen",
      "weight": 50
    },
    {
      "value": "BALCONY",
      "label": "Balcony",
      "weight": 35
    },
    {
      "value": "BASEMENT",
      "label": "Basement",
      "weight": 25
    }
  ],
  "description": "Słoneczne, zadbane mieszkanie z widokiem na las przy ul.Tatrzańskiej.\nMieszkanie dwustronne z dużym balkonem, pokoje samodzielne(ok.18,8m i 11,10m), jasna kuchnia(ok. 7,90m), łazienka razem z WC( ok.3,2m). Okna PCV, na podłodze w pokojach parkiet w bardzo dobrym stanie, w łazience , kuchni i przedpokoju glazura.Wszystkie media opomiarowane czynsz 430zł/830zł. Do mieszkania przynależy piwnica.W pełni umeblowane i wyposażone, w cenie pozostaje zabudowa kuchni wraz ze sprzętem AGD (lodówka z zamrażarką, zmywarka, kuchenka gazowa z piekarnikiem elektrycznym, pochłaniacz), umeblowanie pokoi i zabudowa przedpokoju( dwie szafy). Budynek docieplony z zadbaną klatką schodową. Wydanie szybkie.\nDoskonała lokalizacja, dzielnica otoczona lasem blisko Centrum Gdyni, komunikacji miejskiej i sieci usługowo-handlowej.",
  "shortDescription": "Słoneczne, zadbane mieszkanie z widokiem na las przy ul.Tatrzańskiej.\nMieszkanie dwustronne z dużym balkonem, pokoje samodzielne(ok.18,8m i 11,10m), jasna kuchnia(ok. 7,90m), łazienka razem z WC( ok.3...",
  "descriptionHtml": "<p></p><p><strong>Słoneczne, zadbane mieszkanie z widokiem na las przy ul.Tatrzańskiej.</strong></p><p>Mieszkanie dwustronne z dużym balkonem, pokoje samodzielne(ok.18,8m i 11,10m), jasna kuchnia(ok. 7,90m), łazienka razem z WC( ok.3,2m). Okna PCV, na podłodze w pokojach parkiet w bardzo dobrym stanie, w łazience , kuchni i przedpokoju glazura.Wszystkie media opomiarowane czynsz 430zł/830zł. Do mieszkania przynależy piwnica.W pełni umeblowane i wyposażone, w cenie pozostaje zabudowa kuchni wraz ze sprzętem AGD (lodówka z zamrażarką, zmywarka, kuchenka gazowa z piekarnikiem elektrycznym, pochłaniacz), umeblowanie pokoi i zabudowa przedpokoju( dwie szafy). Budynek docieplony z zadbaną klatką schodową. Wydanie szybkie.</p><p>Doskonała lokalizacja, dzielnica otoczona lasem blisko Centrum Gdyni, komunikacji miejskiej i sieci usługowo-handlowej.</p>",
  "address": "Tatrzańska, Działki Leśne, Gdynia, pomorskie",
  "province": "pomorskie",
  "county": null,
  "municipality": null,
  "city": "Gdynia",
  "district": "Działki Leśne",
  "subdistrict": null,
  "street": "Tatrzańska",
  "streetNumber": null,
  "postalCode": null,
  "latitude": 54.515453,
  "longitude": 18.52446,
  "locationRadiusMeters": 0,
  "locationHierarchy": [
    {
      "id": "pomorskie",
      "name": "pomorskie",
      "level": "voivodeship",
      "fullName": "pomorskie"
    },
    {
      "id": "pomorskie/gdynia/gdynia/gdynia",
      "name": "Gdynia",
      "level": "city_or_village",
      "fullName": "Gdynia, pomorskie"
    },
    {
      "id": "pomorskie/gdynia/gdynia/gdynia/dzialki-lesne",
      "name": "Działki Leśne",
      "level": "district",
      "fullName": "Działki Leśne, Gdynia, pomorskie"
    }
  ],
  "images": [
    "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Ing0aWtkeGp2bGJtdDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.kRMxlz98hfBFHURGx0Y62nO3jyhafu8hoFOgcN2NZY4/image",
    "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImJhZDR4dmJwaGF6NDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.IlgRrRMHjK08C9D0VMlfLNi9LNLWhdNW-t0vgSdjN24/image"
  ],
  "imageVariants": [
    {
      "thumbnail": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6Ing0aWtkeGp2bGJtdDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.4lOqJTefQ_ovoMCYpCksmp-SXfoT5DDm8z01JgcDbBE/image;s=184x138;q=80",
      "small": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6Ing0aWtkeGp2bGJtdDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.4lOqJTefQ_ovoMCYpCksmp-SXfoT5DDm8z01JgcDbBE/image;s=314x236;q=80",
      "medium": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6Ing0aWtkeGp2bGJtdDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.4lOqJTefQ_ovoMCYpCksmp-SXfoT5DDm8z01JgcDbBE/image;s=655x491;q=80",
      "large": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6Ing0aWtkeGp2bGJtdDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.4lOqJTefQ_ovoMCYpCksmp-SXfoT5DDm8z01JgcDbBE/image;s=1280x1024;q=80"
    },
    {
      "thumbnail": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImJhZDR4dmJwaGF6NDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.vbQeOA8svuHzhMrixjQZltU5brpeQ0uYaIoAMN_eLRw/image;s=184x138;q=80",
      "small": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImJhZDR4dmJwaGF6NDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.vbQeOA8svuHzhMrixjQZltU5brpeQ0uYaIoAMN_eLRw/image;s=314x236;q=80",
      "medium": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImJhZDR4dmJwaGF6NDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.vbQeOA8svuHzhMrixjQZltU5brpeQ0uYaIoAMN_eLRw/image;s=655x491;q=80",
      "large": "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImJhZDR4dmJwaGF6NDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.vbQeOA8svuHzhMrixjQZltU5brpeQ0uYaIoAMN_eLRw/image;s=1280x1024;q=80"
    }
  ],
  "imageIds": [
    "x4ikdxjvlbmt3-APL",
    "bad4xvbphaz43-APL"
  ],
  "mainImage": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Ing0aWtkeGp2bGJtdDMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.kRMxlz98hfBFHURGx0Y62nO3jyhafu8hoFOgcN2NZY4/image",
  "imageCount": 14,
  "floorPlans": [
    "https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6IjZ4MWpjc2t6YnI3ZzMtQVBMIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNCIsInAiOiIxMCwtMTAiLCJhIjoiMCJ9XX0.E5y2G9DSpiFo64uMWHiVkb3ZJywka2SuVc8ONNeOyIQ/image"
  ],
  "videoUrl": null,
  "virtualTourUrl": null,
  "walkaroundUrl": null,
  "localPlanUrl": null,
  "sellerType": "agency",
  "advertiserType": "business",
  "isPrivateOwner": false,
  "contactName": "Jolanta P.",
  "contactImageUrl": null,
  "phone": "+48 605 XXX XXX",
  "phones": [
    "+48 605 XXX XXX"
  ],
  "contacts": [],
  "assignedAgent": null,
  "agencyId": "4149240",
  "agencyName": "Nieruchomości Ewa Krzesińska",
  "agencyUrl": "https://www.otodom.pl/pl/shop/nieruchomosci-ewa-krzesinska-ID4149240",
  "agencyLogo": "",
  "agencyLicenseNumber": "875",
  "agencyPhones": [
    "+48 501 XXX XXX"
  ],
  "agencyAddress": "Aleja Piłsudskiego 56/2, 81-388, Gdynia, pomorskie",
  "agencyFeatures": [
    "N3DESTATE",
    "ACADEMY",
    "AD_HOMEPAGE_1_SCHEDULE",
    "ADDITIONAL_CONTACT_FORMS_AD_PAGE"
  ],
  "createdAt": "2026-08-31T10:55:06Z",
  "modifiedAt": "2026-10-02T14:26:35Z",
  "pushedUpAt": "2026-10-02T14:26:35Z",
  "isPromoted": false,
  "isExclusiveOffer": false,
  "isPremium": false,
  "openDay": null,
  "specialOffer": null,
  "developmentId": null,
  "developmentTitle": null,
  "developmentUrl": null,
  "investmentState": null,
  "investmentStateLabel": null,
  "investmentEstimatedDelivery": null,
  "investmentUnitsCount": null,
  "investmentAvailableUnits": null,
  "investmentUnitsAreaFrom": null,
  "investmentUnitsAreaTo": null,
  "investmentUnitsRoomsMin": null,
  "investmentUnitsRoomsMax": null,
  "status": "active",
  "statusLabel": "Active",
  "source": "urn:site:local",
  "sourceLabel": "otodom",
  "sourceType": "IMPORT",
  "sourceTypeLabel": "Imported from the advertiser's property software",
  "externalId": "KE06688",
  "referenceId": null,
  "attributes": {
    "build_year": "1987",
    "building_floors_num": "4",
    "building_ownership": "full_ownership",
    "building_type": "block",
    "construction_status": "ready_to_use",
    "equipment_types": [
      "fridge",
      "oven",
      "stove",
      "tv",
      "washing_machine"
    ],
    "extras_types": [
      "balcony",
      "basement",
      "separate_kitchen"
    ],
    "floor_no": "floor_2",
    "heating": "urban",
    "m": "47",
    "market": "secondary",
    "price_per_m": "12744.68",
    "rooms_num": "2",
    "security_types": [
      "entryphone"
    ]
  },
  "searchQuery": "Gdynia",
  "searchUrl": "https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/pomorskie/gdynia/gdynia/gdynia",
  "position": 409,
  "detailsIncluded": true,
  "scrapedAt": "2026-10-06T06:58:26.446870Z",
  "fingerprint": "1d7500b05f65c371"
}
```

### How much does it cost?

You pay per listing saved, with no extra charge for full details.

| Event | When charged | Price |
|---|---|---|
| Listing scraped | Once per listing saved | $1.99 per 1,000 |
| Actor start | Once per run (per GB of memory, default 1 GB) | $0.0099 |
| Result | Once per row stored | $0.00001 |

1,000 listings cost $1.99 + $0.0099 + $0.01 = **$2.01** on the free plan. Paid Apify plans pay less per listing: $1.79 per 1,000 on Bronze, $1.69 on Silver and $1.39 on Gold and above.

Set **Maximum results** to control the cost of a run. A search with no matching listings only costs the start fee.

### FAQ

**Does it return every listing a search has?**
Yes. The run reads the total that otodom.pl reports for your search and returns every listing in it, also for very large searches such as all flats for sale in Poland. Listings that appear in two of your searches are saved once.

**Do I get phone numbers?**
Yes, with **Include phone numbers and full details** on (the default). Agency listings also carry the contact person, the agency's licence number, office phones and address. A few listings publish no phone number; those rows have `phone: null`.

**Can I scrape a search I set up on otodom.pl?**
Paste its link into **Otodom links**. Filters and sort order are taken from the link; if one filter cannot be applied, the run log names it and the search runs without it. You can mix links with typed locations in one run.

**Does it cover rentals, houses, plots and new developments?**
Yes: flats, studios, houses, rooms, plots, commercial premises, halls and warehouses, garages and new developments, for sale and for rent.

**How do I track new listings or price changes?**
Schedule the actor in Apify Console, for example daily with `sortBy: "newest"` and `postedWithinDays: "1"` for new listings. To spot changes, compare `fingerprint` between runs: it changes when the price, description, photos or status change.

**Do I need an otodom account, cookies or a login?**
No. There is nothing to set up.

**Why did I get fewer listings than I expected?**
Check the run log: it states how many listings otodom.pl reported for each search. Your filters and **Maximum results** narrow that number. A location the site does not know is named in the log, and the other searches still run.

**Which export format should I use?**
CSV and Excel are convenient for prices, areas and contacts. JSON keeps nested data such as photo sizes, contact lists and location levels intact.

### Support

Found a bug or need a field? Open an issue in the **Issues** tab or write to max@mapa.slmail.me. We reply quickly.

*Collects publicly visible listing data from otodom.pl. You are responsible for using contact data in line with GDPR and otodom.pl's terms.*

# Actor input Schema

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

Cities, districts or regions to search, one per line: <code>Warszawa</code>, <code>Gdynia</code>, <code>Mokotów, Warszawa</code> or <code>pomorskie</code>. Polish letters are optional. Each location is a separate search. A location path copied from an otodom link (<code>mazowieckie/warszawa/warszawa/warszawa</code>) also works.<br>Leave this and <b>Otodom links</b> empty to search all of Poland.

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

Listings for sale or for rent. Applies to Locations; pasted links keep their own setting.

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

What to search for. New developments are whole projects from developers; their individual flats are included under Flats.

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

Stop after this many listings across all searches. Leave empty to get every listing the searches find. Each saved listing is charged.

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

Paste otodom.pl search result links, with any filters you set on the site, or single listing links (<code>/pl/oferta/...</code>, <code>/pl/inwestycja/...</code>). Each search link runs as a separate search with its own filters and sorting.

## `districts` (type: `array`):

Narrow each location to these districts, for example <code>Mokotów</code> and <code>Wola</code> for Warszawa. One search covers all of them.

## `radiusKm` (type: `string`):

Also include listings up to this distance outside each location.

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

Lowest total price, or lowest monthly rent for rentals.

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

Highest total price, or highest monthly rent for rentals.

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

Smallest floor area.

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

Largest floor area.

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

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

## `pricePerSquareMeterMin` (type: `integer`):

Lowest price per square metre.

## `pricePerSquareMeterMax` (type: `integer`):

Highest price per square metre.

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

New build from a developer, resale, or both.

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

Who placed the listing.

## `postedWithinDays` (type: `string`):

Only listings added recently. Leave empty for any age.

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

Oldest construction year.

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

Newest construction year.

## `keyword` (type: `string`):

Only listings whose description mentions this word, for example "balkon" or "ogród".

## `includeDetails` (type: `boolean`):

Adds phone numbers, contact people, agency licence number, address and phones, features, floor plans, video and virtual tour links and the listing status. No extra charge; keep it on unless you only need the search summary.

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

Order of results. Matters when you cap the number of results.

## `maxItemsPerSearch` (type: `integer`):

Cap each location or link separately, so one large city does not use up the total. Leave empty for no per-search cap.

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "locations": [
    "Warszawa"
  ],
  "maxItems": 100,
  "includeDetails": true
}
```

# Actor output Schema

## `listings` (type: `string`):

Every listing this run returned.

# 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 = {
    "locations": [
        "Warszawa"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/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 = {
    "locations": ["Warszawa"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath/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 '{
  "locations": [
    "Warszawa"
  ],
  "maxItems": 100
}' |
apify call clearpath/otodom-scraper --silent --output-dataset

```

## MCP server setup

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