Otodom.pl Property Scraper — Poland Sale & Rent avatar

Otodom.pl Property Scraper — Poland Sale & Rent

Pricing

from $1.40 / 1,000 result items

Go to Apify Store
Otodom.pl Property Scraper — Poland Sale & Rent

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

Samat Makatov

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

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: 24 on 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, buildYear and compute the median pricePerM2.
  • 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 using district + distanceRadius.

Input

All fields are optional. Filters that don't apply to the estate type are dropped with a warning in the log.

FieldTypeDefaultAllowed values / notes
transactionstringsprzedazsprzedaz (sale), wynajem (rent)
estatestringmieszkaniemieszkanie, kawalerka, dom, inwestycja (sale only), pokoj (rent only), dzialka, lokal, haleimagazyny, garaz
locationstring– (all of Poland)City name (see Reference), voivodeship slug, cala-polska, or a raw otodom location path. The form is prefilled with Warszawa
districtstring–District of the city, e.g. mokotow, praga-poludnie, podgorze
distanceRadiusinteger–0, 5, 10, 15, 25, 50, 75 km around the location
priceMin / priceMaxinteger–zł (monthly rent for wynajem)
pricePerMeterMin / pricePerMeterMaxinteger–zł/m²
areaMin / areaMaxinteger–m²
terrainAreaMin / terrainAreaMaxinteger–m², dom and dzialka
roomsNumberstring[][]ONE, TWO, THREE, FOUR, FIVE, SIX_OR_MORE (any of)
marketstringALLALL, PRIMARY, SECONDARY
ownerTypestringALLALL, PRIVATE, AGENCY, DEVELOPER
buildYearMin / buildYearMaxinteger–Build year range, e.g. 2000–2025
floorsstring[][]CELLAR, GROUND, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH, TENTH, ABOVE_TENTH, GARRET (any of)
floorsNumberMin / floorsNumberMaxinteger–Floors in the building
buildingTypestring[][]BLOCK, TENEMENT, HOUSE, INFILL, RIBBON, APARTMENT, LOFT
buildingMaterialstring[][]BRICK, WOOD, BREEZEBLOCK, HYDROTON, CONCRETE_PLATE, CONCRETE, SILIKAT, CELLULAR_CONCRETE, REINFORCED_CONCRETE, OTHER
extrasstring[][]BALCONY, TERRACE, GARDEN, GARAGE, BASEMENT, LIFT, SEPARATE_KITCHEN, TWO_STOREY (all must be present)
keywordstring–Text searched in the description
hasPhotos / hasMovie / hasOpenDay / hasRemoteServicesbooleanfalseOnly ads with photos / a video / an open day / remote viewing
sortstringrelevancerelevance, newest, price_asc, price_desc, area_asc, area_desc
sinceHoursinteger–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)
excludeInvestmentsbooleanfalseDrop the new-build project rows (listingType: "investment") from flat searches; the flats inside projects are kept
maxItemsinteger501–5000 listings, 72 per search page. See Limits for how many fit into one run
maxPagesinteger– (as many as maxItems needs, up to 200)Optional cap on search pages; the status says when it ended paging
detailbooleanfalseOpen each offer page (+1 request per listing, about 1.7 s each)
dedupebooleantrueKept for older inputs, no effect: each listing id is saved (and charged) at most once per run
fieldsstring[][]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
extraParamsobject{}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)

Cityotodom path
Warszawamazowieckie/warszawa/warszawa/warszawa
Krakówmalopolskie/krakow/krakow/krakow
Wrocławdolnoslaskie/wroclaw/wroclaw/wroclaw
Łódźlodzkie/lodz/lodz/lodz
Poznańwielkopolskie/poznan/poznan/poznan
Gdańsk / Gdynia / Sopotpomorskie/gdansk/gdansk/gdansk, pomorskie/gdynia/gdynia/gdynia, pomorskie/sopot/sopot/sopot
Szczecinzachodniopomorskie/szczecin/szczecin/szczecin
Bydgoszcz / Toruń / Włocławekkujawsko--pomorskie/bydgoszcz/…, kujawsko--pomorskie/torun/…, kujawsko--pomorskie/wloclawek/…
Lublinlubelskie/lublin/lublin/lublin
Białystokpodlaskie/bialystok/bialystok/bialystok
Katowice, Gliwice, Sosnowiec, Bielsko-Biała, Częstochowa, Zabrze, Bytom, Tychy, Rybnikslaskie/<city>/<city>/<city> (Bielsko-Biała → bielsko--biala)
Kielceswietokrzyskie/kielce/kielce/kielce
Olsztyn, Elblągwarminsko--mazurskie/olsztyn/…, warminsko--mazurskie/elblag/…
Opoleopolskie/opole/opole/opole
Zielona Góra, Gorzów Wielkopolskilubuskie/zielona-gora/…, lubuskie/gorzow-wielkopolski/…
Rzeszów, Przemyślpodkarpackie/rzeszow/…, podkarpackie/przemysl/…
Radom, Płock, Pruszków, Piasecznomazowieckie/radom/…, mazowieckie/plock/…, mazowieckie/pruszkowski/pruszkow/pruszkow, mazowieckie/piaseczynski/piaseczno/piaseczno
Tarnów, Nowy Sącz, Zakopanemalopolskie/tarnow/…, malopolskie/nowy-sacz/…, malopolskie/tatrzanski/zakopane/zakopane
Wałbrzych, Legnica, Jelenia Góradolnoslaskie/walbrzych/…, dolnoslaskie/legnica/…, dolnoslaskie/jelenia-gora/…
Kaliszwielkopolskie/kalisz/kalisz/kalisz
Koszalin, Świnoujściezachodniopomorskie/koszalin/…, zachodniopomorskie/swinoujscie/…
Słupskpomorskie/slupsk/slupsk/slupsk
Piotrków Trybunalskilodzkie/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

SlugMeaningSaleRent
mieszkanieFlats✓✓
kawalerkaStudio flats✓✓
domHouses✓✓
inwestycjaNew-build development projects✓–
pokojRooms–✓
dzialkaPlots✓✓
lokalCommercial premises✓✓
haleimagazynyHalls & warehouses✓✓
garazGarages✓✓

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
}
FieldDescription
id, url, titleotodom ad id (stable), offer URL, title
listingTypelisting (a flat, house, plot… with its own price) or investment (a whole new-build project)
estate, transactionFLAT, HOUSE, INVESTMENT, TERRAIN, … / SELL, RENT
price, currency, priceTypeTotal price (sale) or monthly rent (rent); on_request when hidden
rentAdditionalMonthly administrative fee (czynsz) in zł, if given
pricePerM2, priceFromPerM2From otodom, or computed as price / area; "from" price for developments
area, terrainArea, rooms, roomsCode, floor, floorCodeSize and layout (floor: -1 cellar, 0 ground, 11 = above 10)
province, city, district, residential, street, locationPathLocation
advertiserType, isPrivateOwner, agencyName, agencyId, agencyUrlprivate / agency / developer
developmentId, developmentTitle, developmentUrlParent new-build project (filled for units of a development)
investmentUnits, investmentState, investmentDelivery, investmentAreaMin, investmentAreaMax, investmentRoomsMin, investmentRoomsMax, investmentFloorMin, investmentFloorMaxProject 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, pushedUpAtLast 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, detailErrordetail: 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 ApifyClient
client = 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: true about 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 SUMMARY holds the counts (saved, skipped by sinceHours / 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 investment row followed by its flats as normal listing rows with price, area, rooms, floor and developmentTitle. Paging continues while otodom reports more pages, even when a page brings only repeats of a project already seen. excludeInvestments: true keeps 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: publishedAt is 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, compare firstPublishedAt.
  • 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 detailError and 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 inwestycja project.

Made by Yadroo. Sibling actors: Willhaben.at (Austria) · Kleinanzeigen.de (Germany) · Rightmove UK · Krisha.kz · Marktplaats.nl · AutoScout24 cars