Otodom.pl Property Scraper - Poland Real Estate Listings avatar

Otodom.pl Property Scraper - Poland Real Estate Listings

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Otodom.pl Property Scraper - Poland Real Estate Listings

Otodom.pl Property Scraper - Poland Real Estate Listings

Scrapes property listings from Otodom.pl: price, price per m², area, rooms, floor, address, GPS, photos, description, building details, agency and agent phone numbers. Search flats, houses, plots, rooms and commercial property for sale or rent by location, search URL or listing URL.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

ActorFlow

ActorFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Scrape property listings from Otodom.pl (otodom.pl), Poland's largest real estate portal: price, price per m², area, rooms, floor, full address with GPS coordinates, photos, floor plans, description, building details, agency and agent phone numbers. Search flats, houses, plots, rooms and commercial property for sale or rent by location and filters, or just paste an Otodom search URL and press Start. Repeat runs skip listings you already scraped, so daily monitoring of new Otodom listings costs only the new ones. Export the Otodom real estate data as JSON, CSV or Excel, or call the scraper as an API.

Target website: otodom.pl

✨ Features of this Otodom property scraper

  • Property listing extraction — price, price per m², monthly fee, living and plot area, rooms, floor, building year, type, material, condition, heating, ownership, availability date, location down to the neighbourhood, GPS, photos, floor plans, videos and features.
  • Nearby places (Okolica) — the 3 nearest places in each category within 5 km (transport, shops, food and drink, schools, health, green areas, sport, culture, services, pets), with distance in metres and walking time in minutes.
  • Agent and owner contacts — contact name, agency or developer name, agency page and phone numbers from each listing page.
  • Pagination support — follows search result pages until your Max items limit is reached.
  • Location, price, area, rooms, market, advertiser type, build year and date filtering — type a city or district (for example Kraków or Mokotów) and the scraper finds it on Otodom for you; or use any search URL with filters set on the site.
  • New listings only (cache) — a cache project name skips Otodom listings you already scraped on earlier runs, so scheduled runs fetch and pay for new listings only.
  • Proxy support — residential Apify Proxy is prefilled in the input form, because Otodom blocks many requests on the Apify platform without one.
  • No browser required — the scraper works over plain HTTP, so runs are fast and cheap (hundreds of listings per minute).

🚀 How to scrape Otodom listings in 5 steps

  1. Sign up for a free Apify account — includes $5 monthly credit.
  2. Open the actor page and click Try for free.
  3. Fill in the Input fields (a location, a search URL or a listing URL).
  4. Click Start and wait for the run to complete.
  5. Download results from the Output tab in JSON, CSV, or Excel format.

You can also run this actor via the Apify API or integrate it directly into your workflows using Zapier, Make, or n8n.

💰 Pricing

This actor uses pay-per-result billing: you pay for each listing saved to the dataset, plus the small compute cost of the run.

  • New Apify accounts include $5 of free monthly credit.
  • It needs no browser, so it costs significantly less to run than browser-based scrapers.
  • Residential proxy is prefilled because Otodom blocks many unproxied requests on the platform; its traffic is billed by Apify on top of the results. Remove it only if your runs succeed without it.
  • Set a Cache project name on scheduled runs: listings you already scraped are skipped and not charged (see below).
  • Turn off Scrape listing details for the cheapest runs (one request per 72 listings).

🔧 Input configuration

FieldTypeRequiredDefaultDescription
startUrlsarray—[] (prefilled with a Warsaw flats search)Otodom search results URLs (any filters set on the site) or single listing URLs. When set, the filter fields are ignored unless Locations is also filled.
locationsarray—[]Cities, districts or regions, e.g. Warszawa, Kraków, Mokotów. Each is searched separately. Empty = all of Poland.
transactionstring—salesale or rent.
propertyTypestring—flatflat, house, room, plot, commercial, warehouse, garage.
marketstring—allall, primary (new builds), secondary (resale).
priceMin / priceMaxinteger——Total price in PLN, or monthly rent for rentals.
areaMin / areaMaxinteger——Living area in m².
roomsarray—[]Room counts to include, "1" to "10".
ownerTypestring—allall, private, agency, developer (agency/developer filter sale searches only).
buildYearMin / buildYearMaxinteger——Year of construction range.
daysSinceCreatedstring——Only listings added in the last 1, 3, 7, 14, 30 or 90 days.
sortstring—defaultdefault, newest, priceAsc, priceDesc, areaAsc, areaDesc.
scrapeDetailsboolean—trueOpen each listing for phones, full description, GPS, all photos and building details.
scrapeNearbyPlacesboolean—trueAdd the nearest places per category with distance and walking time (one extra request per listing, only with listing details). Turn off for faster, cheaper runs.
maxItemsinteger—5Maximum unique listings per location or search URL.
cacheProjectNamestring——Same name on each scheduled run = only new listings (marked changeType: new).
maxConcurrencyinteger—5Maximum parallel requests.
proxyConfigurationobject—residential Apify Proxy (prefill)Apify Proxy settings. Residential is prefilled because Otodom blocks many unproxied requests on the platform.

In the Console, locations, transaction, property type, market, price, area, rooms, owner type, build year, listing age and sorting sit in the collapsible Search filters and more options section. The optional proxy setting is in its own Proxy section at the bottom.

How the cache saves money:

With Scrape listing details on, every listing costs one extra detail request on top of the search request. Without a cache, a daily run over the same search opens the same Otodom listing pages again and pays for each result every time. With a Cache project name:

  • The actor remembers every listing it has saved in a key-value store named after your project, and keeps it between runs.
  • Each run still reads the search result pages, which are cheap and hold 72 listings each. Listings already in the cache are dropped right there, before a detail page is requested.
  • Skipped listings cost no detail request and no result charge, and they do not count towards Max items per search. The limit is spent only on new listings.
  • A listing URL you paste is skipped too if it is already cached, but the actor must open it once to read its ID, so only the result charge is saved there.

For example, a search with 2,000 matching flats that gets 40 new listings a day pays for 40 results and 40 detail pages on day 2 instead of 2,000 of each, which makes daily Otodom price and new-listing monitoring cheap.

Use a different project name for each search you track, because each name has its own memory. Pick a new name to start from scratch. A cached listing is not scraped again, so later price changes on it are not picked up.

Supported URL types:

  • Search results: https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa?priceMax=800000
  • Listing: https://www.otodom.pl/pl/oferta/<title>-ID4CNxi
  • Development (investment): https://www.otodom.pl/pl/inwestycja/<title>-ID4Ckte
  • English listing URLs (/en/ad/..., /en/investment/...) are accepted too.

📦 Otodom scraper output data

Each listing is one JSON record with these fields: id, url, title, transaction, estate, market, price, currency, pricePerM2, priceFromPerM2, monthlyFee, areaM2, plotAreaM2, rooms, floor, totalFloors, buildYear, buildingType, buildingMaterial, condition, heating, ownership, availableFrom, street, residential, district, city, voivodeship, latitude, longitude, images, imageCount, floorPlans, videoUrl, virtualTourUrl, description, features, sellerType, agencyName, agencyId, agencyUrl, contactName, phones, isPrivateOwner, isExclusive, isPromoted, developmentTitle, developmentUrl, investmentState, investmentUnits, investmentDelivery, status, createdAt, modifiedAt, pushedUpAt, nearbyPlaces, scrapedAt (and changeType when a cache project is used). Missing values are null. nearbyPlaces is a list of categories, each with its nearest places, for example { "category": "transportation", "places": [{ "type": "tram_stop", "name": "Plac Zawiszy 14", "distanceM": 166, "walkingMinutes": 3 }] }; it is null when details or nearby places are turned off. Places the site shows without a name (for example playgrounds or bus stops) have name: null and are identified by type.

The dataset has 1 view: Overview, a compact table with the price, size, location, advertiser and contact phones of each listing.

Output at a glance:

ListingPrice (PLN)PLN/m²m²RoomsDistrictAdvertiser
Biały kruk, 125 m2 i ogród7,900,00063,2001254MokotówEn Casa Premium Real Estate
Nowe M2 + komfort na co dzień841,80021,585392Praga-PółnocBiuro Sprzedaży Nowych Mieszkań
Duży taras 12 m2, gotowe do odbioru792,72021,39637.052MokotówPlatforma Mieszkaniowa
2-pokojowe mieszkanie 43m2 + loggia696,43515,92943.722UrsusRonson Development
Apartamenty Grzybowska 11————ŚródmieścieDom Development S.A.

Sample output (raw JSON):

{
"id": "68531643",
"url": "https://www.otodom.pl/pl/oferta/bialy-kruk-125-m2-i-ogrod-150-m2-ID4Dyd5",
"title": "Biały kruk | 125 m2 i ogród 150 m2",
"transaction": "SELL",
"estate": "FLAT",
"market": "SECONDARY",
"price": 7900000,
"currency": "PLN",
"pricePerM2": 63200,
"priceFromPerM2": null,
"monthlyFee": 3000,
"areaM2": 125,
"plotAreaM2": null,
"rooms": 4,
"floor": "0",
"totalFloors": 2,
"buildYear": 2015,
"buildingType": "apartment",
"buildingMaterial": "other",
"condition": "ready_to_use",
"heating": "urban",
"ownership": "full_ownership",
"availableFrom": "2026-08-31",
"street": "Park Morskie Oko",
"residential": "Sielce",
"district": "Mokotów",
"city": "Warszawa",
"voivodeship": "mazowieckie",
"latitude": 52.20707,
"longitude": 21.027126,
"images": [
"https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6IjFqMDZweTU4NnQwZDMtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.gnA3ruLnv0vMWm6XXKqYSzvWumCwBhGo71-muqzRgHY/image;s=2048x1536;q=80",
"https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6InJvc3h1MWgybmMwczEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.GDtG9fVKf0yGTV_xFi86RHC5u_gkqkEqjvNSntxAgWc/image;s=2048x1536;q=80"
],
"imageCount": 16,
"floorPlans": [
"https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6IjZobGg1bjNhbHQ5ajEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.fnhbRM7C0DhhTP6RY4JR_fxzDZ6Vr7F_U7uFQ-6vq6w/image",
"https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Inc1N243aTlvM3A1cy1FQ09TWVNURU0iLCJ3IjpbeyJmbiI6ImVudmZxcWUxYXk0azEtQVBMIiwicyI6IjE2IiwiYSI6IjAiLCJwIjoiMTAsLTEwIn1dfQ.dnIz_XEvTav_ti3YwQVwXErPBtbtGWEUBUaXfgIam4A/image"
],
"videoUrl": "https://www.youtube.com/embed/U9_19_buFUQ",
"virtualTourUrl": null,
"description": "Unikat na warszawskim rynku\nTOP Apartament premium z prywatnym ogrodem w Parku Morskie Oko | 4 pokoje | 125 m² | 2 miejsca parkingowe\n:: Dla kogo?\nNieruchomość dedykowana wymagającym klientom – zarówno parom, jak i rodzinom (2+1, 2+2), poszukującym komfortowej przestrzeni w prestiżowej i kameralnej ...",
"features": ["furniture", "garden", "garage", "air_conditioning", "lift", "basement"],
"sellerType": "agency",
"agencyName": "En Casa Premium Real Estate",
"agencyId": "816875",
"agencyUrl": "https://www.otodom.pl/pl/firmy/biura-nieruchomosci/en-casa-premium-real-estate-ID816875",
"contactName": "Michał Szczepkowski",
"phones": ["+48664000231", "+48600830123"],
"isPrivateOwner": false,
"isExclusive": false,
"isPromoted": false,
"developmentTitle": null,
"developmentUrl": null,
"investmentState": null,
"investmentUnits": null,
"investmentDelivery": null,
"status": "active",
"createdAt": "2026-10-15T13:40:58Z",
"modifiedAt": "2026-10-15T13:41:17Z",
"pushedUpAt": null,
"nearbyPlaces": [
{
"category": "transportation",
"places": [
{ "type": "bus_stop", "name": null, "distanceM": 148, "walkingMinutes": 2 },
{ "type": "bus_stop", "name": "Plac Zawiszy 10", "distanceM": 148, "walkingMinutes": 2 },
{ "type": "tram_stop", "name": "Plac Zawiszy 14", "distanceM": 166, "walkingMinutes": 3 }
]
}
],
"scrapedAt": "2026-10-15T13:43:48.743Z"
}

🐍 How to scrape Otodom with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace <YOUR_API_TOKEN> with the token from your Apify Console.

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("confidential_gnat/otodom-property-scraper").call(run_input={
"locations": ["Kraków"],
"transaction": "rent",
"propertyType": "flat",
"maxItems": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('confidential_gnat/otodom-property-scraper').call({
locations: ['Kraków'],
transaction: 'rent',
propertyType: 'flat',
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL — start a run and wait for the dataset:

curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~otodom-property-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"locations": ["Kraków"], "transaction": "rent", "propertyType": "flat", "maxItems": 50}'

💡 What you can use Otodom real estate data for

  • Track asking prices and price per m² by city, district or neighbourhood in Poland.
  • Build rental yield models by combining sale and rent listings for the same area.
  • Find new listings every day for buyers, renters or investors with a scheduled cached run.
  • Generate leads of real-estate agencies and developers with their phone numbers and listing volume.
  • Map supply of new developments (primary market) and their delivery dates.

This data is typically used by real-estate investors, agencies, proptech startups, mortgage and valuation teams, and market researchers working on the Polish housing market.

⚠️ Limitations & known issues

  • Development pages — Otodom shows developments (investments) as one listing with a price-from per m² and no single total price, area or room count; those fields are null for them.
  • Personal data — phone numbers and names of private sellers are personal data under GDPR; process them lawfully.
  • Search depth — results follow Otodom's own search, which can include a few listings just outside the chosen location and pins promoted developments at the top.

❓ Frequently asked questions

Can I scrape Otodom.pl legally?

This actor only collects data that Otodom shows publicly to any visitor, without logging in. Scraping publicly available data is generally considered lawful (see hiQ Labs v. LinkedIn), but you are responsible for complying with Otodom's terms and with GDPR, especially for sellers' names and phone numbers.

What data does the Otodom scraper return?

Price, price per m², area, rooms, floor, location, photos and advertiser come from the search results. With Scrape listing details on (the default) you also get phone numbers, the full description, GPS coordinates, all photos, floor plans, building details such as year, type, heating and ownership, and the nearest places per category with walking times (the "Okolica" section).

maxItems limits listings per location or search URL. The scraper reads 72 listings per results page and keeps paging until that limit or the end of the search, so large cities with 20,000+ listings can be scraped completely.

Do I need a proxy to scrape otodom.pl?

On the Apify platform, yes. The input form prefills residential Apify Proxy, because without it many requests are blocked and fail. From a home connection the site often worked without a proxy.

How do I scrape Otodom with Python?

Use the Python example above with the apify-client package, then iterate over the dataset items to get each listing as a dictionary.

Can I run this Otodom scraper on a schedule?

Yes, with Apify Schedules. Set the same Cache project name on every run: the actor drops listings it already saved before opening their detail pages, so each run fetches, returns and charges for only new listings, marked with changeType: new. See How the cache saves money above.

What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the Output tab or through the Apify API.

How do I search a specific district or neighbourhood?

Type it in Locations, for example Mokotów or Nowa Huta; the scraper picks Otodom's best match and logs which location it used. For full control, set the location and filters on otodom.pl and paste the results URL into Search or listing URLs.

🔗 Other actors you may find useful

ScraperDescription
🏡 OnTheMarket Property ScraperUK sale, rent and new-home listings: price, address, agent contacts, EPC, tenure and delisting tracking.
🏘️ Chaves na Mão Property ScraperBrazil property for sale and rent: price, condo fee, IPTU, area, GPS, agent phone and WhatsApp.
🛏️ Spotahome Property ScraperEuropean rental listings: price, address, coordinates, amenities and images, with duplicate removal.
🏠 HousingAnywhere Property ScraperRental listings from HousingAnywhere: price, city, coordinates, room count, house rules and facilities.
✅ Rightmove Listing Availability CheckerChecks whether Rightmove property listings are still active or have been removed.

💬 Support & contact

If you encounter any issues or have questions, please open an issue.

You can also find more of our actors on the Actor Flow page.