Otodom.pl Property Scraper — Poland Sale & Rent
Pricing
from $2.00 / 1,000 result items
Otodom.pl Property Scraper — Poland Sale & Rent
Otodom.pl scraper for analysts, agents and AI agents: flats, studios, houses, plots, commercial, rooms and new developments for sale or rent anywhere in Poland.
Pricing
from $2.00 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Otodom.pl Scraper — Poland Real Estate for Sale & Rent
Structured listings from otodom.pl, Poland's largest property portal (OLX Group): flats, studios, houses, plots, commercial premises, warehouses, garages, rooms and new-build developments, for sale or rent, in any city, district or voivodeship. Every search supports otodom's own filters (price, zł/m², area, rooms, primary/secondary market, private/agency/developer, build year, floor, building type and material, extras…). Each item has price per m², advertiser type and publish dates. detail: true adds GPS coordinates, full description, building data and business contact details.
Reads the page's embedded JSON. No browser, no proxies, no API key.
Use cases
- Lead generation for agencies:
ownerType: "PRIVATE"+ your city +sinceHours: 24on a daily schedule gives owner-listed flats that no agency has picked up yet. - Price per m² benchmarks: pull 1 000 flats in Warszawa or Kraków, group by
district,market,buildYearand compute the medianpricePerM2. - Rental yield screening: run the same city and rooms once with
transaction: "sprzedaz"and once with"wynajem", then divide rent by price per district. - Developer & new-build intelligence:
market: "PRIMARY"+ownerType: "DEVELOPER"shows which developers sell where, at what zł/m²;estate: "inwestycja"lists whole projects. - Commercial property sourcing:
estate: "lokal"or"haleimagazyny"with area ranges, for investors and franchise expansion. - Valuation & due diligence: comparable listings with coordinates (
detail: true) around an address usingdistrict+distanceRadius.
Input
All fields are optional. Filters that don't apply to the estate type are dropped with a warning in the log.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
transaction | string | sprzedaz | sprzedaz (sale), wynajem (rent) |
estate | string | mieszkanie | mieszkanie, kawalerka, dom, inwestycja (sale only), pokoj (rent only), dzialka, lokal, haleimagazyny, garaz |
location | string | mazowieckie/warszawa/warszawa/warszawa | City name (see Reference), voivodeship slug, cala-polska, or a raw otodom location path |
district | string | – | District of the city, e.g. mokotow, praga-poludnie, podgorze |
distanceRadius | integer | – | 0, 5, 10, 15, 25, 50, 75 km around the location |
priceMin / priceMax | integer | – | zł (monthly rent for wynajem) |
pricePerMeterMin / pricePerMeterMax | integer | – | zł/m² |
areaMin / areaMax | integer | – | m² |
terrainAreaMin / terrainAreaMax | integer | – | m², dom and dzialka |
roomsNumber | string[] | [] | ONE, TWO, THREE, FOUR, FIVE, SIX_OR_MORE. Numbers ("2", "6+") and the v0.1 comma string ("TWO,THREE") also work. |
market | string | ALL | ALL, PRIMARY, SECONDARY |
ownerType | string | ALL | ALL, PRIVATE, AGENCY, DEVELOPER |
buildYearMin / buildYearMax | integer | – | |
floors | string[] | [] | CELLAR, GROUND, FIRST … TENTH, ABOVE_TENTH, GARRET (numbers 0–10 work too) |
floorsNumberMin / floorsNumberMax | integer | – | Floors in the building |
buildingType | string[] | [] | BLOCK, TENEMENT, HOUSE, INFILL, RIBBON, APARTMENT, LOFT |
buildingMaterial | string[] | [] | BRICK, WOOD, BREEZEBLOCK, HYDROTON, CONCRETE_PLATE, CONCRETE, SILIKAT, CELLULAR_CONCRETE, REINFORCED_CONCRETE, OTHER |
extras | string[] | [] | BALCONY, TERRACE, GARDEN, GARAGE, BASEMENT, LIFT, SEPARATE_KITCHEN, TWO_STOREY |
keyword | string | – | Text searched in the description |
hasPhotos / hasMovie / hasOpenDay / hasRemoteServices | boolean | false | |
sort | string | relevance | relevance, newest, price_asc, price_desc, area_asc, area_desc |
sinceHours | integer | – | Ads added or refreshed in the last N hours (otodom day filter + exact client check) |
excludeInvestments | boolean | false | Drop whole-project development tiles from flat searches |
maxItems | integer | 50 | 1–5000, 72 per page |
maxPages | integer | 30 | Safety cap |
detail | boolean | false | Open each offer page (+1 request per listing) |
dedupe | boolean | true | Drop repeated ids |
fields | string[] | [] | Output only these fields |
extraParams | object | {} | Other otodom query parameters from a URL |
The actor verified each filter value against the live site (the result count changes). Values otodom silently ignores (AIR_CONDITIONING, USABLE_ROOM, PETS…) are dropped with a warning instead of producing a misleading "filtered" dataset.
Reference
Voivodeships (location)
dolnoslaskie, kujawsko--pomorskie, lubelskie, lubuskie, lodzkie, malopolskie, mazowieckie, opolskie, podkarpackie, podlaskie, pomorskie, slaskie, swietokrzyskie, warminsko--mazurskie, wielkopolskie, zachodniopomorskie. Otodom writes a hyphen inside a name as a double hyphen (--).
Cities (location: the name, with or without Polish diacritics)
| City | otodom path |
|---|---|
| Warszawa | mazowieckie/warszawa/warszawa/warszawa |
| Kraków | malopolskie/krakow/krakow/krakow |
| Wrocław | dolnoslaskie/wroclaw/wroclaw/wroclaw |
| Łódź | lodzkie/lodz/lodz/lodz |
| Poznań | wielkopolskie/poznan/poznan/poznan |
| Gdańsk / Gdynia / Sopot | pomorskie/gdansk/gdansk/gdansk, pomorskie/gdynia/gdynia/gdynia, pomorskie/sopot/sopot/sopot |
| Szczecin | zachodniopomorskie/szczecin/szczecin/szczecin |
| Bydgoszcz / Toruń / Włocławek | kujawsko--pomorskie/bydgoszcz/…, kujawsko--pomorskie/torun/…, kujawsko--pomorskie/wloclawek/… |
| Lublin | lubelskie/lublin/lublin/lublin |
| Białystok | podlaskie/bialystok/bialystok/bialystok |
| Katowice, Gliwice, Sosnowiec, Bielsko-Biała, Częstochowa, Zabrze, Bytom, Tychy, Rybnik | slaskie/<city>/<city>/<city> (Bielsko-Biała → bielsko--biala) |
| Kielce | swietokrzyskie/kielce/kielce/kielce |
| Olsztyn, Elbląg | warminsko--mazurskie/olsztyn/…, warminsko--mazurskie/elblag/… |
| Opole | opolskie/opole/opole/opole |
| Zielona Góra, Gorzów Wielkopolski | lubuskie/zielona-gora/…, lubuskie/gorzow-wielkopolski/… |
| Rzeszów, Przemyśl | podkarpackie/rzeszow/…, podkarpackie/przemysl/… |
| Radom, Płock, Pruszków, Piaseczno | mazowieckie/radom/…, mazowieckie/plock/…, mazowieckie/pruszkowski/pruszkow/pruszkow, mazowieckie/piaseczynski/piaseczno/piaseczno |
| Tarnów, Nowy Sącz, Zakopane | malopolskie/tarnow/…, malopolskie/nowy-sacz/…, malopolskie/tatrzanski/zakopane/zakopane |
| Wałbrzych, Legnica, Jelenia Góra | dolnoslaskie/walbrzych/…, dolnoslaskie/legnica/…, dolnoslaskie/jelenia-gora/… |
| Kalisz | wielkopolskie/kalisz/kalisz/kalisz |
| Koszalin, Świnoujście | zachodniopomorskie/koszalin/…, zachodniopomorskie/swinoujscie/… |
| Słupsk | pomorskie/slupsk/slupsk/slupsk |
| Piotrków Trybunalski | lodzkie/piotrkow-trybunalski/… |
Any other town works as a raw path copied from an otodom URL (the part after /pl/wyniki/sprzedaz/mieszkanie/). A wrong path fails with a clear 404 error.
Warsaw districts (district): bemowo, bialoleka, bielany, mokotow, ochota, praga-polnoc, praga-poludnie, rembertow, srodmiescie, targowek, ursus, ursynow, wawer, wesola, wilanow, wlochy, wola, zoliborz.
Estate types
| Slug | Meaning | Sale | Rent |
|---|---|---|---|
mieszkanie | Flats | ✓ | ✓ |
kawalerka | Studio flats | ✓ | ✓ |
dom | Houses | ✓ | ✓ |
inwestycja | New-build development projects | ✓ | – |
pokoj | Rooms | – | ✓ |
dzialka | Plots | ✓ | ✓ |
lokal | Commercial premises | ✓ | ✓ |
haleimagazyny | Halls & warehouses | ✓ | ✓ |
garaz | Garages | ✓ | ✓ |
Examples
Agency lead list: owner-listed flats in Kraków from the last 24 h
{ "location": "Kraków", "ownerType": "PRIVATE", "sinceHours": 24, "sort": "newest", "maxItems": 200 }
Market report: 2–3 room resale flats in Warsaw Mokotów with building data
{ "location": "Warszawa", "district": "mokotow", "market": "SECONDARY", "roomsNumber": ["TWO", "THREE"], "excludeInvestments": true, "detail": true, "maxItems": 300 }
Rental yield: flats for rent in Wrocław under 4 000 zł
{ "transaction": "wynajem", "location": "Wrocław", "priceMax": 4000, "areaMin": 35, "maxItems": 500, "fields": ["id", "price", "rentAdditional", "area", "rooms", "district", "url"] }
Developer intelligence: primary-market flats in Gdańsk, cheapest per listing
{ "location": "Gdańsk", "market": "PRIMARY", "ownerType": "DEVELOPER", "sort": "price_asc", "maxItems": 500 }
Warehouse sourcing: halls for rent around Poznań, 500+ m²
{ "transaction": "wynajem", "estate": "haleimagazyny", "location": "Poznań", "distanceRadius": 25, "areaMin": 500, "detail": true }
Output
Example item (location: "Kraków", detail: true, trimmed):
{"id": "68412264","url": "https://www.otodom.pl/pl/oferta/rodzinne-mieszkanie-z-widokiem-na-park-kobierzynska-ID4D39C","title": "Rodzinne mieszkanie z widokiem na park. Kobierzyńska","estate": "FLAT","transaction": "SELL","price": 950000,"currency": "PLN","priceType": "total","rentAdditional": 700,"pricePerM2": 12686.97,"area": 74.88,"rooms": 3,"floor": 2,"province": "małopolskie","city": "Kraków","district": "Dębniki","residential": "Ruczaj","advertiserType": "private","isPrivateOwner": true,"isPromoted": true,"tags": ["BALCONY", "STORAGE_ROOM", "PARKING_SPOT", "SECURE_BUILDING"],"publishedAt": "2026-09-12T20:37:11.000Z","firstPublishedAt": "2026-09-12T20:34:03.000Z","imagesCount": 11,"searchTotal": 13,"fetchedAt": "2026-09-13T08:34:20.669Z","descriptionFull": "-- Bez prowizji od kupującego --\nSprzedam przestronne mieszkanie…","market": "secondary","latitude": 50.015842,"longitude": 19.903831,"buildYear": 2006,"buildingFloors": 3,"buildingType": "block","heating": "gas","windows": "plastic","extras": ["balcony", "usable_room", "garage"],"equipment": ["furniture", "washing_machine", "dishwasher"],"freeFrom": "2026-10-01","ownerName": "Bogna Smug","ownerPhones": [],"detailFetched": true}
| Field | Description |
|---|---|
id, url, title | otodom ad id (stable), offer URL, title |
estate, transaction | FLAT, HOUSE, INVESTMENT, TERRAIN, … / SELL, RENT |
price, currency, priceType | Total price (sale) or monthly rent (rent); on_request when hidden |
rentAdditional | Monthly administrative fee (czynsz) in zł, if given |
pricePerM2, priceFromPerM2 | From otodom, or computed as price / area; "from" price for developments |
area, terrainArea, rooms, roomsCode, floor, floorCode | Size and layout (floor: -1 cellar, 0 ground, 11 = above 10) |
province, city, district, residential, street, locationPath | Location |
advertiserType, isPrivateOwner, agencyName, agencyId, agencyUrl | private / agency / developer |
developmentId, developmentTitle, developmentUrl | Parent new-build project |
isPromoted, isExclusiveOffer, hidePrice, tags | |
publishedAt, firstPublishedAt, pushedUpAt | Last added/refreshed, first appearance, paid bump (ISO UTC) |
shortDescription, image, imagesCount, searchTotal, searchUrl, fetchedAt | |
descriptionFull, market, latitude, longitude, buildYear, buildingFloors, buildingType, buildingMaterial, constructionStatus, ownership, heating, windows, extras, equipment, security, media, deposit, freeFrom, ownerName, ownerAddress, ownerPhones, agencyUrl, status, createdAt, modifiedAt, photos, characteristics, detailFetched, detailError | detail: true only. Phones and address are included only for agencies and developers, never for private owners. |
Use it from code / agents
Apify API (curl)
curl -X POST "https://api.apify.com/v2/acts/yadroo~otodom-pl/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"location":"Gdańsk","ownerType":"PRIVATE","sinceHours":24}'
JavaScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/otodom-pl').call({ location: 'Warszawa', district: 'wola', market: 'PRIMARY', maxItems: 200 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/otodom-pl").call(run_input={"transaction": "wynajem", "location": "Kraków", "priceMax": 3500})items = client.dataset(run["defaultDatasetId"]).list_items().items
AI agents (MCP): connect https://mcp.apify.com?actors=yadroo/otodom-pl to Claude, Cursor or any MCP client. The input schema is written for agents: every enum has readable titles and every filter explains its unit.
Pricing
Pay per event: $0.005 per run start + $0.002 per listing in the dataset.
- 50 listings (default): $0.105
- 1 000-listing city snapshot: $2.005
- Daily alert returning about 30 new owner listings: about $0.065 per day
detail: true doesn't change the price. It is slower, about 1.2 s per listing.
Limits & FAQ
- Speed: 72 listings per search page, about 1 request per second. 1 000 listings take about 20 s without detail pages.
- Promoted and development tiles: otodom mixes promoted ads and
INVESTMENTtiles into flat searches. Dedupe removes repeats;excludeInvestmentsremoves project tiles. - Dates:
publishedAtis when the ad was last added or refreshed (this is what otodom's "added in the last N days" filter uses). For truly new ads, comparefirstPublishedAt. - Blocks & errors: 429/5xx are retried with backoff. A bot challenge on a search page fails the run with a clear message. If only offer pages get blocked, the run keeps list data and marks items with
detailError. - Personal data: phone numbers and addresses of private owners are never collected.
- Roadmap: price-change tracking between runs, a developer-project mode (units per
inwestycja).
Made by Yadroo. Sibling actors: Willhaben.at (Austria) · Kleinanzeigen.de (Germany) · Rightmove UK · Krisha.kz · Marktplaats.nl · AutoScout24 cars