Otodom APIotodom.pl ↗
Access Otodom.pl property listings via API. Search by location, price, area, and rooms. Retrieve full details including description, images, and seller contact info.
What is the Otodom API?
The Otodom.pl API exposes 2 endpoints for searching and retrieving Polish real estate listings. The search_listings endpoint returns paginated summaries — including price, area, room count, agency, and listing URL — across primary (new developments) and secondary (resale) markets. The get_listing_details endpoint fetches a single listing's full record: HTML description, images, coordinates, address breakdown, and owner phone numbers.
curl -X GET 'https://api.parse.bot/scraper/d8c8d72e-4cd3-44cc-9ee3-522770219f2f/search_listings?page=1&rooms=ONE&market=PRIMARY&area_max=100&area_min=30&location=mazowieckie%2Fwarszawa%2Fwarszawa%2Fwarszawa&price_max=1000000&price_min=200000&estate_type=mieszkanie&transaction=sprzedaz' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace otodom-pl-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Otodom.pl Real Estate API — search, filter, and drill into listing details."""
from parse_apis.otodom_pl_real_estate_api import (
Otodom, EstateType, Transaction, Market, RoomCount, ListingNotFound
)
client = Otodom()
# Search for apartments for sale in Warsaw, primary market, 2-3 rooms
for listing in client.listingsummaries.search(
location="mazowieckie/warszawa/warszawa/warszawa",
estate_type=EstateType.MIESZKANIE,
transaction=Transaction.SPRZEDAZ,
market=Market.PRIMARY,
rooms=RoomCount.TWO,
limit=5,
):
print(listing.title, listing.area, listing.slug)
# Drill into the first result for full details
summary = client.listingsummaries.search(
location="mazowieckie/warszawa/warszawa/warszawa",
estate_type=EstateType.DOM,
limit=1,
).first()
if summary:
detail = summary.details()
print(detail.title, detail.market, detail.created_at)
print(detail.characteristics)
for phone in detail.contact_phones:
print(phone)
# Handle a listing that no longer exists
try:
gone = client.listingsummaries.search(
location="mazowieckie/warszawa/warszawa/warszawa",
limit=1,
).first()
if gone:
gone.details()
except ListingNotFound as exc:
print(f"Listing gone: {exc.url_or_slug}")
print("exercised: listingsummaries.search / details / ListingNotFound")
Search for real estate listings with various filters. Returns a paginated list of listing summaries including ID, title, price, area, rooms, location, and URL. Pagination via page number; each page returns up to 36 items. Filters combine with AND logic — all specified constraints must be satisfied.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| rooms | string | Comma-separated room count values. |
| market | string | Market type filter. |
| area_max | integer | Maximum area in square meters. |
| area_min | integer | Minimum area in square meters. |
| location | string | Location path in format voivodeship/county/municipality/city (e.g. 'mazowieckie/warszawa/warszawa/warszawa'). |
| price_max | integer | Maximum price in PLN. |
| price_min | integer | Minimum price in PLN. |
| estate_type | string | Type of property. |
| transaction | string | Transaction type. |
{
"type": "object",
"fields": {
"items": "array of listing summary objects with id, title, price, area, rooms, location, url, slug, agency, date_created",
"pagination": "object with total_pages, current_page, total_items, items_per_page"
}
}About the Otodom API
Search Listings
The search_listings endpoint accepts filters for location, price_min, price_max, area_min, area_max, rooms, market, and page. Location is specified as a slash-separated path through Poland's administrative hierarchy — voivodeship, county, municipality, city — for example mazowieckie/warszawa/warszawa/warszawa. Room counts are passed as enum strings (ONE, TWO, THREE, FOUR, FIVE_OR_MORE) in a comma-separated list. The response includes an items array of listing summaries, each carrying id, title, price, area, rooms, location, url, slug, agency, and date_created, plus a pagination object with total_pages, current_page, total_items, and items_per_page.
Listing Details
The get_listing_details endpoint accepts either a listing slug returned by search_listings (e.g. mieszkanie-3-pokojowe-warszawa-mokotow-ID4B0Pm) or a full Otodom.pl URL. The response includes the full description as HTML, an images array of URLs, market type, created_at timestamp, and a price object with value and currency. The location field contains coordinates, structured address details, and reverse-geocoded data. The owner object provides the seller or agency name, type, and one or more phones for direct contact.
Coverage and Market
Otodom.pl is Poland's largest residential property portal. Listings span apartments, houses, and other residential property types across all Polish voivodeships. The market filter distinguishes developer-sold new builds (PRIMARY) from resale stock (SECONDARY), which matters when comparing pricing across market segments or tracking new development activity in a given area.
The Otodom API is a managed, monitored endpoint for otodom.pl — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when otodom.pl changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official otodom.pl API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate Warsaw apartment listings filtered by price and minimum area for a buyer comparison tool
- Track new-development (PRIMARY market) listings in Kraków to monitor developer activity over time
- Extract seller phone numbers and agency names from
get_listing_detailsfor a real estate CRM import - Build a price-per-square-meter index using
priceandareafields across multiple Polish cities - Pull listing coordinates from the
locationobject to plot property density on a map - Monitor
date_createdtimestamps from search results to surface freshly listed properties in a given municipality - Compare room-count distributions across secondary market listings in different voivodeships
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Otodom.pl have an official developer API?+
What does the `location` field in `get_listing_details` contain?+
search_listings results.How does pagination work in `search_listings`?+
page parameter to advance through results. The response includes a pagination object with current_page, total_pages, total_items, and items_per_page so you can calculate the full result set size before iterating.Does the API cover commercial or agricultural property listings?+
rooms, area_min/max, price_min/max, and market — are oriented toward residential use. You can fork this API on Parse and revise it to add an endpoint targeting commercial or agricultural listing categories on Otodom.pl.