Otodom.pl Property Scraper — Poland Sale & Rent
Pricing
from $1.40 / 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 $1.40 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
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 | – (all of Poland) | City name (see Reference), voivodeship slug, cala-polska, or a raw otodom location path. The form is prefilled with Warszawa |
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 (any of) |
market | string | ALL | ALL, PRIMARY, SECONDARY |
ownerType | string | ALL | ALL, PRIVATE, AGENCY, DEVELOPER |
buildYearMin / buildYearMax | integer | – | Build year range, e.g. 2000–2025 |
floors | string[] | [] | CELLAR, GROUND, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH, TENTH, ABOVE_TENTH, GARRET (any of) |
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 (all must be present) |
keyword | string | – | Text searched in the description |
hasPhotos / hasMovie / hasOpenDay / hasRemoteServices | boolean | false | Only ads with photos / a video / an open day / remote viewing |
sort | string | relevance | relevance, newest, price_asc, price_desc, area_asc, area_desc |
sinceHours | integer | – | Ads added or refreshed in the last N hours. Up to 720 h: otodom's day filter + an exact check; above 720 h the actor checks the time itself (otodom's filter stops at 30 days) |
excludeInvestments | boolean | false | Drop the new-build project rows (listingType: "investment") from flat searches; the flats inside projects are kept |
maxItems | integer | 50 | 1–5000 listings, 72 per search page. See Limits for how many fit into one run |
maxPages | integer | – (as many as maxItems needs, up to 200) | Optional cap on search pages; the status says when it ended paging |
detail | boolean | false | Open each offer page (+1 request per listing, about 1.7 s each) |
dedupe | boolean | true | Kept for older inputs, no effect: each listing id is saved (and charged) at most once per run |
fields | string[] | [] | Output only these fields, in this order (id always kept). A wrong case or small typo is corrected and reported; unknown names are left out with a warning; if none is valid the run fails with the list |
extraParams | object | {} | Other otodom query parameters from a URL |
Every filter value in the lists above was verified against the live site (the result count changes). Values otodom's search silently ignores (AIR_CONDITIONING, USABLE_ROOM, PETS…) are left out of the extras list on purpose. Select fields accept only the listed values: Apify refuses any other value before the run starts (no run, no charge).
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","listingType": "listing","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 |
listingType | listing (a flat, house, plot… with its own price) or investment (a whole new-build project) |
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 (filled for units of a development) |
investmentUnits, investmentState, investmentDelivery, investmentAreaMin, investmentAreaMax, investmentRoomsMin, investmentRoomsMax, investmentFloorMin, investmentFloorMax | Project rows only: number of units, IN_BUILDING / READY…, estimated delivery (2027-Q4), unit size, room and floor ranges. price is empty on project rows (priceType: "from_per_m2"); see priceFromPerM2 |
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. Bronze −10 %, Silver −20 %, Gold and above −30 % on the listing price; the start event is the same on every plan; platform usage is included.
- 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.7 s per listing.
The run never costs more than your Maximum cost per run: it stops at that limit, keeps every listing saved so far and ends with "Stopped at your spending limit: N rows delivered".
Limits & FAQ
- Speed (measured 02.10.2026): about 1 000 listings per minute without detail pages (72 per search page). With
detail: trueabout 1.7 s per listing, so about 2 000 listings fit into the default 1-hour run timeout; for more, raise the run timeout or split the search (district, price range). - Timeout and restarts: listings are saved as they are ready (per search page, or in batches of 10 with
detail: true), never all at the end. A run that nears its timeout stops starting new pages, keeps everything saved and ends SUCCEEDED with "Stopped before the run timeout: N rows saved". After a platform migration or restart the run skips the listings it already saved: none is stored or charged twice. - Run summary: the key-value store record
SUMMARYholds the counts (saved, skipped bysinceHours/excludeInvestments, offer pages read / failed / blocked), the search URL and why the run stopped. - New-build (primary market) searches: otodom groups the flats of one development into a single project tile, so a page of 72 flats can show only 1–8 tiles and the site's total (e.g. "3 517 results") counts flats, not tiles. The actor opens every tile: each project becomes one
investmentrow followed by its flats as normallistingrows with price, area, rooms, floor anddevelopmentTitle. Paging continues while otodom reports more pages, even when a page brings only repeats of a project already seen.excludeInvestments: truekeeps only the flats. A tile carries the flats that match your filters on that page, not the full price list of the project. - Promoted copies: otodom adds a duplicate of one ad to some pages under a fake id with a 1999 date. The actor drops the copy (or, if the original is not on the page, keeps it under the real id without the fake dates). Ads and projects repeated across pages are saved once.
- 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 block or bot challenge on the first search page fails the run with a clear message. If a later search page fails, the run keeps the listings saved so far and the status names the page. If offer pages get blocked, the run keeps the list data, marks those listings with
detailErrorand says so in the status. No blocks were seen in 1 300 test requests (02.10.2026). - Personal data: phone numbers and addresses of private owners are never collected.
- Roadmap: price-change tracking between runs, the full unit list of a single
inwestycjaproject.
Made by Yadroo. Sibling actors: Willhaben.at (Austria) · Kleinanzeigen.de (Germany) · Rightmove UK · Krisha.kz · Marktplaats.nl · AutoScout24 cars