Search Poland's, Portugal's and Romania's biggest property portals with their own filters, then read any listing in full
Otodom (otodom.pl) is Poland's largest real-estate portal; Imovirtual (imovirtual.com, Portugal) and Storia (storia.ro, Romania) run on the same platform, so one API reads all three with site=pl, pt or ro.
3 active endpoints, on 1, 2 and 3 credit tiers.
- POST/otodom/v1/search
- POST/otodom/v1/listing
- POST/otodom/v1/locations
What Otodom + Imovirtual + Storia endpoints does ReefAPI ship?
3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Otodom + Imovirtual + Storia API
6 of 3 endpoints, ready to run
Two- and three-room flats for sale in Warsaw
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Otodom + Imovirtual + Storia API works
Otodom + Imovirtual + Storia is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 491 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
From a place name to a dated price list with every flat's details
Find the location, filter it the way the site does, page through, then read the listings that matter.
The site's location ids with level and full name; take the district's location_id.
Rows with price, price per m², monthly fee, area, rooms, floor, advertiser type and photos, plus the site's total.
Page until has_more is false.
Printed price, deposit, every characteristic, description, photos, coordinates and the advertiser's contact details as the page shows them.
A dated feed of Polish, Portuguese or Romanian listings with prices in the listing's own currency, m² prices, fees and the advertiser behind each one.
curl -X POST https://api.reefapi.com/otodom/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"site":"pl","transaction":"sell","estate":"flat","location":"mazowieckie/warszawa/warszawa/warszawa"}'{
"ok": true,
"data": { … },
"meta": {
"api": "otodom",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What an Otodom / Imovirtual / Storia field actually contains
Fields that read differently from how they look. Every row was measured against live otodom.pl, imovirtual.com and storia.ro responses on 2026-10-14.
| Field | What it holds |
|---|---|
| listing_id | The ID… code at the end of the listing's web address (for example ID4Diz3). Pass it unchanged to listing. The numeric ad_id is returned too, but the sites do not open a listing by it. Search to listing returned the same id, price, area and rooms on 27 of 27 listings across the three sites. |
| price, price_type | price is a number in the row's own currency and price_type says what it is: sale_price, monthly_rent (when transaction is rent) or, for a new-development project, from_price_per_m2 with the figure in investment_price_from_per_m2. Hidden or on-request prices are null with price_on_request true, never 0. |
| maintenance_fee_monthly | The monthly administrative fee (czynsz in Poland) the advertiser states, on sale and on rental listings. It is never added to price; it is filled on roughly 4 in 10 rows because many advertisers leave it out. |
| deposit | Rental deposit, on the listing only, as its own field next to the monthly rent and the monthly fee. |
| price_display, price_mismatch | price_display is the price exactly as the listing page prints it ("449 000 zł", "257 500 €"). price_mismatch is true when the printed price and the structured price disagree; it was false on all 27 listings checked. |
| currency | Read from each row: PLN on otodom.pl, EUR on imovirtual.com, EUR or RON on storia.ro (both occur on the same Romanian search page). |
| kind | ad for a single property, investment for a new-development project. Flat search pages contain development rows too, so filter on kind or use estate=investment. |
| advertiser_type | The site's own label: private_person, agency, developer or business. |
| total, pages, page_clamped | total is the site's own count of matching listings. A page past the last one returns no rows with page_clamped true and last_page, instead of repeating the last page. |
Listings and search results were identical when read from Poland, Germany and the United States on 2026-10-14 (same listing field by field, 36 of 36 search rows with the same values). Every filter value the API offers was checked against the site's own answer; values the site does not apply are refused with INVALID_PARAM instead of returning the unfiltered list.
Otodom, Imovirtual and Storia coverage, measured
Every number below was read from live otodom.pl, imovirtual.com and storia.ro responses on 2026-10-14, in three runs of 112 to 115 calls each; the last run answered 115 of 115 calls as expected.
Poland (otodom.pl, PLN): 153,523 flats for sale, 47,039 houses, 46,349 plots, 2,064 development projects. Portugal (imovirtual.com, EUR): 75,288 apartments for sale, 49,547 houses. Romania (storia.ro, EUR or RON): 80,852 apartments for sale, 34,848 for rent.
Polish flats for sale 153,523 → up to 400,000 zł 29,500, at least 60 m² 51,276, two or three rooms 114,976, built 2020 or later 95,426, private owners 11,093, primary market 91,305, added in the last 7 days 11,248, with a terrace 25,375, "taras" in the description 31,696.
Over 2,340 search rows: advertiser type, date and photo on every row, city on 2,256, area on 2,196, price on 2,186 (development projects are priced per m²), price per m² on 2,008, floor on 1,869, monthly fee on 886.
Search to listing: same id, price, currency, area, rooms, monthly fee and price per m² on 27 of 27 listings across the three sites; the printed price on the listing page agreed with the structured price on all of them.
Rows per page vary with the site (usually 36). Development projects return their first 10 units. Price history, agency pages and map-radius search are not covered. Location lookup matches loosely, so check full_name.
What people build with Otodom + Imovirtual + Storia
The jobs this data is most often used for.
endpoints
credits per call
Track asking prices and price per m² of flats by city and district in Poland, Portugal and Romania.
Compare rents with the monthly fee and deposit separated, for rental yield calculations.
Collect new listings every day, newest first, and read each one in full with coordinates.
Build lead lists of agencies and developers from the advertisers behind the listings.
What Otodom + Imovirtual + Storia data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 491 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/otodom/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"site":"pl","transaction":"sell","estate":"flat","location":"mazowieckie/warszawa/warszawa/warszawa"}'import requests
r = requests.post(
"https://api.reefapi.com/otodom/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"site": "pl",
"transaction": "sell",
"estate": "flat",
"location": "mazowieckie/warszawa/warszawa/warszawa"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Otodom + Imovirtual + Storia.
Get a free key →Do I need an Otodom account?▾
No. Everything is read logged out, and you call reefapi.com from anywhere.
Does it cover Portugal and Romania too?▾
Yes. site=pt reads imovirtual.com and site=ro reads storia.ro; all three sites share one platform, so the fields and filters are the same. Prices stay in each listing's own currency.
How do I search one city or district?▾
Call locations with the place name (Kraków, Mokotów, Lisboa, Cluj) and pass the returned location_id to search. On 2026-10-14 flats for sale were 153,523 in all of Poland and 20,266 in Warsaw.
Can I separate private owners from agencies and developers?▾
Yes, with owner_type. On 2026-10-14 Polish flats for sale split into 11,093 from private owners, 76,095 from agencies and 66,294 from developers. Every row also carries advertiser_type.
Is the monthly fee included in the price?▾
No. price is the sale price or the monthly rent; the administrative fee (czynsz) is maintenance_fee_monthly and the rental deposit is deposit, each in its own field.
Do you return the advertiser's phone number?▾
listing returns the phone numbers that the listing page itself shows to a logged-out visitor, with the contact name and, for agencies, the agency name, page and address.
Which room counts can I filter on?▾
1 to 5 and 6+, the classes the sites use. On 2026-10-14 two or three rooms matched 114,976 Polish flats for sale, five rooms 2,711 and six or more 727.
What about new-development projects?▾
Search with estate=investment (2,064 projects in Poland, 887 in Portugal, 73 in Romania on 2026-10-14). listing on a project returns its price-from per m², area range, number of units and the first units with price and area.
What is the Otodom + Imovirtual + Storia API?▾
Otodom + Imovirtual + Storia API is a ReefAPI endpoint group for poland's, portugal's and romania's biggest property portals: flats, houses, plots and new developments for sale and rent, with price, m² price, fees and the advertiser. It returns live JSON through POST requests under /otodom/v1.
Is the Otodom + Imovirtual + Storia API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Otodom + Imovirtual + Storia calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Otodom + Imovirtual + Storia login or account?▾
No login to Otodom + Imovirtual + Storia is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Otodom + Imovirtual + Storia data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Otodom + Imovirtual + Storia API use?▾
Otodom + Imovirtual + Storia actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Otodom + Imovirtual + Storia from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call otodom actions with the same key, credit pool and JSON envelope used by normal REST requests.
24 Real Estate APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Otodom + Imovirtual + Storia, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 490 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-14.