Otodom Scraper · Polish Property Listings & Agents · $2/1k
Pricing
from $2.00 / 1,000 results
Otodom Scraper · Polish Property Listings & Agents · $2/1k
Scrape otodom.pl Polish property listings — sale or rent search (with any filters) and individual offers. Returns address, rooms, m², price, price/m², geo-coordinates, agency contacts (with phone numbers) and photos in clean JSON/CSV. Pure HTTP, no browser
Pricing
from $2.00 / 1,000 results
Rating
5.0
(1)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
37
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Otodom Scraper - Polish Property Listings, Prices & Agents
Scrape otodom.pl - Poland's largest property portal - by pasting any sale or rent search URL, by typing a place name and picking filters, or by listing individual offers. Every listing comes back in one clean schema: full address down to the neighbourhood, rooms, m², price, price/m², monthly charges (czynsz), GPS coordinates, building details, the listing agent's name and direct phone, agency contacts and photos. Schedule it in monitoring mode and get only new listings and price changes. Pure HTTP, no browser.

Why use this scraper
- Every page of every search - the actor walks a search to its last page (a 3,400-listing Kraków rental search returns ~3,400 rows), honouring whatever filters are in the URL.
- No URL needed - type
Kraków,MokotóworGdynia Orłowo, pick sale/rent, property type, price, area, rooms, build year, private owners only and "posted in the last N days". Place names are matched with otodom's own location search, so any town, district or village works. - The agent's direct phone - each offer's listing agent (name + mobile), separate from the agency's office line. On private listings, the owner's name and phone.
- Full building details - heating, building type and material, windows, ownership, construction status, monthly charges, deposit, available-from date, floor plans, virtual tour links.
- Monitoring mode - run it on a schedule and receive only listings that are new or changed price since the last run, flagged
NEW/PRICE_CHANGEDwith the previous price. - Fast mode - turn off
fetchDetailsto read rows straight from the search results, several times faster, for price and inventory tracking. - Pure HTTP, no browser - reads otodom's embedded
__NEXT_DATA__JSON directly.
Overview
otodom is a Next.js site that embeds the full structured listing data in each page (__NEXT_DATA__). The actor classifies each URL (search / offer), walks search results page by page up to pagination.totalPages, then either opens each offer page for the full record or emits the search card as it is. Ideal for analysts, investors, PropTech teams, and B2B lead generation in the Polish market.
Supported inputs
| Input | Example |
|---|---|
| Sale search URL | otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa |
| Rent search URL | otodom.pl/pl/wyniki/wynajem/mieszkanie/malopolskie/krakow/krakow/krakow |
| Filtered search URL | …/wyniki/sprzedaz/mieszkanie/…?priceMin=500000&roomsNumber=%5BTWO%2CTHREE%5D |
| Individual offer URL | otodom.pl/pl/oferta/{slug} |
| Place name + filters | locations: ["Kraków", "Mokotów"], transaction: "rent", priceMax: 4000 |
Tip: run a search on otodom.pl, then copy the URL from your browser's address bar - the filter parameters drop straight into
startUrls.
Use cases
- Investors & analysts - track asking prices, price/m² and monthly charges by city, district, neighbourhood and market segment.
- Lead generation - agent names with direct mobiles, agency offices with licence numbers, or private sellers only (
advertiserType: "private"). - New-listing alerts - schedule monitoring mode with
postedWithinDays: 1and get each day's new listings and price cuts. - PropTech / data teams - feed structured Polish property data (with GPS) into valuation models, CRMs and dashboards.
How it works
- Start URLs are used as they are. Each entry in
locationsis resolved to an otodom location and turned into a search URL with your filters. - Each search is walked page by page (72 listings per page) to its last page or to
maxItems. - With
fetchDetailson, every offer page is parsed for the full record; with it off, the search card becomes the row. - In monitoring mode, listings seen in earlier runs with an unchanged price are skipped before any offer page is fetched.
- Rows are normalised to one schema and streamed to your dataset - JSON, CSV or Excel.
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | - | otodom.pl URLs (search or offer) |
locations | array | - | Place names (Kraków, Mokotów), a voivodeship, cala-polska, or an otodom location path. One search per entry. |
transaction | string | sale | sale or rent |
propertyType | string | apartment | apartment, studio, house, plot, commercial, warehouse, garage, room, investment |
market | string | all | all, primary (new build), secondary (resale) |
advertiserType | string | all | all, private, agency, developer |
priceMin / priceMax | integer | - | Price range in PLN (monthly rent for rentals) |
areaMin / areaMax | integer | - | Floor area range in m² |
roomsMin / roomsMax | integer | - | 1-6 (6 = six or more) |
buildYearMin / buildYearMax | integer | - | Construction year range |
postedWithinDays | integer | - | 1, 3, 7, 14 or 30 |
sortBy | string | default | newest, price_asc, price_desc, area_asc, area_desc |
fetchDetails | boolean | true | Open every offer page for the full record. Off = search-card rows only. |
flatten | boolean | true | Flatten nested fields for CSV-friendly output |
includeRaw | boolean | false | Add otodom's complete source record as rawJson |
monitoringMode | boolean | false | Return only new listings and price changes since the last run |
monitorName | string | - | Share one monitoring history across runs with the same name |
enrichEmails | boolean | false | Find a contact email for each listing's agency (billed per email found) |
maxItems | integer | 10000 | Hard cap on rows |
maxConcurrency | integer | 6 | Parallel offer fetches |
The filters apply to locations only; a pasted search URL keeps its own filters.
Output overview
One row per listing. dataSource tells you where it came from:
detail(default,fetchDetails: true) - the full record from the offer page.search(fetchDetails: false) - the search results card. It has price, monthly charges, area, rooms, floor, full address, agent/agency name, private-owner flag and dates, but no phones, GPS, description or building details, andphotosholds only the first few images (photosCountis the listing's total).
Nested objects (address, agency) flatten to underscore keys (address_city, agency_name) when flatten is on. Disable flatten for nested JSON.
Output samples
Flattened detail row (flatten: true, default) - contact details replaced with placeholders:
{"portal": "otodom","dataSource": "detail","canonicalUrl": "https://www.otodom.pl/pl/oferta/oddzielna-kuchnia-duza-piwnica-balkon-ID4DhBE","listingId": "68467818","listingMode": "sale","propertyType": "apartment","advertiserType": "agency","isPrivateOwner": false,"marketType": "secondary","title": "| Oddzielna Kuchnia | Duża Piwnica | Balkon |","rooms": 3,"areaSqm": 52,"floorNumber": 3,"floorLabel": "floor_3","buildingFloors": 4,"buildYear": 1962,"priceExact": 800000,"priceCurrency": "PLN","pricePerSqm": 15384.62,"priceDisplay": "800 000 zł","monthlyCharges": 900,"heating": "urban","buildingType": "block","windowsType": "plastic","ownership": "full_ownership","constructionStatus": "ready_to_use","features": ["balcony", "basement"],"address_displayAddress": "Antoniego Magiera, Słodowiec, Bielany, Warszawa, mazowieckie","address_street": "Antoniego Magiera","address_neighbourhood": "Słodowiec","address_district": "Bielany","address_city": "Warszawa","address_province": "mazowieckie","address_locationId": "mazowieckie/warszawa/warszawa/warszawa/bielany/slodowiec","latitude": 52.27199,"longitude": 20.94896,"photosCount": 9,"contactName": "Jan Kowalski","contactPhones": ["+48500000000"],"agency_name": "PURE ESTATES","agency_type": "agency","agency_phones": ["+48600000000"],"agency_address": "Batalionu AK Bałtyk 9 lok. U5, 00-713, Warszawa, mazowieckie","agency_url": "https://www.otodom.pl/pl/firmy/biura-nieruchomosci/pure-estates-ID8891460","isExclusiveOffer": false,"status": "active","dateCreated": "2026-09-28T10:47:53Z","dateModified": "2026-09-28T10:48:04Z"}
Monitoring mode adds:
{ "changeType": "PRICE_CHANGED", "previousPrice": 2611, "priceExact": 2500, "firstSeenAt": "2026-09-28T10:53:58.000Z" }
Key output fields
| Field | Description |
|---|---|
dataSource | detail (offer page) or search (search card) |
listingId, slug, canonicalUrl | Identity |
listingMode | sale / rent |
propertyType, marketType | apartment / studio / house / plot / commercial / … · primary / secondary |
advertiserType, isPrivateOwner | agency / developer / private |
title, description | Listing copy (description as plain text) |
address / address_* | street, streetNumber, neighbourhood, district, city, county, province, postcode, locationId |
latitude, longitude | Exact GPS (detail rows) |
rooms, areaSqm, plotAreaSqm, floorNumber, floorLabel, buildingFloors, buildYear | Specs |
priceExact, priceCurrency, pricePerSqm, priceDisplay, hidePrice | Pricing |
monthlyCharges, deposit, availableFrom | Czynsz, rental deposit, move-in date |
heating, buildingType, buildingMaterial, windowsType, ownership, constructionStatus | Building details (otodom codes, e.g. urban, block, full_ownership) |
features[] | Extras, security, equipment and media (e.g. balcony, lift, furniture, internet) |
photos[], photosCount, floorPlans[], videoUrl, virtualTourUrl | Media |
contactName, contactPhones[] | The listing agent (their own mobile), or the owner on a private listing |
agency / agency_* | Agency or developer: name, office phones, licence number, address, profile URL |
isExclusiveOffer, isPromoted | Listing flags |
developmentId, developmentTitle, developmentUrl | New-build development the unit belongs to |
dateCreated, dateModified, datePushedUp | Listing timestamps |
changeType, previousPrice, firstSeenAt | Monitoring mode only |
Monitoring mode
Turn on monitoringMode and schedule the actor (daily, hourly). The first run returns every matching listing and remembers it. Each later run returns only:
NEW- listings not returned by an earlier run, andPRICE_CHANGED- listings whose price moved, withpreviousPriceandfirstSeenAt.
Unchanged listings are skipped before any offer page is fetched, so they are not billed. History is kept in a key-value store named otodom-monitor in your Apify account, one record per monitor. Runs with the same monitorName share a history; without a name, the history is tied to the exact searches in the input. To keep scheduled runs small, combine it with sortBy: "newest" and postedWithinDays.
FAQ
How many listings can I get from one search?
All of them. The actor follows otodom's page count to the last page. Use maxItems to cap the run.
Can I search without building a URL?
Yes. Put place names in locations (Kraków, Mokotów, Gdynia Orłowo, pomorskie, cala-polska) and set the filters. A place otodom does not know is reported in the log and skipped.
What's the difference between contactPhones and agency_phones?
contactPhones is the individual agent handling the listing (usually a mobile). agency_phones is the agency's office line. On a private listing, contactPhones is the owner and agency is empty.
Should I turn off fetchDetails?
Turn it off for price and inventory tracking across large searches: it is several times faster. Keep it on when you need phones, GPS, descriptions or building details.
Does it cover rentals?
Yes - wynajem (rent) search URLs, or transaction: "rent". For rentals, priceExact is the monthly rent and monthlyCharges the administrative charges on top.
What about anti-bot? otodom uses DataDome, which is passive at normal volume. Traffic runs through the actor's built-in residential proxy; failed pages are retried on a fresh session.
Why is a price sometimes missing?
A small share of listings hide their price (developer "cesja"/assignment offers) - hidePrice is true for those.
Support
Found a bug or need a field added? Open an issue on the actor's Apify Console page.
Explore more scrapers
- Idealista Scraper - Spain / Portugal / Italy property
- ImmobilienScout24 Scraper - German property
- Funda Scraper - Dutch property
- Rightmove Scraper - UK property
Full portfolio: apify.com/memo23
🤖 For AI Agents & LLM Apps
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/otodom-scraper).
Purpose: Scrapes otodom.pl Polish property listings - search URLs, place names with filters, or individual offers - into one clean schema with price, monthly charges, GPS, building details, the listing agent's direct phone and agency contacts. Optional monitoring mode returns only new listings and price changes.
Minimal input (by URL):
{"startUrls": ["https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"],"maxItems": 50}
Minimal input (by place name and filters):
{"locations": ["Kraków"],"transaction": "rent","propertyType": "apartment","priceMax": 4000,"roomsMin": 2,"postedWithinDays": 7,"maxItems": 50}
Output: one row per listing - dataSource (detail/search), listingId, slug, canonicalUrl, listingMode (sale/rent), propertyType, advertiserType, isPrivateOwner, marketType, title, description, address {street, streetNumber, neighbourhood, district, city, county, province, postcode, locationId}, latitude, longitude, rooms, areaSqm, plotAreaSqm, floorNumber, floorLabel, buildingFloors, buildYear, priceExact, priceCurrency, pricePerSqm, priceDisplay, hidePrice, monthlyCharges, deposit, availableFrom, heating, buildingType, buildingMaterial, windowsType, ownership, constructionStatus, features[], photos[], photosCount, floorPlans[], videoUrl, virtualTourUrl, contactName, contactPhones[], agency {name, type, phones, licenseNumber, address, url}, isExclusiveOffer, isPromoted, developmentId/Title/Url, status, dateCreated, dateModified, datePushedUp. With flatten: true (default) nested address/agency expand to address_* / agency_* keys. Monitoring mode adds changeType (NEW/PRICE_CHANGED), previousPrice, firstSeenAt. With enrichEmails on, adds contactEmail, contactWebsite and an emailEnrichment object.
Behaviors an agent should know:
startUrlsare auto-classified: search URLs (/wyniki/sprzedaz/...or/wynajem/...) are walked to their last page and fanned out to offers;/oferta/{slug}URLs are scraped directly.locationsaccepts Polish place names (cities, districts, towns, voivodeships) orcala-polska; the filter fields apply only to these.- Always set
maxItems(default 10000). fetchDetails: falsereturns search-card rows: faster, but no phones, GPS or building details.monitoringMode: truereturns only new or re-priced listings compared with the previous run of the same searches (or the samemonitorName); an empty dataset means nothing changed.- Keep
maxConcurrencyat 4-8; a residential proxy is built in,proxyis an optional override. - Only public listing pages are read - no login-gated or paid content.
- Pay-per-event billing - see the Pricing tab on the actor page.
⚠️ Disclaimer
This scraper accesses only publicly available data. Use the extracted data in compliance with otodom.pl's Terms of Use, the GDPR, Polish law, and all applicable regulations. You are responsible for how you use scraped data - particularly personal information (agent names, phone numbers). This actor is not affiliated with, endorsed by, or connected to otodom.pl, OLX Group, or Adevinta.
SEO Keywords
otodom scraper, otodom.pl scraper, polish property scraper, poland real estate scraper, otodom api, mieszkania scraper, nieruchomości scraper, property listings poland, real estate data poland, otodom prices scraper, polish property data, warszawa property scraper, krakow real estate scraper, property leads poland, agent phone numbers poland, otodom new listings alert, otodom price monitoring, czynsz data