Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Otodom + Imovirtual + Storia API page →
Real Estate

Otodom + Imovirtual + Storia API & Scraper

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 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

`search` lists flats, houses, plots, commercial premises, halls, garages, rooms and new-development projects for sale or rent, in the whole country or one location, with the site's own filters: price, price per m², area, number of rooms, floor, build year, private owner / agency / developer, primary or secondary market, listing age, a word in the description, extras such as balcony, garage, lift or garden, and building type, in six sort orders. Each row carries the listing id, title, link, total price, price per m², the monthly administrative fee where the advertiser gives one, area, rooms, floor, location down to the neighbourhood, advertiser type and agency, dates and photos, plus the site's own result count. `listing` returns one listing in full: the price as structured data and as the page prints it, the monthly fee and the rental deposit as separate fields, every characteristic (building type, material, ownership, heating, construction status, availability date), extras, the full description, all photos and floor plans, map coordinates, and the advertiser with contact name, the phone numbers the listing page shows, agency name, page and address. For a new-development project it adds the price-from per m², the area range and its first units with price and area. `locations` turns a place name into the site's location id.

Reference

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.

FieldWhat it holds
listing_idThe 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_typeprice 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_monthlyThe 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.
depositRental deposit, on the listing only, as its own field next to the monthly rent and the monthly fee.
price_display, price_mismatchprice_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.
currencyRead 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).
kindad 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_typeThe site's own label: private_person, agency, developer or business.
total, pages, page_clampedtotal 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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/otodom/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "site": "pl",
    "transaction": "sell",
    "estate": "flat",
    "location": "mazowieckie/warszawa/warszawa/warszawa"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "otodom",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1821.4,
    "record_count": 28,
    "bytes": 1614896,
    "cache_hit": false,
    "total": 20289,
    "decoy_rows_dropped": 1,
    "upstream_requests": 1,
    "charged_credits": 3,
    "version": "0.1.0",
    "request_id": "c0f5de6988364d84",
    "queue_ms": 1.5,
    "fetched_at": "2026-10-14T18:57:30.142Z"
  },
  "data": {
    "results": [
      {
        "listing_id": "ID4uooF",
        "ad_id": 66348969,
        "kind": "ad",
        "title": "2-pokojowe mieszkanie 38m2 + loggia",
        "url": "https://www.otodom.pl/pl/oferta/2-pokojowe-mieszkanie-38m2-loggia-ID4uooF",
        "estate": "flat",
        "transaction": "sell",
        "price": 878000,
        "currency": "PLN",
        "price_type": "sale_price",
        "price_on_request": false,
        "price_hidden": false,
        "price_per_m2": 23056.72,
        "maintenance_fee_monthly": null,
        "investment_price_from_per_m2": null,
        "area_m2": 38.08,
        "plot_area_m2": null,
        "rooms": 2,
        "floor": "fifth",
        "floor_number": 5,
        "people_per_room": null,
        "location": {
          "region": "mazowieckie",
          "city": "Warszawa",
          "district": "Wola",
          "neighbourhood": "Odolany",
          "street": "Sowińskiego 28",
          "location_id": "mazowieckie/warszawa/warszawa/warszawa/wola/odolany",
          "full_name": "Odolany, Wola, Warszawa, mazowieckie",
          "levels": [
            "[trimmed-depth]",
            "[trimmed-depth]",
            "[trimmed-depth]"
          ]
        },
        "advertiser_type": "business",
        "is_private_owner": false,
        "advertiser_name": "Matexi Polska",
        "agency": {
          "agency_id": 10557277,
          "name": "Matexi Polska",
          "type": "developer",
          "slug": "matexi-polska-ID10557277",
          "logo": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Im5mN3plNHdxbDY0ZDEtQVBMIn0.7b7fuHPm6wYU63P3DL1bgHwPXHMgJMX6h16TJx6k6ig/image"
        },
        "created_at": "2025-01-14T13:44:44Z",
        "first_created_at": "2025-01-14T13:44:44+00:00",
        "pushed_up_at": "2026-10-14T20:55:54+02:00",
        "is_promoted": false,
        "is_exclusive": false,
        "is_crosslisted": false,
        "has_remote_services": false,
        "source": "urn:partner:obidointegration",
        "tags": [
          "PARKING_SPOT"
        ],
        "short_description": null,
        "special_offer": null,
        "development": {
          "development_id": 66348867,
          "title": "Splot Wola",
          "url": "https://www.otodom.pl/pl/inwestycja/splot-wola-ID4uon1"
        },
        "investment": null,
        "image": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6InhnMHVwOG9sajUwbDItRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0._hPeD3FJBTo4p2_QdOqIB1PPqp_HxZM9GrV_-PqCJKc/image;s=1280x1024;q=80",
        "images": [
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6InhnMHVwOG9sajUwbDItRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0._hPeD3FJBTo4p2_QdOqIB1PPqp_HxZM9GrV_-PqCJKc/image;s=1280x1024;q=80",
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImxwMG01MWtmbnF0YjEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.N4OGvHcCL6aq86Q_TVD6gXn8CY6ojMieM7-exg2uVQg/image;s=1280x1024;q=80",
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImlhNWloeTk4OGwzYi1FQ09TWVNURU0iLCJ3IjpbeyJmbiI6ImVudmZxcWUxYXk0azEtQVBMIiwicyI6IjE2IiwiYSI6IjAiLCJwIjoiMTAsLTEwIn1dfQ.-5KvBl5EV4szgyyW45V8WGWW0miaMq7G5TdMuPO0DIE/image;s=1280x1024;q=80"
        ],
        "image_count": 14
      },
      {
        "listing_id": "ID4uoc3",
        "ad_id": 66348187,
        "kind": "ad",
        "title": "3-pokojowe mieszkanie 65m2 + balkon Bez Prowizji",
        "url": "https://www.otodom.pl/pl/oferta/3-pokojowe-mieszkanie-65m2-balkon-bez-prowizji-ID4uoc3",
        "estate": "flat",
        "transaction": "sell",
        "price": 1476000,
        "currency": "PLN",
        "price_type": "sale_price",
        "price_on_request": false,
        "price_hidden": false,
        "price_per_m2": 22500,
        "maintenance_fee_monthly": null,
        "investment_price_from_per_m2": null,
        "area_m2": 65.6,
        "plot_area_m2": null,
        "rooms": 3,
        "floor": "first",
        "floor_number": 1,
        "people_per_room": null,
        "location": {
          "region": "mazowieckie",
          "city": "Warszawa",
          "district": "Wola",
          "neighbourhood": "Czyste",
          "street": "Kolejowa",
          "location_id": "mazowieckie/warszawa/warszawa/warszawa/wola/czyste",
          "full_name": "Czyste, Wola, Warszawa, mazowieckie",
          "levels": [
            "[trimmed-depth]",
            "[trimmed-depth]",
            "[trimmed-depth]"
          ]
        },
        "advertiser_type": "business",
        "is_private_owner": false,
        "advertiser_name": "SKANSKA RESIDENTIAL DEVELOPMENT POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
        "agency": {
          "agency_id": 10556404,
          "name": "SKANSKA RESIDENTIAL DEVELOPMENT POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
          "type": "developer",
          "slug": "skanska-residential-development-poland-spolka-z-ograniczona-odpowiedzialnoscia-ID10556404",
          "logo": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImsxZXBoN3BtYmtybTItQVBMIn0.rZjKCc0hwfl9ZgJnjjdxGhD7TNfclXk6eGWe7O4BJGo/image"
        },
        "created_at": "2025-01-14T12:53:32Z",
        "first_created_at": "2025-01-14T12:53:32+00:00",
        "pushed_up_at": "2026-10-14T20:54:27+02:00",
        "is_promoted": false,
        "is_exclusive": false,
        "is_crosslisted": false,
        "has_remote_services": false,
        "source": "urn:partner:obidointegration",
        "tags": [
          "BALCONY",
          "PARKING_SPOT"
        ],
        "short_description": null,
        "special_offer": null,
        "development": {
          "development_id": 66339760,
          "title": "NU2 Warszawa Wola",
          "url": "https://www.otodom.pl/pl/inwestycja/nu2-warszawa-wola-ID4um08"
        },
        "investment": null,
        "image": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Inp4YzBhM251bmc2aTMtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.uEMH20nUlG8zJeU9IM14_9EZj9TpsuM-zSq6kD4jcyg/image;s=1280x1024;q=80",
        "images": [
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Inp4YzBhM251bmc2aTMtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.uEMH20nUlG8zJeU9IM14_9EZj9TpsuM-zSq6kD4jcyg/image;s=1280x1024;q=80",
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImFvY2FnczFnc2hkOTItRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.UjEGpYe6sWCarM0k-HJawggR4zw01-gpjs8MF04cvos/image;s=1280x1024;q=80",
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImZ1NGFmazJxNWlxMTEtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.WiDE-3byBSKN0voO0QrJWZMOslX2BAkoxItJSCl8nxQ/image;s=1280x1024;q=80"
        ],
        "image_count": 10
      },
      {
        "listing_id": "ID4umfW",
        "ad_id": 66340739,
        "kind": "ad",
        "title": "2-pokojowe mieszkanie 59m2 + balkon Bezpośrednio",
        "url": "https://www.otodom.pl/pl/oferta/2-pokojowe-mieszkanie-59m2-balkon-bezposrednio-ID4umfW",
        "estate": "flat",
        "transaction": "sell",
        "price": 947000,
        "currency": "PLN",
        "price_type": "sale_price",
        "price_on_request": false,
        "price_hidden": false,
        "price_per_m2": 15825.53,
        "maintenance_fee_monthly": null,
        "investment_price_from_per_m2": null,
        "area_m2": 59.84,
        "plot_area_m2": null,
        "rooms": 2,
        "floor": "fourth",
        "floor_number": 4,
        "people_per_room": null,
        "location": {
          "region": "mazowieckie",
          "city": "Warszawa",
          "district": "Praga-Południe",
          "neighbourhood": "Gocław",
          "street": "Precyzyjna",
          "location_id": "mazowieckie/warszawa/warszawa/warszawa/praga--poludnie/goclaw",
          "full_name": "Gocław, Praga-Południe, Warszawa, mazowieckie",
          "levels": [
            "[trimmed-depth]",
            "[trimmed-depth]",
            "[trimmed-depth]"
          ]
        },
        "advertiser_type": "business",
        "is_private_owner": false,
        "advertiser_name": "SKANSKA RESIDENTIAL DEVELOPMENT POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
        "agency": {
          "agency_id": 10556404,
          "name": "SKANSKA RESIDENTIAL DEVELOPMENT POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ",
          "type": "developer",
          "slug": "skanska-residential-development-poland-spolka-z-ograniczona-odpowiedzialnoscia-ID10556404",
          "logo": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImsxZXBoN3BtYmtybTItQVBMIn0.rZjKCc0hwfl9ZgJnjjdxGhD7TNfclXk6eGWe7O4BJGo/image"
        },
        "created_at": "2025-01-14T08:52:49Z",
        "first_created_at": "2025-01-14T08:52:49+00:00",
        "pushed_up_at": "2026-10-14T20:54:25+02:00",
        "is_promoted": false,
        "is_exclusive": false,
        "is_crosslisted": false,
        "has_remote_services": false,
        "source": "urn:partner:obidointegration",
        "tags": [
          "SEPARATE_KITCHEN",
          "BALCONY",
          "PARKING_SPOT"
        ],
        "short_description": null,
        "special_offer": null,
        "development": {
          "development_id": 66339759,
          "title": "Park Skandynawia V",
          "url": "https://www.otodom.pl/pl/inwestycja/park-skandynawia-v-ID4um07"
        },
        "investment": null,
        "image": "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6InE1dDBtNnk1anc0NTMtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.vWkAoyVNjKwB3gXzF3yyzWoj0icUT89zYPab9WsPLw0/image;s=1280x1024;q=80",
        "images": [
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6InE1dDBtNnk1anc0NTMtRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.vWkAoyVNjKwB3gXzF3yyzWoj0icUT89zYPab9WsPLw0/image;s=1280x1024;q=80",
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImJ6ZjdkbXlrZTE0dzItRUNPU1lTVEVNIiwidyI6W3siZm4iOiJlbnZmcXFlMWF5NGsxLUFQTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.BLY2WTitNtRXDtCGaSrusfvNkTu40ChZyQE-Q4HEKeI/image;s=1280x1024;q=80",
          "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Ijl5MjhpbmQxMjRoLUVDT1NZU1RFTSIsInciOlt7ImZuIjoiZW52ZnFxZTFheTRrMS1BUEwiLCJzIjoiMTYiLCJhIjoiMCIsInAiOiIxMCwtMTAifV19.qmWlueCg1kQNUGLGfBuMV2UDLFp3bMbtz9M1hWq9pMI/image;s=1280x1024;q=80"
        ],
        "image_count": 7
      }
    ],
    "total": 20289,
    "pages": 564,
    "page": 1,
    "per_page": 36,
    "last_page": 564,
    "has_more": true,
    "page_clamped": false,
    "decoy_rows_dropped": 1,
    "location": {
      "location_id": "mazowieckie/warszawa/warszawa/warszawa",
      "name": "Warszawa",
      "full_name": "Warszawa, mazowieckie",
      "level": "city",
      "children": [
        {
          "location_id": "mazowieckie/warszawa/warszawa/warszawa/bemowo",
          "name": "Bemowo",
          "level": "district"
        }
      ]
    },
    "query": {
      "site": "pl",
      "transaction": "sell",
      "estate": "flat",
      "location": "mazowieckie/warszawa/warszawa/warszawa",
      "sort": "relevance",
      "page": 1,
      "limit": 36
    }
  }
}
Actions

What the Otodom + Imovirtual + Storia API does

ActionDescriptionConcrete use caseKey params
searchSearch sale or rental listings on otodom.pl (site=pl), imovirtual.com (pt) or storia.ro (ro): property type, location (an id from `locations`), price, price per m², area, rooms, floor, build year, advertiser type (private / agency / developer), market (primary / secondary), listing age, keyword in the description, extras, building type, sort and page. Each row: listing id, title, URL, total price, price per m², monthly administrative fee, area, rooms, floor, location down to the neighbourhood, advertiser type and agency, dates, promoted flag, photos. Plus the source's own total and page count. Every filter is checked against the source's own echo: a value the site did not apply is refused, never silently ignored.Real-estate investors call search to search sale or rental listings on otodom.pl (site=pl), imovirtual.com (pt) or storia.ro (ro).site, transaction, estate, location, min_price, ...
listingFull listing by `listing_id` (the ID… token from a search row) or URL: price, the price as the site prints it, monthly administrative fee (czynsz), deposit, price per m², area, rooms, floor, building floors, build year, building type / material, ownership, heating, construction status, extras, all characteristics, full description, photos, floor plans, location with coordinates, dates, and the advertiser (type, contact name, phone numbers as published, agency name / page / logo, owner address). For a new-development project: price-from per m², area range, number of units and the first page of its units with price and area.Brokerage tools call listing to get full listing by `listing_id` (the ID… token from a search row) or URL.listing_id, url, site
locationsLocation lookup: type a place name (`Kraków`, `Mokotów`, `Lisboa`, `Cluj`) and get the site's own location ids with level (voivodeship / county / city / district / village…) and full name. Feed `location_id` to `search`. Diacritics are optional.Property dashboards call locations to get location lookup.query, query, site
Code samples

Call search from your stack

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.otodom.search with {"site":"pl","transaction":"sell","estate":"flat","location":"mazowieckie/warszawa/warszawa/warszawa"}.
Use cases

Who uses this API and why

  • 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.
  • Monitor new-development projects and their units as they come to market.
FAQ

Questions developers ask before integrating

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.

docs / otodom

Otodom + Imovirtual + Storia

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.

base /otodom/v13 endpoints
post/otodom/v1/listing2 credits

Full listing by `listing_id` (the ID… token from a search row) or URL: price, the price as the site prints it, monthly administrative fee (czynsz), deposit, price per m², area, rooms, floor, building floors, build year, building type / material, ownership, heating, construction status, extras, all characteristics, full description, photos, floor plans, location with coordinates, dates, and the advertiser (type, contact name, phone numbers as published, agency name / page / logo, owner address). For a new-development project: price-from per m², area range, number of units and the first page of its units with price and area.

ParameterAllowed / rangeDescription
listing_idoptional—The ID… token at the end of a listing URL (`…-ID4Diz3`), returned as `listing_id` in every search row. The numeric `ad_id` does not address a page on the site. Provide listing_id OR url.
urloptional—An otodom.pl, imovirtual.com or storia.ro offer / development URL (the site is taken from the URL).
site = ploptionalpl · pt · roWhich portal: `pl` = otodom.pl (Poland, prices in PLN), `pt` = imovirtual.com (Portugal, EUR), `ro` = storia.ro (Romania, mostly EUR). Same platform, same fields.
Try in playground →
post/otodom/v1/locations1 credit

Location lookup: type a place name (`Kraków`, `Mokotów`, `Lisboa`, `Cluj`) and get the site's own location ids with level (voivodeship / county / city / district / village…) and full name. Feed `location_id` to `search`. Diacritics are optional.

ParameterAllowed / rangeDescription
queryrequired—Place name or its beginning (2+ characters). The site matches loosely: a string that is no place still returns its closest spellings, so check `full_name`.
site = ploptionalpl · pt · roWhich portal: `pl` = otodom.pl (Poland, prices in PLN), `pt` = imovirtual.com (Portugal, EUR), `ro` = storia.ro (Romania, mostly EUR). Same platform, same fields.
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.

Comparing scraping APIs?ReefAPI vs Bright Data