Cenogram

Dane o budynkach na działce - powierzchnia zabudowy i liczba kondygnacji, przez API

Sprawdź, co stoi na wybranej działce: powierzchnię zabudowy każdego budynku, liczbę kondygnacji oraz to, czy budynek istnieje, jest dopiero w budowie czy już zniszczony. Odpowiedź w JSON, po numerze działki ewidencyjnej.

Zobacz dokumentację

Klucz przychodzi mailem, bez karty. Autoryzacja to jeden nagłówek Authorization: Bearer. Poniższe wywołanie możesz uruchomić od razu, bez rejestracji.

GET
Przykładowa odpowiedź: 8 rekordów - pobrane 2026-09-02. Kliknij „Uruchom", żeby odpytać na żywo.
{
  "parcel": {
    "id": "3b37f56e-8b61-3250-b74a-fd2fc96a22a6",
    "parcel_id": "146518_8.0106.110/3",
    "parcel_key": "146518_8.0106.110-3"
  },
  "coverage": "covered",
  "as_of": "2026-06-13T22:22:27.214Z",
  "data": [
    {
      "footprint_area_m2": 1280.2,
      "overlap_area_m2": 1280,
      "pct_on_parcel": 100,
      "storeys": 15,
      "est_total_area_m2": 19203,
      "category": "residential_multi_family",
      "category_code": "1122",
      "status": "existing",
      "age_estimate": {
        "status": "ambiguous_buildings",
        "year_from": null,
        "year_to": null,
        "year_point": null,
        "basis": null,
        "basis_year": null,
        "match_rule": null,
        "confidence": null,
        "offset_model": null,
        "last_works_year": 2016,
        "note": "A new-construction permit is registered for this parcel but several buildings stand on it and the permit cannot be tied to one of them, so no year is given."
      }
    },
    {
      "footprint_area_m2": 1550.6,
      "overlap_area_m2": 870.6,
      "pct_on_parcel": 56,
      "storeys": 15,
      "est_total_area_m2": 23259,
      "category": "residential_multi_family",
      "category_code": "1122",
      "status": "existing",
      "age_estimate": {
        "status": "estimated",
        "year_from": 2016,
        "year_to": 2019,
        "year_point": 2017,
        "basis": "permit_decision",
        "basis_year": 2016,
        "match_rule": "category_and_volume",
        "confidence": "medium",
        "offset_model": "residential_multi_family",
        "last_works_year": 2016,
        "note": "Estimated from a resolved building permit registered for this parcel. `year_from` is the earliest year works could legally have started and is a hard lower bound, not an estimate; `year_to` and `year_point` add a completion offset calibrated per building class from first-sale data, so they are estimates. Rounded to whole years on purpose — the error here is measured in years, not days."
      }
    },
    {
      "footprint_area_m2": 631.3,
      "overlap_area_m2": 631.3,
      "pct_on_parcel": 100,
      "storeys": 2,
      "est_total_area_m2": 1262.6,
      "category": "residential_multi_family",
      "category_code": "1122",
      "status": "existing",
      "age_estimate": {
        "status": "ambiguous_buildings",
        "year_from": null,
        "year_to": null,
        "year_point": null,
        "basis": null,
        "basis_year": null,
        "match_rule": null,
        "confidence": null,
        "offset_model": null,
        "last_works_year": 2016,
        "note": "A new-construction permit is registered for this parcel but several buildings stand on it and the permit cannot be tied to one of them, so no year is given."
      }
    },
    {
      "footprint_area_m2": 583.6,
      "overlap_area_m2": 582.5,
      "pct_on_parcel": 100,
      "storeys": 15,
      "est_total_area_m2": 8754,
      "category": "residential_multi_family",
      "category_code": "1122",
      "status": "existing",
      "age_estimate": {
        "status": "ambiguous_buildings",
        "year_from": null,
        "year_to": null,
        "year_point": null,
        "basis": null,
        "basis_year": null,
        "match_rule": null,
        "confidence": null,
        "offset_model": null,
        "last_works_year": 2016,
        "note": "A new-construction permit is registered for this parcel but several buildings stand on it and the permit cannot be tied to one of them, so no year is given."
      }
    },
    {
      "footprint_area_m2": 512.6,
      "overlap_area_m2": 512.6,
      "pct_on_parcel": 100,
      "storeys": 9,
      "est_total_area_m2": 4613.4,
      "category": "residential_multi_family",
      "category_code": "1122",
      "status": "existing",
      "age_estimate": {
        "status": "ambiguous_buildings",
        "year_from": null,
        "year_to": null,
        "year_point": null,
        "basis": null,
        "basis_year": null,
        "match_rule": null,
        "confidence": null,
        "offset_model": null,
        "last_works_year": 2016,
        "note": "A new-construction permit is registered for this parcel but several buildings stand on it and the permit cannot be tied to one of them, so no year is given."
      }
    },
    {
      "footprint_area_m2": 304.9,
      "overlap_area_m2": 304.9,
      "pct_on_parcel": 100,
      "storeys": 15,
      "est_total_area_m2": 4573.5,
      "category": "residential_multi_family",
      "category_code": "1122",
      "status": "existing",
      "age_estimate": {
        "status": "ambiguous_buildings",
        "year_from": null,
        "year_to": null,
        "year_point": null,
        "basis": null,
        "basis_year": null,
        "match_rule": null,
        "confidence": null,
        "offset_model": null,
        "last_works_year": 2016,
        "note": "A new-construction permit is registered for this parcel but several buildings stand on it and the permit cannot be tied to one of them, so no year is given."
      }
    },
    {
      "footprint_area_m2": 210.9,
      "overlap_area_m2": 210.9,
      "pct_on_parcel": 100,
      "storeys": 1,
      "est_total_area_m2": 210.9,
      "category": "garage",
      "category_code": "1242",
      "status": "existing",
      "age_estimate": {
        "status": "older_than_register",
        "year_from": null,
        "year_to": null,
        "year_point": null,
        "basis": null,
        "basis_year": null,
        "match_rule": null,
        "confidence": null,
        "offset_model": null,
        "last_works_year": 2016,
        "note": "We could not date this building: no construction record for this parcel falls inside our coverage, which starts in 2016. That means either the works predate our coverage, or the parcel has been split or merged since they were registered — renumbering breaks a match made on the parcel's current identifier. This is a statement about what we can establish, not a claim that the building is old."
      }
    },
    {
      "footprint_area_m2": 176.3,
      "overlap_area_m2": 176.1,
      "pct_on_parcel": 100,
      "storeys": 9,
      "est_total_area_m2": 1586.7,
      "category": "residential_multi_family",
      "category_code": "1122",
      "status": "existing",
      "age_estimate": {
        "status": "ambiguous_buildings",
        "year_from": null,
        "year_to": null,
        "year_point": null,
        "basis": null,
        "basis_year": null,
        "match_rule": null,
        "confidence": null,
        "offset_model": null,
        "last_works_year": 2016,
        "note": "A new-construction permit is registered for this parcel but several buildings stand on it and the permit cannot be tied to one of them, so no year is given."
      }
    }
  ],
  "truncated": false,
  "note": "Buildings are matched to the parcel by geometry, so parcel splits and merges do not break the match. A building standing across a boundary is reported with the share of its footprint that lies on this parcel, not clipped away. `status` distinguishes buildings that are under construction, out of use or destroyed — a returned building is not necessarily a usable one, and an empty result is never a statement that the parcel is vacant. `as_of` is the freshness of our copy, not a construction date."
}
Źródło
BDOT10k, zbiór Głównego Urzędu Geodezji i Kartografii
Zakres
obrysy budynków ze wszystkich powiatów w kraju
Klucz zapytania
bieżący numer działki ewidencyjnej
Odpowiedź
JSON, 4 tokeny za wywołanie

Zapytaj bieżącym numerem działki ewidencyjnej, a dostaniesz listę budynków stojących na tej działce: powierzchnię zabudowy, udział obrysu przypadający na działkę, liczbę kondygnacji, szacowaną powierzchnię całkowitą, kategorię funkcji, status istnienia i oszacowanie wieku. To nie jest wypis z ewidencji budynków ani pomiar powierzchni użytkowej. Pusta lista opisuje wynik przecięcia obrysów, a nie stan prawny działki, więc zanim uznasz teren za niezabudowany, przeczytaj coverage.

Pola odpowiedzi

Tabela wyjaśnia każde pole z przykładowej odpowiedzi wyżej.

parcel object tożsamość działki, której dotyczy odpowiedź: id, parcel_id i parcel_key. Przy zapytaniu numerem ewidencyjnym wraca zawsze; przy zapytaniu UUID-em tylko dla kluczy API, OAuth oraz kont płatnych i próbnych
coverage string cztery stany odpowiedzi. covered znaczy, że na działce stoi przynajmniej jeden budynek. Pozostałe trzy - covered_no_data, not_covered i not_computed - to trzy różne powody pustej listy
as_of datetime | null z kiedy pochodzi nasza kopia obrysów dopasowanych do tej działki. To nie jest data budowy ani data aktualizacji zapisu w źródle. Poza stanem covered wraca null, bo nie ma czego datować
data array budynki stojące na działce, posortowane malejąco po powierzchni, jaka przypada na tę działkę
footprint_area_m2 number | null powierzchnia zabudowy całego budynku w m², czyli pole jego obrysu na gruncie razem ze ścianami zewnętrznymi. Zaokrąglona do jednego miejsca po przecinku
overlap_area_m2 number | null ta część obrysu, która leży na tej działce, w m². Dla budynku mieszczącego się w całości na działce równa footprint_area_m2
pct_on_parcel number | null jaki procent obrysu budynku przypada na tę działkę, liczbą całkowitą od 0 do 100. Puste, gdy nie znamy powierzchni obrysu
storeys number | null liczba kondygnacji nadziemnych zapisana w źródle. Puste, gdy źródło jej nie podaje - i wtedy pusta zostaje też est_total_area_m2
est_total_area_m2 number | null szacowana powierzchnia całkowita: powierzchnia zabudowy razy liczba kondygnacji. To iloczyn dwóch pól wyżej, nie pomiar powierzchni użytkowej
category string | null kategoria funkcji budynku o neutralnej nazwie, np. residential_single_family, residential_multi_family, office, retail_and_services, garage, industrial, storage_and_silo, farm_outbuilding. Kod spoza naszej mapy wraca jako null, nigdy jako surowa wartość ze źródła
category_code string | null kod tej samej funkcji w Polskiej Klasyfikacji Obiektów Budowlanych (PKOB), np. 1110 albo 1122. Klasyfikacja jest publiczna, więc kod oddajemy wprost
status string | null stan istnienia obiektu: existing, under_construction, not_in_use, destroyed albo temporary. Kod spoza tej listy wraca jako null
age_estimate object oszacowanie wieku budynku. Zawsze obecne i zawsze z wypełnionym status, także wtedy, gdy roku nie da się wyprowadzić. Nie wpływa ani na coverage, ani na cenę wywołania
age_estimate.status string estimated (rok wyprowadzony), older_than_register (nie umiemy datować budynku w granicach naszego pokrycia), ambiguous_permits / ambiguous_buildings / ambiguous_both (kilku kandydatów pasuje i odmawiamy wyboru), no_parcel_key i not_applicable (stany trwałe dla tego rekordu), not_computed (stan przejściowy, wart ponowienia)
age_estimate.year_from number | null najwcześniejszy rok, w którym roboty mogły się legalnie zacząć. To twarda dolna granica, nie oszacowanie
age_estimate.year_to number | null górna krawędź przedziału: rok bazowy powiększony o czas budowy przyjęty dla tej klasy budynków. Wartość szacunkowa
age_estimate.year_point number | null pojedynczy rok wewnątrz przedziału. Puste przy confidence: low oraz dla klas, dla których nie mamy stabilnego oszacowania czasu budowy - przedział sam w sobie jest wtedy pełną odpowiedzią
age_estimate.basis string | null co wyznaczyło rok bazowy: permit_decision (data decyzji o pozwoleniu) albo notification_intake (data wpływu zgłoszenia). Druga podstawa jest luźniejsza i obniża pewność
age_estimate.basis_year number | null sam rok bazowy, ten sam, który jest w year_from. Wygodny, gdy trzymasz u siebie tylko jedną liczbę
age_estimate.match_rule string | null co powiązało zapis o budowie z tym budynkiem: pinned_single (jeden kandydat, przypisany wprost), category_and_volume (kilku kandydatów zawężonych przez zgodność kategorii i skali obiektu), single_building_parcel (na działce stoi jeden budynek, więc zapis może dotyczyć tylko jego)
age_estimate.confidence string | null high, medium albo low. Mówi, ile niezależnych przesłanek się zgodziło, a nie jak wąski jest przedział
age_estimate.offset_model string | null nazwa populacji, z której wzięliśmy czas budowy doliczany do roku bazowego, np. residential_single_family albo pooled dla klas bez własnego oszacowania
age_estimate.last_works_year number | null najpóźniejszy rok robót przy istniejącym obiekcie na tej działce: rozbudowy, nadbudowy albo przebudowy. Bywa wypełniony także wtedy, gdy roku budowy nie podajemy, bo dotyczy innego pytania
age_estimate.note string zdanie wyjaśniające ten konkretny status, po angielsku, bo jest częścią kontraktu publicznego API. Przy rozbiórce nowszej od naszej kopii obrysu dochodzi do niego zastrzeżenie, że budynku może już nie być
truncated boolean true, gdy na działce stoi ponad 500 budynków i lista została przycięta. Przycinamy od najmniejszych udziałów
note string zastrzeżenie o zakresie odpowiedzi, dołączane do każdej z nich. Po angielsku, bo mają je wszyscy klienci publicznego API

Jak czytać odpowiedź

Miejsca, w których tę odpowiedź łatwo przeczytać źle.

Powierzchnia zabudowy to obrys na gruncie, nie powierzchnia użytkowa

footprint_area_m2 mierzy pole rzutu budynku na grunt, razem ze ścianami zewnętrznymi. Powierzchnia użytkowa lokali jest od niej mniejsza i zależy od układu wnętrza, którego ta warstwa nie zna. est_total_area_m2 mnoży obrys przez liczbę kondygnacji, więc zakłada, że każda kondygnacja ma powierzchnię parteru. Do wyceny nadaje się jako rząd wielkości i tak trzeba ją czytać. Gdy storeys jest puste, puste zostaje też est_total_area_m2 - liczby kondygnacji nie zgadujemy.

Budynek na granicy wraca z udziałem, a nie przycięty

Dopasowanie idzie po geometrii, więc budynek stojący w poprzek granicy pojawia się przy obu działkach. footprint_area_m2 opisuje wtedy cały budynek, a overlap_area_m2 i pct_on_parcel mówią, ile z niego przypada na tę działkę. Sumując zabudowę jednej działki, licz overlap_area_m2, bo suma powierzchni obrysów potrafi przekroczyć powierzchnię samej działki. Obrys dotykający działki fragmentem mniejszym od metra kwadratowego pomijamy - to zwykle budynek sąsiada muskający granicę.

Pusta lista ma trzy znaczenia i żadne nie brzmi „działka niezabudowana”

Zacznij od coverage. covered_no_data znaczy, że sprawdziliśmy obrys tej działki i nie stoi na niej żaden budynek - to jedyny wynik mówiący o samej działce. not_covered mówi o naszych zasobach: nie mamy działki, nie mamy jej obrysu albo brakuje nam budynków z jej powiatu. not_computed znaczy, że obliczenie nie zdążyło się skończyć i warto ponowić za chwilę. Za to podział działki tej warstwy nie psuje: dopasowanie jest geometryczne, więc po podziale albo scaleniu nowy numer nadal trafia w te same budynki.

Zwrócony budynek nie musi być budynkiem używalnym

status rozróżnia obiekt istniejący, w budowie, nieużytkowany, zniszczony i tymczasowy. Wpisów o statusie innym niż existing nie usuwamy z listy, bo budowa w toku i ruina to dwie różne informacje o działce. Kto liczy same wiersze, policzy przy okazji rzeczy, których na gruncie jeszcze albo już nie ma. as_of mówi, z kiedy pochodzi nasza kopia obrysów, więc rozbiórka późniejsza od tej daty jeszcze się w odpowiedzi nie pojawi - gdy wiemy o niej z innego zapisu, dopisujemy ostrzeżenie do age_estimate.note.

Wiek budynku częściej jest odmową niż liczbą

age_estimate jest w odpowiedzi zawsze i zawsze ma wypełniony status. Najczęstsza wartość to older_than_register: nasze pokrycie zapisów o budowie zaczyna się w 2016 roku, a starszego budynku nie umiemy z nich datować i mówimy to wprost, zamiast oddawać puste pole, które czyta się jak „nowy”. Gdy rok da się wyprowadzić, year_from jest twardą dolną granicą, bo wcześniej roboty nie mogły się legalnie zacząć, a year_to i year_point dokładają czas budowy i są szacunkiem. Statusy ambiguous_permits, ambiguous_buildings i ambiguous_both znaczą, że kandydatów jest kilku i żadnego nie da się przypisać do jednego budynku. Odmawiamy wtedy świadomie: w operacie błędny rok kosztuje więcej niż jego brak.

Cennik

Jedno wywołanie tego endpointu kosztuje 4 tokeny. Tokeny wracają, gdy działki nie mamy w zbiorze, gdy nie znamy jej obrysu, gdy brakuje nam budynków z powiatu tej działki, gdy obliczenia nie da się teraz dokończyć oraz przy odpowiedziach 400 i 404. Potwierdzony brak budynków na znanej działce jest płatny.

Free

Na próbę

0 zł

400 tokenów na start, potem 50 tygodniowo

to 100 wywołań tego endpointu

  • -Wszystkie endpointy
  • -Serwer MCP
  • -Bez karty
Najpopularniejszy

Standard

Dla rzeczoznawców

49 zł netto/miesiąc

60,27 zł brutto

2 000 tokenów / mies.

to 500 wywołań tego endpointu

  • -Wszystko z Free
  • -2 000 tokenów API + MCP
  • -Pełny dostęp do wyszukiwarki

Professional

Dla programistów i mniejszych zespołów

99 zł netto/miesiąc

121,77 zł brutto

5 000 tokenów / mies.

to 1250 wywołań tego endpointu

  • -Wszystko ze Standard
  • -5 000 tokenów API + MCP
  • -Pełny dostęp do wyszukiwarki

Advanced

Dla firm wycenowych i deweloperów

299 zł netto/miesiąc

367,77 zł brutto

25 000 tokenów / mies.

to 6250 wywołań tego endpointu

  • -Wszystko z Professional
  • -Redystrybucja: dane w Twoim produkcie lub usłudze (z atrybucją Cenogram)
  • -Wsparcie e-mail: odpowiedź w 24 h

Business

Dla proptech i większych zespołów

1499 zł netto/miesiąc

1843,77 zł brutto

200 000 tokenów / mies.

to 50 000 wywołań tego endpointu

  • -Wszystko z Advanced
  • -White-label: atrybucja nie jest wymagana
  • -Wsparcie e-mail: odpowiedź w 8 h

Przejście na wyższy plan zastępuje obecną subskrypcję, a rozliczenie rusza od nowa

Ceny netto, +23% VAT · Faktura VAT na żądanie · Bez umów · Free bez karty
Visa Mastercard BLIK Apple Pay Google Pay

Częste pytania

Nie, to API Cenogramu. BDOT10k prowadzi Główny Urząd Geodezji i Kartografii i udostępnia go bezpłatnie. My oddajemy budynki pod bieżącym numerem działki jako REST/JSON, razem z udziałem obrysu przypadającym na tę działkę i z oszacowaniem wieku, obok pozostałych danych urzędowych, więc nie musisz sam wczytywać ani odświeżać tego zbioru.

Nie. footprint_area_m2 to pole obrysu budynku na gruncie, razem ze ścianami zewnętrznymi. Powierzchnia użytkowa lokali jest mniejsza i zależy od układu wnętrza, którego ta warstwa nie zna. est_total_area_m2 mnoży obrys przez liczbę kondygnacji i też nie jest powierzchnią użytkową - to szacunek rzędu wielkości.

Dostajesz oszacowanie, nie datę z rejestru. Pole age_estimate jest w każdej odpowiedzi, ale dla większości budynków w kraju wraca jako older_than_register, bo są starsze niż nasze zapisy o budowie. Gdy rok da się wyprowadzić, dostajesz przedział razem z oceną pewności, a przy niskiej pewności bez wartości punktowej. Roku budowy z ewidencji budynków w tej odpowiedzi nie ma.

Ta odpowiada na pytanie, co stoi na samej działce, i opisuje każdy budynek osobno. Obiekty uciążliwe w sąsiedztwie to inna warstwa, inny endpoint i inna strona - odsyłacz masz w sekcji z powiązanymi warstwami. Rozdzieliliśmy je, bo pytanie o własną zabudowę i pytanie o sąsiedztwo wracają w innych momentach transakcji.

4 tokeny. Tokeny wracają, gdy działki nie ma w naszym zbiorze albo nie znamy jej obrysu, gdy brakuje nam budynków z powiatu tej działki (not_covered), gdy obliczenia nie dało się dokończyć (not_computed), oraz przy odpowiedziach 400 i 404. Potwierdzony brak budynków na znanej działce (covered_no_data) jest płatny, bo przecięcie obrysu policzyliśmy tak samo jak przy trafieniu.

W Claude na numer działki odpowiada narzędzie get_parcel_report. Zwraca jeden raport o działce, w którym sekcja budynków idzie obok pozostałych danych urzędowych, i kosztuje 45 tokenów. Rozbicie na poszczególne budynki dla konkretnej transakcji ma narzędzie get_transaction_layer z parametrem layer=buildings. Jak podłączyć serwer MCP.

Budynki opisujemy na podstawie bazy danych obiektów topograficznych BDOT10k, którą prowadzi Główny Urząd Geodezji i Kartografii w ramach państwowego zasobu geodezyjnego i kartograficznego. Zasób jest udostępniany bezpłatnie, na warunkach prawa geodezyjnego i kartograficznego, a źródło wskazujemy w tej nocie. Dane przetworzyliśmy: powiązaliśmy obrysy budynków z granicami działek ewidencyjnych, policzyliśmy udział obrysu przypadający na działkę i ograniczyliśmy opis budynku do powierzchni, liczby kondygnacji, funkcji i stanu istnienia. Oszacowanie wieku jest naszym wynikiem, a nie wpisem ze źródła. Ta odpowiedź nie zastępuje wypisu z ewidencji gruntów i budynków ani inwentaryzacji na gruncie. Warunki korzystania z naszego API: regulamin.

Zacznij za darmo

400 tokenów na start, potem 50 tygodniowo. Klucz API w 30 sekund, bez karty.