The problem
Otodom.pl is Poland's biggest real-estate classifieds portal, and Warsaw is its busiest market. Anyone tracking prices, building a listings aggregator, or doing market research needs Otodom data — but the portal offers no public API.
The manual workflow is the usual classifieds grind: open search pages filtered by city, deal type and property type, then copy each card's title, price, rooms, area and link into a spreadsheet. Keeping that current across pages and categories is tedious, and a homemade scraper has to deal with Otodom's location paths and pagination yourself.
Agencies and market watchers typically want two things from that data: a periodic snapshot to compare asking prices per district, and a feed of newly posted listings for alerts. Both need the same scrape repeated on a schedule — exactly the kind of job a manual workflow never keeps up with.
What the actor does
The Otodom Poland Property Listings Scraper extracts live property listings from Otodom.pl public search results and paginated listing pages — no login, no browser, no proxies. Per the README:
-
Filters by transaction type (
sprzedazsale orwynajemrent), property category (mieszkanieflat ordomhouse) and city path, e.g.mazowieckie/warszawa/warszawa/warszawafor Warsaw. -
Structured records containing the listing headline, price with currency (always PLN), transaction type, Otodom's own property classification (
FLAT,HOUSE, orINVESTMENTfor new-development projects), room count, floor area in square meters, hierarchical location (voivodeship/city/district), posting timestamp, short description, up to five preview photo URLs and the direct listing URL. -
Explicit empty/failure markers: searches that return nothing or fail produce
found: falserows for transparency, never silent gaps. -
Configurable pagination:
max_pagesto walk andmax_itemsas a total row cap.
The README is clear about what this is not: not a valuation tool, and no enrichment Otodom itself does not publish — no coordinates, no agent phone numbers. Rooms reported as an open-ended "10+" come back null, not a guessed number.
Because the actor runs on Apify, the same input can be scheduled to re-run daily or hourly from the console, and every run's dataset is exportable as CSV, JSON or Excel or pullable through the API — the standard setup for price-tracking sheets and new-listing alerts.
Example: input and output
Sale apartments in Warsaw, first page only:
{
"deal_type": "sprzedaz",
"property_type": "mieszkanie",
"city": "mazowieckie/warszawa/warszawa/warszawa",
"max_items": 5,
"max_pages": 1
}
The README's documented output row:
{
"found": true,
"title": "2-pokojowe mieszkanie 38m2 + loggia Bez Prowizji",
"price": 878000,
"currency": "PLN",
"deal_type": "sale",
"property_type": "FLAT",
"rooms": 2,
"area_sqm": 38.15,
"location": "Odolany, Wola, Warszawa, mazowieckie",
"posted_date": "2026-07-30 09:16:08",
"url": "https://www.otodom.pl/pl/oferta/2-pokojowe-mieszkanie-38m2-loggia-bez-prowizji-ID4uooW",
"images": ["https://ireland.apollo.olxcdn.com/v1/files/....image;s=655x491;q=80"]
}
Pricing and the free limit
Pay-per-event: $0.005 per run start plus $0.002 per delivered result. Empty-result and failed searches are never charged. A run delivering 100 listings costs $0.005 + 100 × $0.002 = $0.205. Apify's free plan gives $5 of usage credits per month, so $5 covers about 24 such runs — roughly 2,400 listings. The dataset exports as CSV, JSON or Excel from the console, or straight from the API for downstream pipelines.
Try it
Pick deal type and property type, set the city path, and hit Start: Otodom Poland Property Listings Scraper
For AI agents and MCP
A standard Apify actor: JSON input in, structured JSON dataset rows out, callable from the Apify API, the JavaScript/Python clients, or the hosted Apify MCP server the README documents. An agent can branch on found and consume price, rooms, area_sqm and location directly — nullable fields are honestly null rather than fabricated, so downstream filters can trust the shape.
Top comments (0)