Otodom.pl Scraper - Polish Real Estate Data
Pricing
from $2.45 / 1,000 results
Otodom.pl Scraper - Polish Real Estate Data
Otodom.pl scraper & unofficial API alternative. Scrape Polish real estate listings without login and export property data to CSV or JSON.
Pricing
from $2.45 / 1,000 results
Rating
0.0
(0)
Developer
Logiover
Maintained by CommunityActor stats
0
Bookmarked
15
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Otodom.pl Scraper — Polish Real Estate Data, Prices & Leads (No API)

Scrape property listings from Otodom.pl, Poland's #1 real estate portal (OLX Group) with 200K+ active listings — apartments, houses, plots, commercial space, warehouses, garages and rooms, for sale or rent. Get price, price/m², GPS coordinates, full Polish address, agency name & image galleries in clean structured JSON, straight from the site's __NEXT_DATA__ payload. Fast, no browser, no API key, no login.
🏆 Why this Otodom scraper?
60+ fields per listing · thousands of listings per run · direct HTTP + JSON (no browser) · residential-proxy ready · export to JSON / CSV / Excel. The unofficial Otodom API alternative for real-estate market research, investment screening and lead generation.
✨ What this Actor does / Key features
- 🏠 7 property types — apartments, houses, plots/land, commercial, warehouses, garages and rooms, for sale or rent.
- 📍 Nationwide targeting — scrape all of Poland, any of the 16 voivodeships, cities or sub-districts via location slugs.
- 💰 Powerful filters — price range (PLN), area range (m²), room range, market (primary/secondary), owner type and distance radius.
- 🔀 Flexible sorting — by latest, price, price/m² or area, ascending or descending.
- 🗺️ Full address & GPS — province, city, district, subdistrict, street, postcode + latitude/longitude for every listing.
- 🏢 Agency lead data — agency name, ID, slug, logo and type, plus exclusivity, featured and promoted flags.
- 🖼️ Image galleries — main image URL plus the full list of image URLs and image count.
- ⚡ Direct HTTP + JSON extraction — parses Otodom's
__NEXT_DATA__payload; no browser, no DOM walking, no GraphQL token. - 🛡️ Proxy support — Apify Proxy integration; residential + country=PL strongly recommended to avoid blocks.
🚀 Quick start (3 steps)
- Configure — paste one or more location slugs (e.g.
mazowieckie/warszawa) and picksaleorrent. Add price/area/room filters if you want. - Run — click Start. The Actor paginates the search results and streams listings into your dataset.
- Get your data — open the Output tab and export to JSON, CSV, Excel or XML, or pull it via the Apify API.
📥 Input
Give the Actor at least one locationSlugs value. Everything else is optional.
Example — apartments for sale in Warsaw & Kraków
{"locationSlugs": ["mazowieckie/warszawa", "malopolskie/krakow"],"transaction": "sale","propertyType": "apartment","priceMin": 500000,"priceMax": 1500000,"areaMin": 40,"sort": "latest","maxListings": 500,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "PL" }}
Example — private-owner rentals nationwide (lead generation)
{"locationSlugs": ["cala-polska"],"transaction": "rent","propertyType": "apartment","ownerType": "PRIVATE","sort": "latest","maxListings": 1000}
Example — new-build developer offers in Wrocław
{"locationSlugs": ["dolnoslaskie/wroclaw"],"transaction": "sale","market": "PRIMARY","maxListings": 300}
| Field | Type | Description |
|---|---|---|
locationSlugs | array | Otodom URL location paths. Each slug becomes its own task (e.g. mazowieckie/warszawa, cala-polska). Required. |
transaction | string | sale (sprzedaż) or rent (wynajem). |
propertyType | string | apartment, house, plot, commercial, warehouse, garage or room. |
priceMin / priceMax | integer | Price range in PLN. 0 = no bound. |
areaMin / areaMax | integer | Surface area range in m². 0 = no bound. |
roomsMin / roomsMax | integer | Room-count range (1–10). 0 = no bound. |
market | string | ALL, PRIMARY (new build) or SECONDARY (resale). |
ownerType | string | ALL, PRIVATE or BUSINESS (agency). |
sort | string | latest, price_asc/desc, price_per_m_asc/desc, area_asc/desc. |
distanceRadius | integer | Expand to nearby areas: 0, 5, 10, 15, 25, 50 or 75 km. |
limit | integer | Listings per page: 24, 36, 48 or 72. |
maxListings | integer | Total cap across all location tasks. 0 = unlimited. |
maxPagesPerTask | integer | Pagination depth per location (Otodom caps around page 50). |
requestDelay | integer | Delay between page requests in ms (keep ≥ 600 ms). |
maxRetries | integer | Retries per request on HTTP errors (rotates proxy IP). |
proxyConfiguration | object | Apify Proxy settings. Residential + country=PL strongly recommended. |
Finding a location slug: browse otodom.pl, apply a location filter, and copy the path between
/wyniki/{txn}/{type}/and?from the URL. Usecala-polskafor all of Poland, a voivodeship slug likemazowieckie, or a deeper path likemazowieckie/warszawa.
Additional input fields
These optional fields are also available in the input form and API:
| Field | Type | Default | Description |
|---|---|---|---|
timeBudgetSecs | integer | 1200 | Hard wall-clock limit. The Actor stops paginating and saves whatever it has collected before this many seconds elapse, then exits cleanly (SUCCEEDED). Raise it for big crawls; |
📤 Output
One row per listing — 60+ fields, exportable to JSON, CSV, Excel or XML. Here is a trimmed sample record:
{"adId": 66412873,"detailUrl": "https://www.otodom.pl/pl/oferta/nowoczesne-2-pokoje-mokotow-ID4qXyZ","title": "Nowoczesne 2 pokoje | Mokotów | balkon","transactionType": "sale","propertyType": "apartment","advertType": "AGENCY","isPrivate": false,"market": "SECONDARY","price": 899000,"priceCurrency": "PLN","pricePerSqm": 16648,"monthlyRent": null,"areaSqm": 54,"rooms": 2,"floor": "FLOOR_3","totalFloors": 5,"province": "mazowieckie","city": "Warszawa","district": "Mokotów","street": "ul. Puławska","postalCode": "02-566","latitude": 52.1937,"longitude": 21.0246,"mainImageUrl": "https://ireland.apollo.olxcdn.com/v1/files/…/image.jpeg","imageUrls": ["https://…/1.jpeg", "https://…/2.jpeg", "…"],"imageCount": 14,"agencyName": "Premium Estate Sp. z o.o.","agencyId": 39215,"agencyType": "AGENCY","isExclusive": true,"dateCreated": "2026-07-02T09:14:00Z","labels": ["Wyróżnione"],"searchLocation": "mazowieckie/warszawa","scrapedAt": "2026-07-06T12:00:00Z"}
💡 Use cases
- Market research — build PLN/m² heatmaps by voivodeship, city and district.
- Investment screening — calculate rental yield (monthly rent vs. sale price) per area.
- Lead generation — use
ownerType: PRIVATEto find direct-owner listings, or cluster agency listings byagencyId. - Price tracking — re-run on a schedule and diff against prior datasets using
dateCreatedandpushedUpAt. - Primary-market monitoring — use
market: PRIMARYto track new developer offers. - Cross-city comparison — pass multiple
locationSlugsin one run to benchmark prices across Polish cities.
👥 Who uses it
Real-estate agencies & proptech teams · property investors & flippers · mortgage and valuation analysts · market researchers & data journalists · lead-gen agencies building owner/agency contact lists.
💰 Pricing
This Actor runs on a simple pay-per-result model — you pay for the listings you extract, with no separate Apify platform fees to calculate. Try it on the free tier first, then scale up. See the Pricing tab on this page for the current rate.
❓ Frequently Asked Questions
Is it legal to scrape Otodom.pl? The Actor only collects publicly available property listing data. You are responsible for using the data in compliance with Otodom's terms and applicable laws such as GDPR.
Does Otodom.pl have a public API?
Otodom does not offer an open public data API for listings, so this Actor reads the site's own embedded __NEXT_DATA__ JSON instead — giving you structured Polish real estate data without any API key.
Do I need an API key or a login? No. There is no Otodom account, login or API key required — only an Apify account.
Do I need a proxy? Otodom deploys mild bot protection. Datacenter proxies often get blocked, so residential Apify Proxy with country=PL is strongly recommended; the Actor runs cleanly with it at a ≥600 ms request delay.
How much data can I get? You can scrape thousands of listings per run. Otodom caps pagination around page 50 (~3,600 listings per filter set), so narrow with price and area filters to reach deeper inventory across multiple locations.
Does it return rental czynsz separately?
Yes. For rental listings, the recurring monthly rent is returned in the monthlyRent field, separate from the main price.
Is this an Otodom API alternative?
Yes. Otodom has no open public listings API, so this Actor works as an unofficial Otodom API alternative — it reads the site's embedded __NEXT_DATA__ JSON and returns structured Polish real estate data with no API key.
Can I scrape Otodom without an API or login?
Yes. No Otodom account, login or API key is needed — only an Apify account. The Actor pulls publicly available property listings over direct HTTP.
How do I export Otodom data to CSV or JSON?
Run the Actor, then export the resulting dataset as CSV, JSON, Excel or XML from the Apify console or via the Apify API.
Can I calculate rental yield from Otodom data?
Yes. Scrape sale and rent listings for the same area: sale rows carry price and price/m², while rental rows carry monthlyRent, so you can compute gross rental yield per district.
🔗 More real estate scrapers by logiover
Building a cross-country property dataset? Pair Otodom with the rest of the European real-estate suite:
| Country | Actor |
|---|---|
| 🇪🇸 Spain | Habitaclia Scraper · Pisos.com Scraper |
| 🇨🇿 Czechia | Sreality.cz Scraper |
| 🇬🇷 Greece | Spitogatos Scraper |
| 🇮🇹 Italy | Casa.it Scraper · Subito Scraper |
| 🇩🇪 Germany | ImmobilienScout24 Scraper |
| 🇵🇹 Portugal | Imovirtual Scraper |
| 🇫🇷 France | Bien'ici Scraper |
| 🇷🇴 Romania | Storia.ro Scraper |
| 🇳🇱 Netherlands | Funda Scraper |
| 🇮🇪 Ireland | MyHome.ie Scraper |
| 🇩🇰 Denmark | Boliga Scraper |
| 🇧🇬 Bulgaria | Imot.bg Scraper |
👉 Browse all logiover scrapers on Apify Store — 180+ actors across real estate, jobs, crypto, social media and B2B data.
⏰ Scheduling & integration
Schedule this Actor on Apify to track the Polish property market daily or weekly. Export results to JSON, CSV or Excel, sync to Google Sheets, or push to your database, BI tools and webhooks through the Apify API. Connect it to Make, n8n or Zapier to build automated real-estate pipelines.
⭐ Support & feedback
Found a bug or need an extra field? Open an issue on the Issues tab — response is usually fast. If this Actor saves you time, a ★★★★★ review on the Store page genuinely helps and is hugely appreciated. 🙏
⚖️ Legal
This Actor extracts only publicly available data and is intended for legitimate research, analytics and lead-generation use. You are responsible for complying with Otodom's terms of service, GDPR and any applicable local laws.
This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Otodom.pl; Otodom.pl and all other trademarks mentioned here are the property of their respective owners.
Otodom.pl scraping — frequently asked questions
Do I need a Otodom.pl API key, account or login?
No. This Actor reads publicly available pages and feeds, so there is nothing to register for and no credentials to manage.
How do I export Otodom.pl data to CSV, Excel, JSON or Google Sheets?
Open the Storage tab after a run and pick the format you want — CSV, Excel, JSON, XML or an HTML table. For Google Sheets, Airtable or a database, use the dataset URL or the Apify API so the sheet refreshes itself on every run.
Can I schedule this Otodom.pl scraper to run daily or hourly?
Yes. Use the Schedules tab and pick a cadence. Daily is enough for most tracking work; pick hourly only if the listings you care about really do change that fast.
How many listings can I get, and what does it cost?
See the volume section above for a measured figure. Billing is per result, so you pay for the rows you actually receive and a run that finds nothing costs nothing.
Is scraping Otodom.pl legal?
This Actor collects only information that Otodom.pl publishes publicly. It does not log in, does not defeat access controls and does not touch private data. You remain responsible for how you use the output, including under GDPR and similar rules where personal data is involved.
What happens if Otodom.pl blocks the run or changes its layout?
A refused exit IP is swapped for a fresh one within a quarter of a second and retried, and rate limiting is waited out rather than fought. If nothing gets through, the run fails with the reason instead of reporting success with zero rows — so an empty result always means "no matches", never "the source would not answer".
Can I use this with an AI agent, LangChain or an MCP client?
Yes. The Actor is callable over the Apify API and through Apify's MCP server, so an agent can run it and read the dataset back as a tool call.
📝 Changelog
2026-11-01
- Monthly health check (2026-11-01): a live run on the current build completed successfully and returned data. Input options, output fields and pricing are unchanged.
- README refreshed: 1 link to retired Actors removed; independence disclaimer added; documented 1 additional input field.
2026-10-15
- Every request now has a hard time limit, so a proxy connection that stalls can no longer hold up the run or push it past its timeout.
- A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
- A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
- Memory is managed within the run's own limit, which removes a rare out-of-memory crash on large pages.
- The default used when the field is left out for
timeBudgetSecsis now 1,200 (was 240). - The default used when the field is left out for
maxPagesPerTaskis now 50 (was 5). - The default used when the field is left out for
maxListingsis now 7,150 (was 200).
2026-09-23
- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 53 columns returned, 77.2% of cells populated.
- Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.
- Noted that 11 column(s) came back empty in this sample (
shortDescription,terrainAreaSqm,totalFloors,postalCode,latitude,longitudeand others); these are under review.
2026-09-01
- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.
2026-08-11
- Maintenance release: refreshed the build and dependencies.
- Re-verified live execution, non-empty structured output and dataset field/type integrity.
- Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.
2026-08-01
- Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
- Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.
2026-07-06
- ✨ README overhaul: richer output sample, ready-to-run example scenarios, cross-country real-estate suite links, and clearer quick-start.
2026-07-01
- Maintenance pass: re-verified end-to-end on live data within the 5-minute quality window; sharpened Store SEO metadata and expanded the FAQ with high-intent long-tail questions.
2026-06-05
- 🛡️ Reliability fix: results are no longer dropped by strict output validation — runs complete cleanly even at high volume (thousands of results).
2026-06-01
- Maintenance & reliability pass: rebuilt on the current base image; build verified.
*Maintained: last verified 2026-11-01 — checked end-to-end against live run history (reliability, output fields and types, and time/memory budgets).