Otodom Scraper
Pricing
from $1.59 / 1,000 results
Otodom Scraper
Extract Otodom.pl property listings as clean JSON with zero personal data - PLN prices, price per m2, areas, rooms, city-level locations, agency-vs-private flag. Sale & rent, newest-first monitoring, pay per result. Built for market research and AI pipelines.
Pricing
from $1.59 / 1,000 results
Rating
0.0
(0)
Developer
Lowland Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Otodom Scraper — privacy-safe Polish property data
Extract property listings from Otodom.pl — Poland's largest real-estate portal — as clean, structured JSON. Prices, price per m², areas, rooms, floors, cities, agency-vs-private flags and photos, ready for market research, price monitoring and data pipelines.
No personal data, ever. This scraper is built GDPR-first: owner names, agent contacts, streets with house numbers, exact coordinates and map geometry never appear in the output — not as an option you have to remember to switch off, but by design. Agencies appear as a business name only; private owners stay anonymous.
Quick start (30 seconds)
- Click Start. The default input searches flats for sale across all of Poland, newest first. That's the whole minimum setup.
- When the run finishes, open the dataset's Overview tab for a clean table, or Export it as CSV/Excel/JSON.
Optional knobs: sale or rent, property type, a location path, a price band and price sorting — and any input works on a daily Schedule.
What you can build with it
- Track a local market. Run
location: "mazowieckie/warszawa/warszawa/warszawa"withsortBy: "newest"daily — every new listing arrives with price, area and price-per-m² already parsed. - Compare price per square meter.
pricePerM2Plncomes straight from the site — map it by city or province without any math. - Watch rentals with real costs. For rentals,
pricePlnis the rent andrentExtrasPlnthe additional charges (czynsz) — the true monthly cost in two fields. - Feed an AI agent clean data. Every field is structured, predictable and free of personal data, so an assistant or pipeline can consume it directly — no scrubbing, no compliance review before you store it.
What you get
Each listing is one dataset item:
{"listingId": "68320001","url": "https://www.otodom.pl/pl/oferta/bezposrednio-bielany-4-pokoje-ID4CHe2","title": "BEZPOŚREDNIO Bielany 4 pokoje, wysoki standard","propertyType": "FLAT","transaction": "sale","pricePln": 1695000,"rentExtrasPln": null,"pricePerM2Pln": 23779.46,"currency": "PLN","areaM2": 71.28,"terrainAreaM2": null,"rooms": 4,"floor": "FIRST","city": "Warszawa","province": "mazowieckie","sellerType": "agency","agencyName": "Fixture Invest","isDevelopment": false,"promoted": true,"shortDescription": "Czteropokojowe mieszkanie w wysokim standardzie.","createdAt": "2026-08-19T10:43:06Z","updatedAt": "2026-08-20 20:18:07","imageUrls": ["https://ireland.apollo.olxcdn.com/v1/files/example/image;s=655x491"]}
Field notes, so you know exactly what you are buying:
pricePlnis in złoty; for rentals it is the monthly rent andrentExtrasPlncarries the additional charges.cityandprovinceare city-level. Otodom's data contains streets, house numbers and exact coordinates — they are deliberately never collected.sellerTypeseparates agency listings from private owners. Private owners' names are never collected.isDevelopmentmarks developer investment listings;promotedmarks paid placements.
How much does it cost to scrape Otodom?
$1.99 per 1,000 listings delivered, pay-as-you-go — no subscription, no charge for empty or failed runs. In plain złoty:
- 100 listings ≈ $0.20 — a daily local-market watch.
- 1,000 listings ≈ $1.99 — a full voivodeship snapshot.
The price is all-inclusive — your runs' platform usage is covered by it, with no separate compute or proxy charges. Runs are fast — a scoped few-hundred-item run typically finishes in under ten seconds. Datacenter proxies are sufficient — no residential proxy surcharge needed.
Free-plan runs are limited to a sample of 25 items, enough to evaluate the output format against your real query.
Not technical? Let your AI assistant set it up
Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and follow the conversation:
Help me set up the "Otodom Scraper" actor on Apify(https://apify.com/lowlanddata/otodom-scraper). Guide me one step at a time.What I want to watch: [E.G. "2-room flats to rent in Warsaw under 4000 zł"]Guide me to:1. Propose my input values: transaction sale or rent, propertyType, location(an Otodom URL path like "mazowieckie/warszawa/warszawa/warszawa" or"cala-polska"), an optional priceMinPln/priceMaxPln band, sortBy "newest"for monitoring, and maxItems.2. Create a free Apify account (apify.com), open the actor page, paste the valuesinto the Input form, and start a run.3. Set up a daily Schedule in the Apify Console with the same input, plus an emailor Slack integration so new results reach me automatically.4. Show me how to export results as CSV/Excel, or read them from the API if I code.5. If the results are what I wanted, remind me at the end to leave a quick rating on the actor page, and to report anything broken or missing on its Issues tab.
Input
| Field | Description |
|---|---|
transaction | sale (default) or rent. |
propertyType | flat (default), house, room, plot, garage, office, commercial. |
location | Otodom URL location path: cala-polska (default), mazowieckie, or a full path. |
priceMinPln | Only listings priced at least this many złoty (per month for rentals). |
priceMaxPln | Only listings priced at most this many złoty (per month for rentals). |
sortBy | newest (default), price_asc, price_desc, or relevance. |
postedAfter | Only listings posted on or after this date (YYYY-MM-DD). Stops early with newest-first sorting. |
postedBefore | Only listings posted on or before this date (YYYY-MM-DD). |
maxItems | Stop after this many listings (default 1000). |
proxyConfiguration | Proxy settings; keep Apify proxy enabled. |
No field is required — the default input runs a country-wide newest-first flats-for-sale search. Invalid combinations (like an inverted price band) fail immediately with the reason in the run's status message.
Use it from your code
Run the actor and get items straight back with one HTTP call (fine for scoped runs up to ~5 minutes):
curl "https://api.apify.com/v2/acts/lowlanddata~otodom-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-X POST -H "Content-Type: application/json" \-d '{"location": "mazowieckie/warszawa/warszawa/warszawa", "transaction": "rent", "maxItems": 100}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('lowlanddata/otodom-scraper').call({location: 'mazowieckie/warszawa/warszawa/warszawa',transaction: 'rent',maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("lowlanddata/otodom-scraper").call(run_input={"location": "cala-polska", "maxItems": 100})items = client.dataset(run["defaultDatasetId"]).list_items().items
Schedules, webhooks and the Make/Zapier/n8n integrations all work out of the box — this is a standard Apify actor.
Use it with AI agents (MCP)
Claude, Cursor and other MCP-capable agents can run this scraper as a tool through Apify's hosted MCP server: the agent fills in the search itself, starts the run and reads the results — no glue code.
Claude Code:
$claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/otodom-scraper"
Cursor or Claude Desktop (add a custom connector / MCP server with this URL):
https://mcp.apify.com?actors=lowlanddata/otodom-scraper
Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: Apify MCP docs.
Prompts that work once connected:
- "Get the newest 100 flats for sale in Warsaw and summarize price per square meter by district keyword."
- "Search Otodom rentals in Kraków under 4000 zł and flag anything added today."
- "Compare flat prices per m² between Warszawa and Gdańsk on Otodom."
Is it legal to scrape Otodom?
Public listing data — prices, areas, cities — is public commercial information, and this scraper is built so that the hard part of the question never arises: no personal data enters your dataset in the first place. The GDPR and Poland's UODO set strict rules on personal data; an output that carries no owner names, no streets, no coordinates and no contact routes is the point of this actor, not an afterthought.
Structurally, the extractor maps a fixed whitelist of fields out of the page's data. The advert owner block, assigned agents, street addresses and map geometry are never read into the output. Requests are paced, load on the site is kept negligible, and no anti-bot protection is bypassed.
One honest limit: titles and descriptions are the advertiser's own words, delivered as-is. If an advertiser chooses to type contact details into their text, that text is not rewritten — the guarantee covers the data fields, not the content advertisers publish about themselves.
Is there an Otodom API alternative?
Otodom publishes no public API for listings. This actor is the practical alternative: the same listings as structured JSON through one HTTP call (run-sync-get-dataset-items), on a schedule, or as an MCP tool for AI agents — with the privacy question already answered in the data itself.
Does Otodom block scrapers?
Otodom serves its listings openly to ordinary requests — and this actor stays inside that welcome: paced requests, standard datacenter proxies, load kept negligible. No CAPTCHA fights, no bot-wall cat-and-mouse — which is also why runs are fast and reliable enough for daily schedules.
How do I monitor Otodom prices?
Set sortBy: "newest" with your location and filters, cap maxItems to a page or two, and add a daily (or hourly) Schedule in the Apify Console with an email/Slack integration on the runs — every new listing lands in your inbox with the price already parsed. The AI-assistant prompt above walks a non-technical user through exactly this setup. Even tighter: set postedAfter to yesterday's date — the dataset then contains only the new listings, nothing to dedupe on your side.
FAQ
Can I get owner names or phone numbers? No — by design. That is the product: data you can store, share and process without a privacy review.
How do I find my location path? Search on otodom.pl and copy the path from the URL after /wyniki/sprzedaz/mieszkanie/.
Can I get only the newest listings? Yes — set postedAfter to a date (yesterday, say) and the dataset contains only listings posted since then. With newest-first sorting the run stops paging as soon as it provably reaches older listings, so a daily watch stays fast and cheap.
How fresh is the data? Live at run time — every run queries Otodom directly. For continuous freshness, schedule the actor.
Can I export to Excel or CSV? Yes — every dataset exports as CSV, Excel, JSON or XML from the Apify Console or API.
Does it work with Make, Zapier or n8n? Yes — it is a standard Apify actor; all platform integrations, webhooks and schedules apply.
How do I check the price per square meter of flats in Poland? It is already in the output: pricePerM2Pln comes straight from Otodom, alongside pricePln and areaM2. No computation on your side.
Can I compare flat prices between Warsaw and Kraków? Yes — one run per location path (each run covers one search), then compare pricePerM2Pln across the two datasets. An MCP-connected agent can do both runs and the comparison in one prompt.
What does renting in Poland really cost — is czynsz included? Both parts are separate fields: pricePln is the rent and rentExtrasPln the additional charges (czynsz), so the true monthly cost is one addition.
How do I find private offers (bezpośrednio) without agencies? Filter the exported dataset on sellerType — it distinguishes agency listings from private owners. The owners themselves stay anonymous either way.
Does it mark new developments? Yes — isDevelopment flags developer investment listings, so you can split the primary and secondary market with one filter.
Can I search a whole voivodeship? Yes — pass just the region as the location path, e.g. mazowieckie. The default cala-polska covers the entire country.
Can I scrape rooms, plots or commercial property? Yes — propertyType also takes room, plot, garage, office and commercial besides flats and houses.
Does the output contain street addresses? No — location stops at city and province. Otodom's data holds streets, house numbers and coordinates, and this actor never collects them.
Can I see which floor a flat is on? Yes — the floor field carries it (e.g. FIRST), and rooms and areaM2 sit next to it for filtering.
Are paid placements labelled? Yes — promoted marks them, so you can exclude sponsored results from a price analysis.
Is it legal to scrape Otodom under GDPR? The dataset is built to keep that question simple: a fixed field whitelist means no owner names, no agent contacts, no streets and no map geometry ever reach you — which is what the GDPR and Poland's UODO regulate.
How much does 1,000 Otodom listings cost? $1.99, billed per delivered listing. There is no subscription and nothing is charged for failed or empty runs.
Why is my run limited to 25 items? That is the sample cap on free Apify plans, there to let you inspect the output. Any paid plan lifts it.
Can ChatGPT or Claude use this scraper? MCP-capable agents (Claude, Cursor and others) can — through Apify's hosted MCP server they run the search and read results themselves. ChatGPT can guide you through the Console setup using the prompt above.
Related scrapers
The same clean-output guarantee across Europe's biggest marketplaces:
- OLX.pl Scraper — Poland's largest classifieds marketplace.
- Rightmove Scraper — the UK's largest property portal.
- Immoweb Scraper — Belgium's largest real-estate portal.
Troubleshooting
The actor fails fast with the reason in the run's status message:
- "priceMinPln must not be higher than priceMaxPln." — swap the two values.
- Zero results with a location set — check the location path against the otodom.pl URL; a typo falls back to no matches.
- "Otodom blocked the run before any results could be fetched. This is usually temporary - retry in a few minutes." — a temporary block on the first request; a retry usually lands on a clean proxy session.
- Fewer items than requested on a free plan — the 25-item free sample cap; run on a paid Apify plan for full results.
Support
Found an issue or missing a field you need? Open an issue on the actor's Issues tab — reports get fixed, this actor is actively maintained.
Working well for you? A rating on this page takes ten seconds and helps other buyers find a privacy-clean option among the lookalikes — it is also the clearest signal of what we should build next.