Otodom Scraper · Polish Property Listings & Agents · $2/1k avatar

Otodom Scraper · Polish Property Listings & Agents · $2/1k

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Otodom Scraper · Polish Property Listings & Agents · $2/1k

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

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

37

Total users

1

Monthly active users

2 days ago

Last modified

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.

How it works

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ów or Gdynia 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_CHANGED with the previous price.
  • Fast mode - turn off fetchDetails to 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

InputExample
Sale search URLotodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa
Rent search URLotodom.pl/pl/wyniki/wynajem/mieszkanie/malopolskie/krakow/krakow/krakow
Filtered search URL…/wyniki/sprzedaz/mieszkanie/…?priceMin=500000&roomsNumber=%5BTWO%2CTHREE%5D
Individual offer URLotodom.pl/pl/oferta/{slug}
Place name + filterslocations: ["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: 1 and 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

  1. Start URLs are used as they are. Each entry in locations is resolved to an otodom location and turned into a search URL with your filters.
  2. Each search is walked page by page (72 listings per page) to its last page or to maxItems.
  3. With fetchDetails on, every offer page is parsed for the full record; with it off, the search card becomes the row.
  4. In monitoring mode, listings seen in earlier runs with an unchanged price are skipped before any offer page is fetched.
  5. Rows are normalised to one schema and streamed to your dataset - JSON, CSV or Excel.

Input configuration

FieldTypeDefaultDescription
startUrlsarray-otodom.pl URLs (search or offer)
locationsarray-Place names (Kraków, Mokotów), a voivodeship, cala-polska, or an otodom location path. One search per entry.
transactionstringsalesale or rent
propertyTypestringapartmentapartment, studio, house, plot, commercial, warehouse, garage, room, investment
marketstringallall, primary (new build), secondary (resale)
advertiserTypestringallall, private, agency, developer
priceMin / priceMaxinteger-Price range in PLN (monthly rent for rentals)
areaMin / areaMaxinteger-Floor area range in m²
roomsMin / roomsMaxinteger-1-6 (6 = six or more)
buildYearMin / buildYearMaxinteger-Construction year range
postedWithinDaysinteger-1, 3, 7, 14 or 30
sortBystringdefaultnewest, price_asc, price_desc, area_asc, area_desc
fetchDetailsbooleantrueOpen every offer page for the full record. Off = search-card rows only.
flattenbooleantrueFlatten nested fields for CSV-friendly output
includeRawbooleanfalseAdd otodom's complete source record as rawJson
monitoringModebooleanfalseReturn only new listings and price changes since the last run
monitorNamestring-Share one monitoring history across runs with the same name
enrichEmailsbooleanfalseFind a contact email for each listing's agency (billed per email found)
maxItemsinteger10000Hard cap on rows
maxConcurrencyinteger6Parallel 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, and photos holds only the first few images (photosCount is 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

FieldDescription
dataSourcedetail (offer page) or search (search card)
listingId, slug, canonicalUrlIdentity
listingModesale / rent
propertyType, marketTypeapartment / studio / house / plot / commercial / … · primary / secondary
advertiserType, isPrivateOwneragency / developer / private
title, descriptionListing copy (description as plain text)
address / address_*street, streetNumber, neighbourhood, district, city, county, province, postcode, locationId
latitude, longitudeExact GPS (detail rows)
rooms, areaSqm, plotAreaSqm, floorNumber, floorLabel, buildingFloors, buildYearSpecs
priceExact, priceCurrency, pricePerSqm, priceDisplay, hidePricePricing
monthlyCharges, deposit, availableFromCzynsz, rental deposit, move-in date
heating, buildingType, buildingMaterial, windowsType, ownership, constructionStatusBuilding 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, virtualTourUrlMedia
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, isPromotedListing flags
developmentId, developmentTitle, developmentUrlNew-build development the unit belongs to
dateCreated, dateModified, datePushedUpListing timestamps
changeType, previousPrice, firstSeenAtMonitoring 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, and
  • PRICE_CHANGED - listings whose price moved, with previousPrice and firstSeenAt.

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

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:

  • startUrls are 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.
  • locations accepts Polish place names (cities, districts, towns, voivodeships) or cala-polska; the filter fields apply only to these.
  • Always set maxItems (default 10000).
  • fetchDetails: false returns search-card rows: faster, but no phones, GPS or building details.
  • monitoringMode: true returns only new or re-priced listings compared with the previous run of the same searches (or the same monitorName); an empty dataset means nothing changed.
  • Keep maxConcurrency at 4-8; a residential proxy is built in, proxy is 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