Otodom Scraper

Otodom.pl is Poland's largest property portal, and it prints price per square meter on every card with no way to take a whole page of them away.

Otodom.pl is Poland's largest property portal, and it prints price per square meter on every card with no way to take a whole page of them away. Rows give price, area, rooms, floor, price per m2, city, province and sale-or-rent. Owner names, agent contacts and coordinates never collected.

$3.00 / 1,000 · 100.0% success over 26 public runs in the last 30 days.

Run it on Apify → Free to try - runs bill per result on your own account.

What you give it

Every field is optional unless marked; sensible defaults do the rest.

FieldTypeWhat it doesDefault
listingIds array Re-check offers you already know instead of searching: one offer ID per line (the listingId of every dataset item), the offer's full address (its ID… code is that number in base 62), or the code alone. Each one is read from its own page - price, area, rooms, floor, city, agency, every photo, the full description and the site's own status - in the shape a search result has. An offer that is gone from the site (sold, rented, expired, removed) is skipped, named in the log and not billed. When given, the search fields of this form are ignored and the run status says which. Up to 50. []
transaction string Search properties for sale (sprzedaz) or for rent (wynajem). sale
propertyType string What kind of property to search. flat
location string Otodom location path as it appears in the site's URL: "cala-polska" for all of Poland (default), a voivodeship like "mazowieckie", or a full path like "mazowieckie/warszawa/warszawa/warszawa". cala-polska
priceMinPln integer Only include listings priced at least this many złoty. For rentals this is złoty per month. -
priceMaxPln integer Only include listings priced at most this many złoty. For rentals this is złoty per month. -
sortBy string Order of results: newest (best for monitoring), price_asc, price_desc, or relevance. newest
postedAfter string Only include listings posted on or after this date. With newest-first sorting the run stops early once older listings are reached. Format: YYYY-MM-DD (for example 2026-09-08) or a full ISO timestamp such as 2026-09-08T14:30:00Z. Slash dates like 08/09/2026 are refused on purpose: they are read as September in Europe and August in the United States, and this actor will not guess which you meant. -
postedBefore string Only include listings posted on or before this date. Format: YYYY-MM-DD (for example 2026-09-08) or a full ISO timestamp such as 2026-09-08T14:30:00Z. Slash dates like 08/09/2026 are refused on purpose: they are read as September in Europe and August in the United States, and this actor will not guess which you meant. -
maxItems integer Stop after this many listings. Free-plan runs are capped at 5 items. The form starts at 25 for a cheap first run - that is the form's prefill, not a cap on your plan; clear it to use the default of 1000. 1000
scrapeDetails boolean Read each offer's own page for the seller's full property description, which the search results only tease (shortDescription). This makes one extra request per listing, so a run is slower and costs one more page fetch each. The advertiser contact block - name, phone, photo - is never read; only the description text reaches the output. Leave off for a fast search-only sweep. False
reportFailures boolean When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. True

What you get back

One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.

A real result row from a recent run:

{
  "agencyName": "OBJ estate",
  "areaM2": 43.78,
  "city": "Poznań",
  "createdAt": "2026-10-13T10:13:06+00:00",
  "currency": "PLN",
  "floor": "FOURTH",
  "imageUrls": [
    "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6IjdxaHpsemc3bDZrdC1FQ09TWVNURU0iLCJ3IjpbeyJmbiI6ImVudmZxcWUxYXk0azEtQVBMIiwicyI6IjE2IiwiYSI6IjAiLCJwIjoiMTAsLTEwIn1dfQ.v76T4Qhw4fBrDQmrrCDoC4LGQcRG8dc6wpShVRdHdk4/image;s=655x491;q=80",
    "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Inl5MDVtcGkxcGdjdS1FQ09TWVNURU0iLCJ3IjpbeyJmbiI6ImVudmZxcWUxYXk0azEtQVBMIiwicyI6IjE2IiwiYSI6IjAiLCJwIjoiMTAsLTEwIn1dfQ.KDrgc5QORx4K-BKU-grSFQFYL6mgjHVo2LWnNQPHddM/image;s=655x491;q=80",
    "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Im03ZXp0Y2RsbWpwMzItRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.owRE_LZXAA6RPLYRw6Z3qT_9G4zTtOi_GC8_zY5P98Y/image;s=655x491;q=80"
  ],
  "isDevelopment": false,
  "listingId": "68521944",
  "pricePerM2Pln": 12700,
  "pricePln": 556006,
  "promoted": false,
  "propertyType": "FLAT",
  "province": "wielkopolskie",
  "rentExtrasPln": null,
  "rooms": 2,
  "sellerType": "agency",
  "shortDescription": null,
  "terrainAreaM2": null,
  "title": "Duża strefa dzienna | Świetny układ! Od ręki",
  "transaction": "sale",
  "updatedAt": "2026-10-13T10:13:06Z",
  "url": "https://www.otodom.pl/pl/oferta/duza-strefa-dzienna-swietny-uklad-od-reki-ID4DwGE"
}
FieldTypeMeaning
listingId string Otodom listing ID.
url string Direct link to the listing.
title string Listing title as posted.
propertyType ['string', 'null'] Property category, e.g. FLAT, HOUSE, TERRAIN.
transaction ['string', 'null'] sale or rent.
pricePln ['number', 'null'] Price in złoty; for rentals per month. Null when the listing hides its price.
rentExtrasPln ['number', 'null'] Additional monthly charges (czynsz) for rentals, when reported.
pricePerM2Pln ['number', 'null'] Price per square meter in złoty, when reported.
currency string Almost always PLN.
areaM2 ['number', 'null'] Living area in square meters.
terrainAreaM2 ['number', 'null'] Plot area in square meters, for houses and plots.
rooms ['integer', 'null'] Number of rooms.
floor ['string', 'null'] Floor as the site reports it, e.g. GROUND, FIRST, ABOVE_TENTH.
city ['string', 'null'] City. City-level only - streets, house numbers and exact coordinates are never collected.
province ['string', 'null'] Voivodeship, e.g. mazowieckie.
sellerType string agency or private. Private owners' identity is never collected.
agencyName ['string', 'null'] Estate agency business name; null for private owners.
isDevelopment boolean True for developer investment listings.
promoted boolean True for paid promoted placements.
shortDescription ['string', 'null'] Short listing description as posted.
description string The seller's full free-text property description, read from the offer's own page. Only present when Fetch descriptions is on - the search results carry only shortDescription. The advertiser contact is never read.
createdAt ['string', 'null'] When the listing first appeared (ISO timestamp when reported).
updatedAt ['string', 'null'] The site's last-modified date for the listing.
imageUrls array Listing photo URLs (up to 8).
status string The site's own word for the offer's state (active, ...). Present on offers read through listingIds; a search only ever lists active offers.

Health

100.0% success over 26 public runs in the last 30 days. Live record, failures included: status page.

Full documentation, examples and the AI-assistant prompt live on the store page.