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.
Klucz przychodzi mailem, bez karty. Autoryzacja to jeden nagłówek Authorization: Bearer. Poniższe wywołanie możesz uruchomić od razu, bez rejestracji.
{
"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."
}
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.
| Pole | Typ | Znaczenie |
|---|---|---|
| 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ę
400 tokenów na start, potem 50 tygodniowo
to 100 wywołań tego endpointu
- -Wszystkie endpointy
- -Serwer MCP
- -Bez karty
Standard
Dla rzeczoznawców
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
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
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
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
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.