Numer działki ewidencyjnej (ULDK) - wyszukiwarka działek i ich dane, przez API
Znajdź działkę po numerze ewidencyjnym, po nazwie miejscowości z numerem działki albo po punkcie na mapie. W odpowiedzi dostajesz identyfikator działki, jej powierzchnię, powiat i punkt środkowy obrysu, w JSON.
Klucz przychodzi mailem, bez karty. Autoryzacja to jeden nagłówek Authorization: Bearer. Poniższe wywołanie możesz uruchomić od razu, bez rejestracji.
{
"query": {
"mode": "q",
"q": "146518_8.0106.110/3"
},
"coverage": "covered",
"as_of": "2026-09-01T02:13:30.151Z",
"matches": [
{
"id": "3b37f56e-8b61-3250-b74a-fd2fc96a22a6",
"parcel_id": "146518_8.0106.110/3",
"parcel_key": "146518_8.0106.110-3",
"district": "Wola",
"county_code": "1465",
"parcel_number": "110/3",
"area_m2": 6701,
"has_geometry": true,
"centroid": {
"lat": 52.2342317605141,
"lng": 20.991978701400804
}
}
],
"truncated": false
}
Podaj pełny numer działki, nazwę miejscowości z numerem albo współrzędne punktu, a dostaniesz listę pasujących działek z identyfikatorem, powierzchnią, powiatem i punktem środkowym. Identyfikator z tej odpowiedzi jest kluczem do pozostałych warstw: wstawiasz go do adresu /api/v1/parcels/{numer} i dalej do warstw tematycznych. Odpowiedź mówi, którą działkę mamy u siebie, i nie mówi nic o właścicielu ani o tym, co na działce stoi. Mamy niemal całą ewidencję kraju, choć nie w całości i nie na bieżąco, więc brak dopasowania zwykle znaczy świeżą zmianę albo inną pisownię, a nie to, że działka nie istnieje. Pełny numer działki to osobna ścieżka: taką działkę potwierdzamy na żywo i dopisujemy, nawet jeśli wcześniej jej nie mieliśmy.
Pola odpowiedzi
Tabela wyjaśnia każde pole z przykładowej odpowiedzi wyżej.
| Pole | Typ | Znaczenie |
|---|---|---|
| query | object | powtórzenie tego, o co zapytałeś: mode (q, parcelId albo latlng) i wartość parametru w tym trybie. Wraca zawsze, także w odpowiedzi pustej, więc log z odpowiedzi wystarcza do odtworzenia zapytania |
| coverage | string | trzy stany. covered znaczy, że lista dopasowań jest niepusta. not_covered znaczy, że pod tym zapytaniem nic nie znaleźliśmy wśród działek, które trzymamy - przy nazwie z numerem i przy punkcie na mapie to słabsze zdanie niż „takiej działki nie ma”, bo szukamy tylko po naszej kopii ewidencji. not_computed znaczy, że pełnego numeru nie udało się teraz potwierdzić i warto ponowić za chwilę. Czwarty stan rodziny, covered_no_data, tutaj nie występuje - pusta lista to zawsze not_covered |
| as_of | datetime | null | świeżość naszej kopii ewidencji, liczona dla całego kraju, bo dopasowania mogą pochodzić z różnych powiatów. To nie to samo pole co as_of w odpowiedzi /api/v1/parcels/{numer}, gdzie liczy się je dla powiatu tej jednej działki. Poza stanem covered wraca null |
| matches | array | lista dopasowanych działek. Przy pełnym numerze i przy UUID-zie ma najwyżej jedną pozycję, przy punkcie na mapie do pięciu, przy nazwie z numerem do dziesięciu |
| matches[].id | string | nasz wewnętrzny identyfikator działki (UUID). Bezpieczny w adresie i stabilny, ale nie jest numerem ewidencyjnym i nie da się go odczytać w żadnym rejestrze |
| matches[].parcel_id / .parcel_key | string | null | numer ewidencyjny w dwóch zapisach: parcel_id z ukośnikiem, tak jak zapisuje go rejestr, i parcel_key z myślnikiem, do wstawienia w ścieżkę adresu. Oba wracają null, gdy tożsamość jest bramkowana - patrz „Echo kontra wyszukiwanie” niżej |
| matches[].district | string | null | nazwa miejscowości albo gminy zapisana przy działce w rejestrze. To po niej dopasowuje się tryb „nazwa plus numer”, i to dokładnie, bez tolerancji na inną pisownię |
| matches[].county_code | string | null | czterocyfrowy kod powiatu w systemie TERYT. Ten sam kod jest pierwszym członem numeru ewidencyjnego |
| matches[].parcel_number | string | null | sam numer działki w obrębie, bez członu powiatu i obrębu. Tę wartość podaje się w trybie „nazwa plus numer” |
| matches[].area_m2 | number | null | powierzchnia działki w metrach kwadratowych. Dla działek, przy których rejestr nie podaje powierzchni, liczymy ją z obrysu |
| matches[].has_geometry | boolean | czy mamy obrys tej działki. false znaczy, że warstwy dopasowywane przestrzennie nie będą miały czego przeciąć, choć warstwy dopasowywane numerem nadal odpowiedzą |
| matches[].centroid | object | null | punkt środkowy obrysu, lat i lng w układzie WGS 84. Wraca null, gdy obrysu nie mamy. To środek geometryczny, więc przy działce w kształcie litery L potrafi leżeć poza jej granicami |
| truncated | boolean | true, gdy wyszukiwanie po nazwie z numerem trafiło w limit dziesięciu dopasowań i lista została ucięta |
Jak czytać odpowiedź
Miejsca, w których tę odpowiedź łatwo przeczytać źle.
Ten sam numer zapisuje się inaczej w ścieżce i inaczej w zapytaniu
Numer ewidencyjny ma w środku ukośnik, a ukośnik w ścieżce adresu jest separatorem, nie znakiem. Dlatego /api/v1/parcels/146518_8.0106.110/3 kończy się błędem 400 z podpowiedzią „użyj formy z myślnikiem”, a poprawnie jest 146518_8.0106.110-3. W parametrze q= obie formy przechodzą, ale ukośnik trzeba zakodować jako %2F, bo część klientów HTTP potnie go razem ze ścieżką. Praktyczna reguła: parcel_key z odpowiedzi wstawiasz w adres, parcel_id pokazujesz człowiekowi.
Trzy tryby, dokładnie jeden w jednym zapytaniu
Wybierasz między q=, parcelId= i parą lat= z lng=. Podanie dwóch naraz kończy się błędem 400 „Provide exactly one lookup mode”, i tym samym błędem kończy się puste q=, bo puste znaczy tu „żadnego trybu”. Sam q= ma trzy zachowania: przyjmuje pełny numer, przyjmuje UUID i przyjmuje tekst „nazwa miejscowości plus numer działki”. O tym, które z nich zadziała, decyduje kształt tego, co wpiszesz, więc jedno pole obsługuje i wyszukiwanie po nazwie, i zwykłe sprawdzenie numeru.
Echo kontra wyszukiwanie - kiedy numer wraca, a kiedy nie
Gdy podasz pełny numer, dostajesz go z powrotem, bo już go miałeś. Gdy szukasz po nazwie z numerem albo po punkcie na mapie, parcel_id i parcel_key wracają puste dla wywołań anonimowych i dla darmowych kont w przeglądarce - takie zapytanie odsłaniałoby powiat i obręb, których pytający nie podał. Klucze API, OAuth oraz konta płatne i próbne widzą numer w każdym trybie. Reszty odpowiedzi to nie dotyczy: powierzchnia, nazwa miejscowości, kod powiatu i punkt środkowy wracają zawsze, więc do zlokalizowania działki na mapie sam numer nie jest potrzebny.
Data świeżości znaczy tu co innego niż przy pojedynczej działce
Wyszukiwanie może zwrócić dopasowania z kilku powiatów naraz, więc jednej daty dla nich nie ma i as_of podaje najświeższy wczyt w skali kraju. Odpowiedź o pojedynczej działce pod /api/v1/parcels/{numer} podaje datę dla powiatu tej jednej działki, a powiaty odświeżamy w różnym tempie. Dla tej samej działki oba pola potrafią się rozjechać o miesiące i nie jest to błąd: pierwsze mówi o świeżości całej kopii, drugie o świeżości tego jednego powiatu. Świeżość konkretnej działki czytaj z drugiego.
Ucięta lista mówi o limicie, a pełna nie mówi o komplecie
Wyszukiwanie po nazwie z numerem oddaje najwyżej dziesięć dopasowań i ustawia wtedy truncated. Bierze się to stąd, że w jednej gminie ten sam numer powtarza się w wielu obrębach. truncated jest więc sygnałem, żeby zawęzić zapytanie pełnym numerem albo punktem na mapie; ile działek naprawdę nosi ten numer, odpowiedź nie podaje. Uwaga na asymetrię: wyszukiwanie po punkcie też ma limit, pięciu dopasowań, ale truncated przy nim nie wraca - przy działkach nakładających się na siebie szósta odpadnie po cichu. Druga rzecz, ważniejsza od limitu: brak truncated nie znaczy, że masz komplet. Szukamy po ewidencji, którą trzymamy - niemal całej, choć nie w całości i nie na bieżąco - więc krótka lista może brać się też stąd, że części działek jeszcze u nas nie ma. Skalę podaje blok corpus_coverage w odpowiedziach kolekcji.
Darmowe nie znaczy nielimitowane
Wyszukiwanie nie zdejmuje tokenów i nie rusza salda - w nagłówku X-Credits-Cost wraca zero, a zwrotów nie ma, bo nie ma czego zwracać. Klucz z pustym budżetem nadal wyszukuje. Sprawdzany jest za to sam dostęp: klucz z wygasłego okresu próbnego dostaje 402, a wywołania bez klucza mają własny limit liczony na adres i po jego przekroczeniu wracają z 429. Zostaje też limit liczby zapytań na minutę, więc pętla po tysiącach numerów wymaga rozłożenia w czasie.
Cennik
Jedno wywołanie tego endpointu nie zużywa tokenów. Płacisz dopiero za dane pobrane pod znalezionym numerem: rdzeń działki kosztuje 1 token, warstwa tematyczna 4 tokeny. Samo szukanie nie rusza salda, więc listę niepewnych numerów możesz przepuścić przez nie w całości. Zostaje limit liczby zapytań na minutę, więc pętla po tysiącach numerów nadal wymaga rozłożenia w czasie.
Free
Na próbę
400 tokenów na start, potem 50 tygodniowo
tokeny zostają na dane pobrane pod znalezionym numerem
- -Wszystkie endpointy
- -Serwer MCP
- -Bez karty
Standard
Dla rzeczoznawców
60,27 zł brutto
2 000 tokenów / mies.
tokeny zostają na dane pobrane pod znalezionym numerem
- -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.
tokeny zostają na dane pobrane pod znalezionym numerem
- -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.
tokeny zostają na dane pobrane pod znalezionym numerem
- -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.
tokeny zostają na dane pobrane pod znalezionym numerem
- -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. ULDK to bezpłatna usługa publiczna do lokalizowania działek katastralnych i sprawdzisz w niej pojedynczą działkę. My oddajemy identyfikację działki jako REST/JSON z trzema trybami wyszukiwania w jednym zapytaniu, razem z powierzchnią i punktem środkowym, a pod tym samym numerem masz od razu pozostałe dane urzędowe o działce.
Nie tym zapytaniem. Przyjmuje ono pełny numer ewidencyjny, nazwę miejscowości z numerem działki albo współrzędne punktu. Adres zamień najpierw na współrzędne dowolnym geokoderem, a potem podaj je w lat= i lng= - wraca działka, w której ten punkt leży.
Wyszukiwanie odpowiada na pytanie „która to działka” i przyjmuje niepewne dane wejściowe, dlatego zwraca listę kandydatów. Pobranie danych jednej działki pod /api/v1/parcels/{numer} przyjmuje już jeden konkretny numer w formie z myślnikiem i zwraca jedną działkę z szerszym opisem: dochodzą nazwa powiatu i województwa, sposób użytkowania i odsyłacz do historii transakcji. Wyszukiwanie nie zużywa tokenów, rdzeń kosztuje 1 token. Typowa kolejność to najpierw wyszukiwanie, potem rdzeń albo od razu warstwa tematyczna.
Nic. Wyszukiwanie działki nie zdejmuje tokenów, więc nie ma tu też zwrotów - płacisz dopiero za dane pobrane pod znalezionym numerem. Dostęp jest nadal sprawdzany: klucz z wygasłego okresu próbnego dostanie 402, a wywołania bez klucza mają własny limit liczony na adres.
Najczęstszy powód to pisownia - nazwa dopasowuje się dokładnie do tej zapisanej przy działce w rejestrze, bez tolerancji na inny zapis i bez szukania po fragmencie. Drugi powód: mamy niemal całą ewidencję kraju, ale nie w całości i nie na bieżąco, więc świeżo zmienionej działki może u nas jeszcze nie być, a wyszukiwanie po nazwie przegląda tylko to, co mamy. Trzeci to arkusz mapy: w części powiatów numer ma w środku dodatkowy człon (AR_1), którego tryb „nazwa plus numer” nie przyjmuje. Na wszystkie trzy działa to samo obejście - podaj pełny numer działki w q= albo w parcelId=. Ta ścieżka potwierdza działkę na żywo i dopisuje ją, więc znajdzie także taką, której wcześniej u nas nie było.
W Claude to samo pytanie zadaje narzędzie resolve_parcel. Przyjmuje te same trzy tryby, zwraca tę samą listę dopasowań i tak samo nie zużywa tokenów. Numer, który stamtąd wróci, podajesz dalej narzędziom pracującym na konkretnej działce. Jak podłączyć serwer MCP.
Dane o działkach pochodzą z ewidencji gruntów i budynków (EGiB), którą prowadzą starostowie powiatowi, a koordynuje Główny Urząd Geodezji i Kartografii. To część państwowego zasobu geodezyjnego i kartograficznego: publikując opracowanie z tymi danymi, wskazujesz źródło na warunkach prawa geodezyjnego i kartograficznego. Odpowiedź niesie identyfikator działki, jej powierzchnię, nazwę miejscowości, kod powiatu i punkt środkowy obrysu. Danych o właścicielu ewidencja publicznie nie udostępnia i nie ma ich ani w naszej bazie, ani w żadnym planie taryfowym. Warunki korzystania z naszego API: regulamin.
Zacznij za darmo
400 tokenów na start, potem 50 tygodniowo. Klucz API w 30 sekund, bez karty.