Otodom Property Price Scraper
Pricing
from $3.00 / 1,000 property listings
Otodom Property Price Scraper
Extract Otodom property listings as structured JSON: price, price per m2, floor area, rooms, floor and location. No personal data, ever.
Pricing
from $3.00 / 1,000 property listings
Rating
0.0
(0)
Developer
Jad D.
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract Otodom property listings as clean structured JSON or CSV: asking price, price per m², floor area, room count, floor, and location. Any city, any property type, sale or rental. No account, no browser, no personal data.
Press Start and it returns 100 Warsaw flats immediately — every input field has a working default.
What you get
One flat row per listing. No nested objects to unpick.
{"listingId": "68305308","title": "Duży taras | Klucze w 6msc | Przestronny metraż","url": "https://www.otodom.pl/pl/oferta/duzy-taras-klucze-w-6msc-ID4CBkv","transaction": "SELL","estateType": "FLAT","priceValue": 3367715,"priceCurrency": "PLN","pricePerSqmValue": 26300,"areaSqm": 128.05,"rooms": 5,"floor": 9,"city": "Warszawa","district": "Mokotów","neighbourhood": "Służewiec","street": "Wołoska","agencyName": "New Home","advertiserKind": "AGENCY","scrapedAt": "2026-08-12T09:41:02.187Z"}
| Field | Notes |
|---|---|
listingId | Stable Otodom id — use it as your join key across runs |
priceValue / priceCurrency | Asking price as a number. null when the seller hides it |
pricePerSqmValue | Price per m², computed by Otodom — the field most analysts actually want |
areaSqm, terrainAreaSqm | Floor area and plot area |
rooms, floor | Converted from Otodom's word enums to integers (FIVE → 5, GROUND → 0) |
region, subregion, city, district, neighbourhood, street | Address, most general to most specific. district and neighbourhood come from Otodom's own geocoding, so they are consistent across listings rather than typed by an agent |
agencyName, advertiserKind | Agency trading name, and AGENCY / PRIVATE / UNKNOWN |
isExclusiveOffer, isPromoted | Listing flags |
imageUrl, imageCount | Primary photo and how many exist |
dateCreated | First published — lets you measure time on market |
Any search works
Point it at any Otodom search URL and change what you like:
| Want | URL |
|---|---|
| Warsaw flats for sale (default) | /pl/oferty/sprzedaz/mieszkanie/warszawa |
| Kraków rentals | /pl/oferty/wynajem/mieszkanie/krakow |
| Houses in Gdańsk | /pl/oferty/sprzedaz/dom/gdansk |
maxItems is a hard cap on billable results, so it is also your spend cap. A single city search runs to 500+ pages, so set it deliberately.
Compliance, stated plainly
This actor never returns personal data. Not "stripped afterwards" — never collected.
That matters more here than on most sources. Every raw Otodom record contains an organisationAssignedMember object holding an agent's first name, last name and mobile number, sitting one key away from the price. The output schema is a fixed allowlist of 31 fields, and rows are constructed from that list rather than filtered against a blocklist — so those fields cannot reach your dataset even if Otodom renames or adds them. There are tests asserting exactly that against real captured records, plus a runtime guard that refuses to push a row carrying a forbidden field.
The agency trading name is returned, because a business is not a person.
Private-seller listings are excluded by default. Roughly 13% of listings are posted by private individuals rather than agencies. Even with every name and phone number removed, a precise address plus an asking price relates to an identifiable person. You can include them with includePrivateSellers, and when you do, the street and coordinates are removed while the price, area and district remain.
robots.txt is respected in code, not just in spirit: /api/, /konto, /login and registration paths are refused even if you pass them as input. No login, ever — everything is read from pages served to an anonymous visitor.
Notes
Data is read from the __NEXT_DATA__ payload Otodom server-renders for search engines, not from CSS selectors. That makes this unusually stable — structured data is a contract the site maintains deliberately, so it changes far less often than markup. It is also why no browser is needed, which is why it is cheap.
Duplicate listings are removed within a run: Otodom repeats promoted listings across pages, and you should not pay twice for the same row.
Listings with a hidden price are skipped without charge. You pay for results, not attempts.
What this does not return: GPS coordinates. Otodom's search payload carries a map radius but no latitude or longitude, so rather than ship an always-empty column the field is simply absent. district and neighbourhood are the finest geography available.