Otodom Scraper | Poland Real Estate Sale Rent avatar

Otodom Scraper | Poland Real Estate Sale Rent

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Otodom Scraper | Poland Real Estate Sale Rent

Otodom Scraper | Poland Real Estate Sale Rent

Scrape Otodom.pl Poland sale, rent & developer listings. Extract prices (PLN), rooms, size, agencies & URLs — Otodom API alternative.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

Otodom Scraper — Poland Real Estate Sale, Rent & Developers

Scrape Otodom.pl property listings for sale and rent in Poland — plus developer company pages — then download structured data as Excel, CSV, or JSON.

This Actor is a practical Otodom API alternative for property research, market monitoring, agency lead gen, and investment pipelines on otodom.pl. Enter a city (or voivodeship / nationwide), pick sale or rent (or a developer page), and get clean Dataset rows with listing IDs, prices in PLN, rooms, size, agencies, and direct Otodom URLs.

  • Pull for-sale (sprzedaż) and for-rent (wynajem) listings from Otodom
  • Filter by primary / secondary market (PRIMARY / SECONDARY) and estate type (mieszkanie, dom, inwestycja, …)
  • Search by city, voivodeship, full location path, nationwide, or multiple locations[]
  • Scrape developer entity pages (/pl/firmy/deweloperzy/...) with portfolio listings
  • Optionally enrich listing details with guest-visible LDP fields (characteristics, energy cert, build year, and more)
  • Export to Excel / CSV / JSON, or connect Make, n8n, Zapier, Python, or Apify MCP / API
  • Pay per event — Actor start + each Dataset result; platform compute is included (you do not pay separate Apify usage)

What does the Otodom Scraper do?

Otodom Scraper lets you extract structured Poland real-estate data from Otodom without maintaining your own CloudFront / browser farm. Give it a location and channel (or a developer URL / listing detail URLs), then start a run.

Under the hood, the Actor:

  1. Validates your input (channel, market, location / developer, filters)
  2. Calls a managed Cloud Run worker that fetches Otodom pages with Polish residential egress
  3. Parses guest-visible Next.js SSR (__NEXT_DATA__searchAds / pageProps.ad / developer owner)
  4. Pushes Dataset rows with preview fields (name, type, status, country, authority)
  5. Writes RUN_SUMMARY (and ERROR_SUMMARY on failure) to the key-value store

You run it like any other Apify Actor — schedule it, call it from the API, or plug it into automations.


What Otodom data can I extract?

DataSale / RentDeveloper
Listing / developer title
Listing ID + slug ID token
Price (PLN) + display
Rooms / floor / area (m²)
Estate / property type
Market (primary / secondary)
City / address locality
Agency / private owner
Direct Otodom URL
Images
LDP characteristics (enrich)✅*
Developer portfolio ads

*With enrichDetails: true or detail URLs via detailUrls.

With enrichDetails on (the default), each listing row is enriched from its detail page (LDP) and includes the Lead / Contact fields below (contentDepth=detail). SERP-only runs (enrichDetails: false) return contentDepth=guest_preview with no contact data, because Otodom search cards do not carry phones.


Lead / Contact fields

Every enriched listing item carries the following contact / clue keys. Top-level lead keys that are null are paired with a leadAbsences reason so you know why a field is empty (nested address sub-fields such as unit / locality / region / postalCode may simply be unset per-listing; see Honest limitations).

FieldTypeMeaning on Otodom
phones[{value, type}]Mobile/landline numbers for the listing agent or private owner. Already-visible in Otodom's Next.js __NEXT_DATA__ hydration JSON on the LDP (e.g. +48695818511, type mobile). Empty on SERP cards, so the worker opens each LDP via enrichDetails.
emails[{value, type}]Contact email. Otodom only exposes email through a login-gated contact form (data-testid=ad.contact-form.field-email) — no mailto: and no plaintext. Returned as [] with leadAbsences.emails = "闸门锁".
address{street, unit, locality, region, postalCode, country, full}Listing address. street carries the street name (the building number, when present, is embedded in the string, e.g. Ul. Floriańska 16). country=PL; full is the assembled address string.
geo{lat, lng}Listing coordinates from the LDP, in addition to (not instead of) the street address.
person{name, role}Agent/owner contact name (e.g. Joanna, Amadeusz) with role=owner. Already-visible on the LDP.
org{name, id}Agency name + Otodom agency id. Populated for agency listings; null for private listings (then leadAbsences.org = "本站无").
web{website, socials[]}Per-entity website / social links. Otodom does not expose per-listing, per-agent, or per-agency websites or socials (agency.website=null). Returned as null with leadAbsences.web = "本站无".
leadSourceenumdetail — lead fields are read from the listing detail page, not from the search results.
leadRevealenumvisible — phones, person, address, and geo are already-visible in the page's hydration JSON; no click-to-reveal or XHR unlock is needed.
leadAbsencesobjectPer-subfield absence reason: emails="闸门锁", web="本站无", and org="本站无" (private listings).

Reveal cost

Otodom exposes phones, person, address, and geo already-visible in the Next.js __NEXT_DATA__ hydration JSON on the listing detail page (LDP). There is no "show phone" click-to-reveal control and no XHR-after-click unlock (revealControls=[] site-wide). The only extra cost is fetching each LDP: when enrichDetails is on (the default), the worker makes one additional HTTP request per listing using Polish residential egress. This does not trigger any UI interaction, CAPTCHA, or login wall. SERP cards carry no contact info (contacts[] empty), so enrichDetails is required for any lead field.

Honest limitations

  • Emails are not available. Otodom only accepts email via a login-gated contact form — there is no mailto: and no plaintext. The Actor does not submit the form; emails=[] and leadAbsences.emails="闸门锁".
  • 门牌 (building number) is not a separate field. Otodom hides the dedicated street.number value (returns null for privacy). The building number, when present, is embedded inside the street.name string (e.g. Ul. Floriańska 16). address.unit is therefore null; use address.street / address.full.
  • Web / socials are not exposed per-entity. No per-listing, per-agent, or per-agency website or social links (agency.website=null; only platform-level sameAs). web=null and leadAbsences.web="本站无".
  • Org is empty on private listings. Private (non-agency) listings have no agency, so org=null and leadAbsences.org="本站无". Agency listings populate org.name + org.id.
  • SRP-only runs carry no leads. If you set enrichDetails: false, rows are contentDepth=guest_preview with no phone/person/address — Otodom search cards do not include contacts.

Why scrape Otodom?

Otodom is one of Poland’s largest real-estate portals (OLX Group), covering sale, rent, investments, and developers nationwide. Teams scrape Otodom to:

  • Build custom Poland property databases for research or lead gen
  • Track sale / rent inventory by city, voivodeship, and property type
  • Separate primary vs secondary market supply
  • Monitor investment (inwestycja) and developer portfolios
  • Feed CRM workflows, dashboards, or enrichment pipelines with structured listing URLs and PLN prices

More Actors like this

Need another property portal or a different vertical? Use a dedicated Actor below for structured fields. Stay on Otodom Scraper for Polish Otodom sale and rent listings.

Similar real estate scrapers

Prefer another specialized scraper?

If your target has a specialized Actor below, use that first — usually cheaper and more structured than a generic scrape.

Jobs & Freelance

E-commerce

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General tools

→ See the full catalog in Related Actors below, or browse apify.com/lentic_clockss.


How to scrape Otodom (no code required)

  1. Create a free Apify account
  2. Open Otodom Scraper
  3. Choose a channel (sale, rent, or developer)
  4. For listings: enter a location (e.g. warszawa, mazowieckie, or national); for developers: enter developerUrl
  5. Optionally set market, propertyType, filters, maxResults, and enrichDetails
  6. Click Start and download the Dataset as JSON, CSV, Excel, or JSONL

Start with maxResults: 5–10 to verify the query, then scale up.


How much does it cost to scrape Otodom?

This Actor uses pay-per-event pricing. You are charged for:

EventPrice
Actor Start (apify-actor-start)$0.005 per start
Result (apify-default-dataset-item)$3.00 / 1,000 results ($0.003 each)

Platform usage costs are included — you do not pay separate Apify compute/proxy usage for this Actor on top of the event prices above.

Example cost estimates

Results collectedApprox. event cost*
100~$0.31
1,000~$3.01
10,000~$30.01

*Assumes one Actor start at default memory billing for start events, plus $0.003 per Dataset item. Exact start billing can scale with allocated memory (one start event per GB, minimum one).

Free Apify trial credit can cover a small test run — try maxResults: 5 first.


Input

Open the Input tab for the full form. Common fields:

FieldDescription
channelsale / rent / developer
locationCity (warszawa), voivodeship (mazowieckie), full path, or national / polska
locationsExtra geos; results merged and deduped
propertyTypemieszkanie, dom, dzialka, lokal, pokoj, garaz, inwestycja, …
marketALL / PRIMARY / SECONDARY
minPrice / maxPrice / minArea / maxAreaSERP filters
rooms / privateOnly / sortByExtra filters
developerUrl / developerId / developerSlugRequired for channel=developer
detailUrlsListing (/pl/oferta/...) or developer URLs
maxResultsCap on Dataset rows (1–500)
maxPages?page=N pagination (~36 cards/page on SERP)
enrichDetailsFetch LDP and merge characteristics / JSON-LD

Example: Warsaw apartments for sale (primary market)

{
"location": "warszawa",
"channel": "sale",
"propertyType": "mieszkanie",
"market": "PRIMARY",
"maxResults": 20,
"maxPages": 1
}

Example: multi-city rent listings

{
"locations": ["warszawa", "krakow", "wroclaw"],
"channel": "rent",
"propertyType": "mieszkanie",
"maxResults": 50,
"maxPages": 2
}

Example: investment listings

{
"location": "warszawa",
"channel": "sale",
"propertyType": "inwestycja",
"maxResults": 30,
"maxPages": 1
}

Example: developer portfolio

{
"channel": "developer",
"developerUrl": "https://www.otodom.pl/pl/firmy/deweloperzy/develia-ID10556359",
"maxResults": 20
}

Example: enrich listing details

{
"location": "warszawa",
"channel": "sale",
"maxResults": 10,
"enrichDetails": true
}

Output sample

Each Dataset item includes preview fields plus listing attributes:

{
"name": "2-pokojowe mieszkanie z balkonem",
"type": "listing",
"status": "For Sale",
"country": "PL",
"authority": "otodom.pl",
"listingId": "68241709",
"listingIdToken": "ID4CkMJ",
"channel": "sale",
"market": "PRIMARY",
"estate": "FLAT",
"price": 610000,
"priceDisplay": "610000 PLN",
"currency": "PLN",
"rooms": 2,
"sqm": 48.5,
"city": "Warszawa",
"agencyName": "Example Agency",
"listingUrl": "https://www.otodom.pl/pl/oferta/....-ID4CkMJ",
"imageUrl": "https://ireland.apollo.olxcdn.com/...",
"contentDepth": "detail",
"phones": [{ "value": "+48604146556", "type": "mobile" }],
"emails": [],
"address": {
"street": "Ul. Floriańska 16",
"unit": null,
"locality": null,
"region": null,
"postalCode": null,
"country": "PL",
"full": "Ul. Floriańska 16, PL"
},
"geo": { "lat": 50.0647, "lng": 19.9450 },
"person": { "name": "Mariusz Witkiewicz", "role": "owner" },
"org": { "name": "White Estates", "id": "7547458" },
"web": null,
"leadSource": "detail",
"leadReveal": "visible",
"leadAbsences": { "emails": "闸门锁", "web": "本站无" }
}

Diagnostics are stored in the key-value store as INPUT_ECHO, RUN_SUMMARY, and ERROR_SUMMARY.


Tips for better Otodom scrapes

  • Prefer city slugs or full Otodom location paths when you need a district (e.g. mazowieckie/warszawa/warszawa/warszawa/bemowo)
  • Use market=PRIMARY for new-build / primary market inventory
  • Use propertyType=inwestycja for investment-style ads
  • Keep enrichDetails off for faster SERP-only runs; turn it on when you need LDP characteristics
  • Developer SSR pages return a short first page of portfolio ads — raise expectations with maxResults carefully

Integrations and API

  • Apify API — start runs and fetch Dataset items programmatically
  • Apify MCP — use this Actor from AI agents
  • Make / Zapier / n8n — schedule exports into Sheets, CRMs, or warehouses
  • Python / Node.js clients — apify-client for batch pipelines

FAQ

Is this an official Otodom API?

No. This Actor scrapes public guest-visible Otodom pages and normalizes them into Dataset rows. It is designed as a practical Otodom data / API alternative for research and automation.

Does it return phone numbers?

Yes — when enrichDetails is on (the default), the Actor reads phone numbers that Otodom already shows in the listing detail page's hydration data. There is no click-to-reveal or CAPTCHA unlock. See Lead / Contact fields for the full contact schema and which fields are unavailable (emails are login-gated; web/socials are not exposed per-entity).

Which locations work?

Known cities (e.g. Warszawa, Kraków), all 16 voivodeships, full Otodom location paths, national / polska, and multi-geo via locations[].

Can I scrape developers?

Yes — set channel=developer and provide developerUrl (or slug/id). You get one developer profile row plus portfolio listing rows from the SSR payload.


Scraping public web pages may be subject to Otodom’s terms, robots rules, and local law. Use this Actor responsibly, respect rate limits, and only process data you have a lawful basis to use. You are responsible for how you use the output.


Support

Questions or feature requests? Open an issue on the Actor page or contact the developer via Apify.


All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.

Jobs & Freelance

Real Estate

E-commerce

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General Tools

→ Browse the full profile: apify.com/lentic_clockss