Otodom Property Scraper — Poland Sale + Rent · PLN/m² Market
Pricing
from $1.50 / 1,000 property extracteds
Otodom Property Scraper — Poland Sale + Rent · PLN/m² Market
Scrape Otodom.pl into clean structured data. Extract Polish sale and rental property listings by location, ZIP, coordinates, polygon, or search URL — with price, PLN per square meter, area, rooms, geo, built-in market KPIs, and optional owner/agent contact enrichment.
Pricing
from $1.50 / 1,000 property extracteds
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Otodom Property Scraper — Poland Sale + Rent · PLN/m² · Market KPIs
🎯 Extract Polish Sale + Rent Listings With Market KPIs in Seconds
Real estate investors, agents, market analysts, and data teams — get full Otodom listing data plus PLN/m² analytics and optional owner/agent contacts
📋 Overview
Pull Otodom.pl listings — both for-sale AND rentals — into clean structured data. Search anywhere in Poland by location name, ZIP code, coordinates, drawn polygon, or an Otodom search URL, and get back complete listings with price, price-per-square-metre, area, rooms, floor, geo, and photo metadata.
Why investors and agents choose us over the alternatives:
- 📊 Analytics included, not just raw data: Auto-generated HTML market report with median price, PLN/m² distribution (min/median/avg/p90/max), top cities by inventory, and property-type breakdown — computed for you on every run
- 🧭 Five search modes: location, ZIP, coordinates (+ radius), polygon, and search URL — the full Otodom geo-search surface, plus primary/secondary market and advertiser-type filters
- ✅ Sale + Rent in one actor: One
listingTypetoggle gets you sales, rentals, or both sides - 📇 Optional owner/agent contact enrichment: Owner or agent name + phone, agency contacts, plus build year, construction status, heating, and ownership — a lead-generation and due-diligence layer (PAID)
- 🆓 FREE tier with full feature parity: 25 listings per run, no credit card, same KPIs and HTML report — just a smaller cap
✨ Features
- 🏠 Both sides of the market — sale and rent via a single
listingTypetoggle - 🧭 Five search modes — by location name, ZIP (NN-NNN), coordinates (+ radius), polygon, or Otodom search URL
- 🔧 Rich server-side filters — property type, market (primary/secondary), advertiser type, sort order, price / area / rooms / year-built ranges, listed-within-days, photos-only
- 📈 Market KPIs in HTML report — median price, PLN/m² distribution, top cities by inventory, property-type tally
- 📇 Owner/agent contact enrichment — name, phone, agency, and full characteristics per listing (PAID toggle)
- 📦 Bulk search — pass an array of locations, ZIP codes, or search URLs in one run (PAID)
- 📱 Standard Apify exports — JSON, CSV, XLSX, RSS, HTML
🎬 Quick Start
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~otodom-property-scraper/runs?token=[YOUR_TOKEN]' \-H 'Content-Type: application/json' \-d '{"searchMode":"location","location":"Warszawa","listingType":"sale","maxResults":50}'
🚀 Getting Started (3 Simple Steps)
Step 1: Pick Sale, Rent, or Both
Set listingType to sale, rent, or both. Both runs each query twice (PAID — doubles the query count).
Step 2: Pick Your Search Mode
Choose a searchMode and provide its input:
location→location(e.g."Warszawa")zip→zipCode(e.g."00-950")coordinates→latitude+longitude(+ optionalradius)polygon→polygon(a drawn map ring)url→url(an Otodom search-results URL)
Step 3: Run & Export
Hit Run. Listings stream into the dataset; an HTML market report lands in the key-value store. Export as JSON, CSV, or Excel.
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
listingType | string | No | sale, rent, or both (default: sale). both is PAID-only. |
searchMode | string | No | location, zip, coordinates, polygon, or url (default: location). |
location | string | If searchMode=location | Polish place name (e.g. Warszawa). |
locations | array | No | Multiple place names in one run (PAID). |
zipCode | string | If searchMode=zip | Polish postal code, NN-NNN. |
zipCodes | array | No | Multiple ZIP codes in one run (PAID). |
latitude / longitude | number | If searchMode=coordinates | Search centre. |
radius | integer | No | Radius in km around the centre. |
polygon | string | If searchMode=polygon | A lon lat,... ring. |
url | string | If searchMode=url | An Otodom search-results URL. |
urls | array | No | Multiple search URLs in one run (PAID). |
propertyType | string | No | Flat, House, Land, Commercial, Warehouse, Garage, Room, Investment. |
market | string | No | All, Primary, Secondary. |
ownerType | string | No | All, Agency, Private, Developer. |
sortOrder | string | No | Relevance, Newest, Price_Low_to_High, Price_High_to_Low, Price_Per_Meter_Low, Area_Large_to_Small. |
minPrice / maxPrice | integer | No | Price range in PLN. |
minArea / maxArea | integer | No | Living-area range in m². |
minRooms / maxRooms | integer | No | Room-count range. |
minYearBuilt / maxYearBuilt | integer | No | Construction-year range. |
daysSinceCreated | integer | No | Only listings created within the last N days. |
hasPhotos | boolean | No | Only listings with at least one photo. |
maxResults | integer | No | Listings per query, 1–500 (default: 72). FREE tier capped at 25 per run. |
includeDetails | boolean | No | Fetch full detail + owner/agent contacts per listing — PAID only (default: false). |
Example — Location sale search:
{"listingType": "sale","searchMode": "location","location": "Kraków","propertyType": "Flat","maxResults": 100}
Example — Coordinates rentals with radius:
{"listingType": "rent","searchMode": "coordinates","latitude": 52.2297,"longitude": 21.0122,"radius": 5,"maxResults": 50}
Example — Bulk locations, both sides, with contact enrichment:
{"listingType": "both","searchMode": "location","locations": ["Warszawa", "Wrocław", "Gdańsk"],"maxResults": 200,"includeDetails": true}
📤 Output
Results land in the Apify dataset. Common fields on every listing:
| Field | Type | Description |
|---|---|---|
propertyId | integer | Unique Otodom listing ID |
propertyTitle | string | Listing headline |
listingType | string | sale or rent |
propertyType | string | FLAT, HOUSE, LAND, etc. |
url | string | Full listing URL on otodom.pl |
thumbnailUrl | string | Preview image |
pricing | object | price, currency, pricePerSquareMeter, rentAdminFee, hidePrice |
specs | object | areaInSquareMeters, terrainAreaInSquareMeters, rooms, floor |
location | object | city, province, street, district, hierarchy |
flags | object | isPrivateOwner, isExclusiveOffer, isPromoted |
agency | object | Search-card agency (null for private offers) |
images | array | Photo URLs |
scrapedAt | string | ISO timestamp |
Enriched fields (when includeDetails is on): propertyDescription, market, advertiserType, characteristics (build year, construction status, material, heating, ownership, floor), coordinates, and contact (owner/agent name + phone, agency name/URL/address/phones).
Sale example:
{"propertyId": 68159688,"listingType": "sale","propertyType": "FLAT","url": "https://www.otodom.pl/pl/oferta/mieszkanie-46-92-m-warszawa-ID4BZrO","pricing": { "price": 2000000, "currency": "PLN", "pricePerSquareMeter": 42626 },"specs": { "areaInSquareMeters": 46.92, "rooms": 2, "floor": "3" },"location": { "city": "Warszawa", "province": "mazowieckie", "district": "Śródmieście" }}
💼 Use Cases
1. Polish Market Analysis
Pull median price, PLN/m², and city/type breakdowns across any Polish location for housing-market research and dashboards.
2. Property Comparables (Comps)
Extract deduped, structured sale or rent comps by location, ZIP, coordinates, polygon, or search URL for valuation and underwriting.
3. Agent & Owner Lead Generation
Enrich listings with owner/agent name, phone, and agency contacts for CRM building and outreach.
4. Investment Underwriting
Compare price and PLN/m² across primary vs secondary market and property types to source and price deals.
5. Real-Estate Data Pipelines
Feed clean Otodom listing data into AVMs, price-prediction models, and scheduled monitoring pipelines.
🔗 Integration Examples
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/otodom-property-scraper').call({listingType: 'sale',searchMode: 'location',location: 'Warszawa',maxResults: 100,includeDetails: true});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/otodom-property-scraper').call(run_input={'listingType': 'rent','searchMode': 'zip','zipCode': '00-950','maxResults': 100})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item)
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~otodom-property-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"listingType":"sale","searchMode":"location","location":"Gdańsk","maxResults":150}'
📊 Performance & Pricing
FREE Tier (Try It Now)
- 25 listings per run — full feature parity, same data quality
- 1 query per run
- No credit card required
PAID Tier (Production Ready)
- Unlimited listings and queries per run
listingType: "both"(sale + rent in one run)- Bulk location / ZIP / URL arrays
- Owner/agent contact + full-detail enrichment
- Pay-per-result: only charged for listings actually returned
💰 Transparent per-result pricing — a low per-listing rate for search results, with a separate charge only when you opt into full-detail contact enrichment. Every listing comes with structured pricing and the run produces a full HTML market report with median, distribution, and city breakdowns — no post-processing required.
❓ Frequently Asked Questions
Q: Does this cover rentals?
A: Yes — set listingType: "rent" for rentals only, or listingType: "both" (PAID) to scrape sale + rent in a single run.
Q: How many listings can I extract? A: FREE tier: 25 per run. PAID tier: unlimited — each query auto-paginates the full result set.
Q: How do I get owner/agent phone numbers?
A: Turn on includeDetails (PAID). Each listing is enriched with the owner or agent name + phone and any agency contacts.
Q: Which areas of Poland are covered? A: All of Poland — search by any city, district, or voivodeship name, by ZIP, by coordinates, by polygon, or by an Otodom search URL.
Q: What output formats are available? A: JSON, CSV, Excel — exported directly from the Apify dataset.
⚠️ Trademark Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Otodom, Grupa OLX sp. z o.o., or any of their subsidiaries. The name "Otodom" is used solely in a descriptive sense to identify the public data source the Actor reads from. All trademarks, service marks, and trade names referenced in this Actor or its documentation are the property of their respective owners.
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
🤝 Support
- For issues or questions, open an issue in the actor's Issues tab
- Check SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools