Otodom.pl Scraper — Polish Property Listings, Photos, Dates avatar

Otodom.pl Scraper — Polish Property Listings, Photos, Dates

Pricing

from $2.00 / 1,000 listings

Go to Apify Store
Otodom.pl Scraper — Polish Property Listings, Photos, Dates

Otodom.pl Scraper — Polish Property Listings, Photos, Dates

Scrape Otodom.pl property listings for sale and rent across Poland — Warsaw, Krakow, Wroclaw, Gdansk and every other city. 30 fields per listing: price, price per m2, area, rooms, geo, agency, photo URLs, publication date and days on market.

Pricing

from $2.00 / 1,000 listings

Rating

0.0

(0)

Developer

Anatoly Skuba

Anatoly Skuba

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Extract property listings from Otodom.pl, Poland's largest real estate portal — for sale and for rent, apartments, houses and plots. No login, no cookies, no browser.

Empty results, and why you will not get them here

A scraper built on CSS selectors fails quietly. When Otodom changes its markup, or answers an automated request with a block page, you do not get an error — you get an empty table, or a column of empty values, and you find out later.

This Actor is built the other way round:

  • it reads the data Otodom already renders into the page, so a redesign of the visual layout does not change what it returns;
  • it goes through residential proxies with polite delays and retries every page;
  • at the end of every run it prints how many pages failed and how many rows it skipped, and warns you when a promised field came back mostly empty. You never have to guess whether the file is complete;
  • you pay per listing returned. A run that finds nothing costs you the Actor start fee of $0.00005 and nothing else.

Quick Start

  1. Open otodom.pl, set your filters
  2. Copy the address of the results page (not a single listing)
  3. Paste it into searchUrls and press Start

The default input works out of the box: apartments for sale in Warsaw.

{
"searchUrls": ["https://www.otodom.pl/pl/wyniki/sprzedaz/mieszkanie/mazowieckie/warszawa/warszawa/warszawa"],
"maxItems": 1000
}

Why this one does not break

Most scrapers read the page with CSS selectors. When the site changes its markup, they silently return nothing.

This Actor reads the data the server already renders into the page as structured JSON. There are no CSS selectors anywhere in the code. The listing array is located by its shape — the set of fields every record must have — rather than by a fixed path, so a framework upgrade that moves the data does not break extraction.

  • No browser. Plain HTTP requests, so runs are fast and compute is cheap
  • 36 listings per page, so large result sets finish quickly
  • Typed fields. Numbers arrive as numbers, room counts as integers

A failed page is retried three times with backoff and never aborts the run. A malformed listing is skipped, not the page around it. Every run writes a RUN_STATS record with the real failure rate — you can audit it yourself.

Output

FieldNotes
id, urlStable listing id and direct link
typeflat, house, terrain, …
titleListing headline
price, currency, marketingTypeBUY / RENT, PLN
pricePerSqmTaken from the source, or calculated when missing
priceHiddenSome listings hide the price
livingSpace, terrainArea
roomsInteger — the source returns words like THREE
street, houseNumber, city, province
realtorCompany, realtorIdAgency — see below
isPrivateOwnerWhether the seller is a private person
isExclusiveOffer, isPromotedListing flags
developmentTitleFor new-build projects
imagesCount, source
countryAlways PL
publishedAtReal publication date and time from the portal
daysOnMarketDays since publication, calculated for you
imageUrlsFull-size photo URLs, ready to download
sourceUrl, scrapedAt

The three things that go wrong with property scrapers

These are the complaints you will find under other Otodom scrapers in this Store.

"It stopped working." This Actor reads the structured data the server already puts inside the page, not CSS selectors, so a visual redesign does not break extraction. A health check runs every morning, so a real break is found before a customer runs into it.

"Missing the posted date." Every listing carries publishedAt with the portal's own publication timestamp, plus daysOnMarket calculated from it. No extra requests, no extra cost.

"Unexpected billing." You are charged per listing written to the dataset, not per request. maxItems is a hard stop. Otodom mixes developer projects and hidden-price listings into results — measured on 1,000 Warsaw listings: 6.9% developer projects, 9.1% with no price. Turn on skipWithoutPrice and those are dropped before billing.

No personal data

This Actor returns the agency name — a business — and a boolean flag for whether a listing comes from a private seller. It does not return any private seller's name, phone number or email.

If you need personal contact data, this is not the right Actor, and under GDPR you would need your own lawful basis for processing it.

Limits — what this Actor does not do

  • Search result pages only. Full listing detail pages are not fetched
  • Poland (otodom.pl) only
  • No listing photos, only the image count
  • No publication date. Unlike some portals, Otodom does not expose it in search results, so daysOnMarket is empty here

Pricing

$2.00 per 1,000 listings — $0.002 per listing — plus $0.00005 per Actor start. Platform usage (compute and proxy) is included in that price and is not billed to you separately.

A run that returns nothing costs nothing beyond the Actor start.

Cost control

Set Max listings before you press Start and the run's cost is fixed in advance: 1,000 listings is $2.00, 250 listings is $0.50. The Actor stops exactly at that number, on every plan, and writes a RUN_STATS record with what it actually did. Nothing here depends on your plan tier — the behaviour on the Free plan is the same as on any other, just bounded by the credit the plan gives you.

Development

$npm test # regenerates the fixture and runs offline parser tests, no network