Cenogram

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.

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ź - pobrane 2026-09-02. Kliknij „Uruchom", żeby odpytać na żywo.
{
  "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
}
Źródło
ewidencja gruntów i budynków (EGiB), niemal cała ewidencja kraju - choć nie w całości i nie na bieżąco
Tryby wyszukiwania
pełny numer działki, nazwa miejscowości z numerem, punkt na mapie
Co wraca
identyfikator działki, powierzchnia, powiat, punkt środkowy obrysu
Odpowiedź
JSON, wywołanie bez tokenów

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.

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ę

0 zł

400 tokenów na start, potem 50 tygodniowo

tokeny zostają na dane pobrane pod znalezionym numerem

  • -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.

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

99 zł netto/miesiąc

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

299 zł netto/miesiąc

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

1499 zł netto/miesiąc

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

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. 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.