Otodom Property Price Scraper avatar

Otodom Property Price Scraper

Pricing

from $3.00 / 1,000 property listings

Go to Apify Store
Otodom Property Price Scraper

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.

Jad D.

Maintained by Community

Actor 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"
}
FieldNotes
listingIdStable Otodom id — use it as your join key across runs
priceValue / priceCurrencyAsking price as a number. null when the seller hides it
pricePerSqmValuePrice per m², computed by Otodom — the field most analysts actually want
areaSqm, terrainAreaSqmFloor area and plot area
rooms, floorConverted from Otodom's word enums to integers (FIVE5, GROUND0)
region, subregion, city, district, neighbourhood, streetAddress, 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, advertiserKindAgency trading name, and AGENCY / PRIVATE / UNKNOWN
isExclusiveOffer, isPromotedListing flags
imageUrl, imageCountPrimary photo and how many exist
dateCreatedFirst published — lets you measure time on market

Any search works

Point it at any Otodom search URL and change what you like:

WantURL
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.