API.adresy.app

Wyszukiwarka adresów PRG

Nie pamiętasz dokładnego adresu? Wpisz miejscowość — podpowiemy.

🔍

Wyszukaj adres w bazie PRG

Wpisz adres powyżej lub spróbuj jednego z przykładów:

Klucz API wymagany. Bez klucza przetwarzanie pliku nie jest dostępne. Zarejestruj się bezpłatnie lub zaloguj, by uzyskać klucz.

Kliknij lub przeciągnij plik

CSV, XLSX, TXT, JSON

Potrzebujesz więcej? Wyższe plany odblokują:
Starter — 39 zł/mies
✓ Pliki CSV/XLSX do 10 000 wierszy
✓ Historia jobów i wyników
✓ Przetwarzanie w tle
✓ Pobieranie CSV z wynikami
✓ 200 req/min
Business — 299 zł/mies
✓ Pliki do 100 000 wierszy
✓ Aktualizacje różnicowe (diff)
✓ Webhook callback
✓ 1 200 req/min · SLA 99.9%
✓ Priority support
Masz konto? Wgraj plik bezpośrednio w panelu →  ·  Załóż konto  ·  Zmień plan

Miejscowości

Wyszukaj miejscowość w rejestrze TERYT SIMC

Ulice w miejscowości

Wyszukaj ulicę w wybranej miejscowości

Wyszukaj TERYT

Znajdź kody TERYT (SIMC, ULIC) dla adresu

Powiaty w województwie

Lista powiatów i liczba gmin w danym województwie

Gminy w powiecie

Lista gmin i ich typów w wybranym powiecie

Dzielnice i osiedla

Lista dzielnic i jednostek pomocniczych w mieście

Mapa

Wyszukaj adres, koordynaty lub kod TERYT — lub kliknij na mapę

Kliknij na mapę lub wyszukaj... m

Działki katastralne

Dane: ULDK GUGiK (uldk.gugik.gov.pl) — bezpłatne

Wpisz adres, ulicę z numerem działki, identyfikator działki albo współrzędne — rodzaj rozpoznamy sami

Kliknij na mapie → wyświetli numer działki, adres i koordynaty. Użyj wyszukiwarki po lewej aby wycentrować mapę.

Twój numer działki nic nie znajduje? Mógł się zmienić

Gminy likwidują oznaczenie arkusza mapy w numerach działek i nadają im nową numerację w obrębie — wymaga tego § 44 rozporządzenia o ewidencji gruntów i budynków, a organy mają na to czas do końca 2029 roku. Numer z aktu notarialnego, decyzji czy starego wypisu przestaje wtedy odpowiadać rejestrowi, choć sama nieruchomość się nie zmienia. We Wrocławiu zmiana objęła wszystkie działki we wrześniu 2026.

Mamy kalkulator — przelicz stary numer na nowy →  działa też w drugą stronę

API kodów pocztowych, TERYT i PRG

Darmowe REST API do danych adresowych Polski. Kody pocztowe, TERYT SIMC/ULIC, punkty adresowe PRG (GUGiK), geokodowanie WGS84, dopasowywanie i walidacja adresów. JSON, bez rejestracji dla testów, klucz API dla produkcji.

Gotowy zacząć? Załóż darmowe konto i wygeneruj klucz API w 30 sekund.
Załóż konto Zaloguj
📚 Nie wiesz od czego zacząć? Przeczytaj nasz Przewodnik po API dla początkujących — tłumaczy krok po kroku, zawiera przykłady Python, Make.com i n8n.

Quickstart — pierwszy request w 30 sekund

Endpointy: https://api.adresy.app/api/v1. Odpowiedzi JSON (UTF-8). GET dla odczytu, POST dla batch.

curl -s "https://api.adresy.app/api/v1/match?q=Rynek+1,+Wrocław&api_key=TWOJ_KLUCZ"

Odpowiedź:

{
  "results": [
    {
      "input": "Rynek 1, Wrocław",
      "status": "found",
      "match": {
        "miejscowosc": "Wrocław",
        "ulica_norm": "Rynek",
        "nr_budynku": "1",
        "kod_pocztowy": "50-106",
        "teryt_simc": "0986283",
        "teryt_ulic": "19357",
        "gmina": "Wrocław",
        "powiat": "Wrocław",
        "wojewodztwo": "DOLNOŚLĄSKIE",
        "lat": 51.10893,
        "lon": 17.03262,
        "score": 0.98,
        "match_layer": "EXACT"
      }
    }
  ]
}

GET /match?q= to najprostszy sposób — podaj dowolny adres jako tekst, otrzymasz dopasowanie z rejestru PRG z kodem pocztowym, TERYT i współrzędnymi.

Uwierzytelnianie i limity

Bez klucza 20 zapytań/min (per IP). Wystarczy do testów.
Free (darmowy) 30 req/min, 3 000 req/miesiąc. Nagłówek Authorization: Bearer <klucz>.
Starter (39 zł/mies) 200 req/min, 100 000 req/miesiąc. Batch CSV/XLSX, faktura VAT.
Business (299 zł/mies) 1 200 req/min, 10 000 000 req/miesiąc. SLA 99,9%, priority support.
Enterprise Dedykowana infrastruktura, webhooki, on-premise. Kontakt.
curl -s "https://api.adresy.app/api/v1/lookup/kod-pocztowy?kod=00-001" \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx"

Alternatywnie: &api_key=TWOJ_KLUCZ jako query param — wygodne do testów w przeglądarce:

https://api.adresy.app/api/v1/match?q=Rynek+1,+Wrocław&api_key=sk_live_xxx

1. Wyszukiwanie po kodzie pocztowym

GET /api/v1/lookup/kod-pocztowy

Zwraca ulice i numery przypisane do kodu pocztowego. Dane z PRG (GUGiK).

ParametrTypOpis
kodstringKod pocztowy NN-NNN (wymagany)
limitintMax grup miejscowość+ulica w odpowiedzi (domyślnie 200, do 500)

total i ulic to sumy dla całego kodu (nie tylko zwróconej strony); zwrocono mówi, ile grup zmieściło się w limicie, a obciete:true sygnalizuje przyciętą listę. Kod nieobecny w PRG (np. skrytki pocztowe 00-950) zwraca found:false.

curl / Python / JavaScript
# curl
curl -s "https://api.adresy.app/api/v1/lookup/kod-pocztowy?kod=50-079"

# Python
import httpx
r = httpx.get("https://api.adresy.app/api/v1/lookup/kod-pocztowy",
    params={"kod": "50-079"}, headers={"Authorization": "Bearer sk_live_xxx"})
data = r.json()

// JavaScript
const res = await fetch("https://api.adresy.app/api/v1/lookup/kod-pocztowy?kod=50-079",
  { headers: { "Authorization": "Bearer sk_live_xxx" } });
const data = await res.json();

2. Kod pocztowy dla adresu

GET /api/v1/lookup/kod-dla-adresu

Podaj miejscowość, ulicę i numer — otrzymasz kod pocztowy. Idealne do walidacji formularzy.

curl -s "https://api.adresy.app/api/v1/lookup/kod-dla-adresu" \
  --data-urlencode "miejscowosc=Wrocław" \
  --data-urlencode "ulica=Rynek" \
  --data-urlencode "nr=1" -G
Odpowiedź
{
  "found": true,
  "kod_pocztowy": "50-106",
  "miejscowosc": "Wrocław",
  "ulica": "Rynek",
  "nr": "1",
  "teryt_simc": "0986283",
  "teryt_ulic": "19357"
}

3. TERYT — SIMC i ULIC

GET /api/v1/lookup/teryt

Kody TERYT (SIMC/ULIC) z przynależnością administracyjną. Wyszukiwanie po nazwie lub kodzie SIMC.

curl -s "https://api.adresy.app/api/v1/lookup/teryt" \
  --data-urlencode "miejscowosc=Kraków" \
  --data-urlencode "ulica=Floriańska" -G
Odpowiedź
{
  "found": true,
  "results": [{
    "simc": "0950463",
    "nazwa": "Kraków",
    "typ": "miasto",
    "gmina": "Kraków",
    "powiat": "Kraków",
    "wojewodztwo": "małopolskie",
    "ulice": [{"ulic": "05123", "cecha": "ul.", "nazwa_1": "Floriańska"}]
  }]
}

4. Dekoduj TERYT — pełna hierarchia adresowa

GET /api/v1/teryt/decode

Zamienia kody TERYT na pełną hierarchię adresową: województwo → powiat → gmina → miejscowość → dzielnica → ulica → numer. Obsługuje trzy formaty wejścia:

  • SIMC (7 cyfr) — kod miejscowości: 0986283 → Wrocław
  • ULIC (5 cyfr) — kod ulicy: 19357 → Rynek (Wrocław)
  • SIMC#ULIC#NR — pełny adres punktowy: 0986283#19357#1
ParametrOpis
simcKod SIMC lub format SIMC#ULIC#NR
ulicKod ULIC (ulicy)
kodDowolny kod TERYT (auto-detect)
# Miejscowość (SIMC)
curl -s "https://api.adresy.app/api/v1/teryt/decode?simc=0986283"

# Ulica (ULIC)
curl -s "https://api.adresy.app/api/v1/teryt/decode?ulic=19357"

# Pełny adres (SIMC#ULIC#NR)
curl -s "https://api.adresy.app/api/v1/teryt/decode?simc=0986283%2319357%231"
Odpowiedź — pełny adres SIMC#ULIC#NR
{
  "found": true,
  "typ": "adres",
  "wojewodztwo": "DOLNOŚLĄSKIE",
  "powiat": "Wrocław",
  "gmina": "Wrocław",
  "miejscowosc": "Wrocław",
  "teryt_simc": "0986283",
  "dzielnica": "Stare Miasto",
  "teryt_simc_dzielnica": "0986544",
  "ulica": "Rynek",
  "teryt_ulic": "19357",
  "nr_budynku": "1",
  "kod_pocztowy": "50-106",
  "lat": 51.10893,
  "lon": 17.03262
}

5. Adresy po współrzędnych (geokodowanie odwrotne)

GET /api/v1/lookup/blisko

Najbliższe punkty adresowe dla współrzędnych WGS84. PostGIS + indeks GiST.

curl -s "https://api.adresy.app/api/v1/lookup/blisko?lat=51.1089&lon=17.0326&radius=200&limit=5"
Odpowiedź
{
  "found": true,
  "count": 5,
  "results": [{
    "miejscowosc": "Wrocław",
    "ulica": "Rynek",
    "nr_budynku": "1",
    "kod_pocztowy": "50-106",
    "distance_m": 12.4,
    "lat": 51.10893,
    "lon": 17.03262
  }]
}

6. Szybkie dopasowanie — GET /match?q=

GET /api/v1/match?q=...

Najprostszy endpoint — podaj adres jako tekst, otrzymasz dopasowanie z PRG z pełnym TERYT, kodem pocztowym i współrzędnymi. Obsługuje literówki, skróty, brak kodu.

ParametrTypOpis
qstringAdres do dopasowania (wymagany)
wojewodztwostringOgraniczenie do województwa
min_scorefloatMin. score dopasowania (0-1, domyślnie 0.6)
curl -s "https://api.adresy.app/api/v1/match?q=Marszalkowska+1+Warszawa"
Python / JavaScript
# Python
import httpx
r = httpx.get("https://api.adresy.app/api/v1/match",
    params={"q": "Marszałkowska 1 Warszawa"},
    headers={"Authorization": "Bearer sk_live_xxx"})
print(r.json()["results"][0]["match"]["kod_pocztowy"])

// JavaScript
const res = await fetch(
  "https://api.adresy.app/api/v1/match?q=" + encodeURIComponent("Rynek 1, Wrocław"),
  { headers: { "Authorization": "Bearer sk_live_xxx" } }
);
const { results } = await res.json();
console.log(results[0].match.kod_pocztowy);

7. Dopasowywanie adresów — POST /match

POST /api/v1/match

Najmocniejszy endpoint. Bierze „brudny" adres (literówki, skróty, bez kodu) i dopasowuje do rekordu PRG z pełnym TERYT, kodem pocztowym i współrzędnymi. Fuzzy-match (RapidFuzz) + heurystyki polskich skrótów.

curl -s -X POST "https://api.adresy.app/api/v1/match" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_live_xxx" \
  -d '{
    "addresses": ["ul. Marsz Pilsudskiego 5a, Wroclaw"],
    "context": {"wojewodztwo": "dolnośląskie"},
    "options": {"fuzzy_threshold": 82, "max_candidates": 5}
  }'

Zamiast addresses możesz podać structured — listę adresów rozbitych na pola (street, building_number, city, postal_code, prefix) — gdy dane już są w kolumnach, parser tekstu nie ma czego psuć. context zawęża wyszukiwanie (miejscowosc, gmina, wojewodztwo, kod_pocztowy), a options.priority (ADDRESS/TERYT/COORDS) steruje kolejnością interpretacji wejścia.

Python / JavaScript
# Python
import httpx
r = httpx.post("https://api.adresy.app/api/v1/match",
    json={"addresses": ["Kościuszki 14 Kraków"]},
    headers={"Authorization": "Bearer sk_live_xxx"})
data = r.json()

// JavaScript
const res = await fetch("https://api.adresy.app/api/v1/match", {
  method: "POST",
  headers: {"Content-Type": "application/json", "Authorization": "Bearer sk_live_xxx"},
  body: JSON.stringify({addresses: ["Kościuszki 14 Kraków"]})
});
const data = await res.json();

8. Walidacja pliku CSV/XLSX (batch)

POST /api/v1/match/file

Prześlij plik z adresami (CSV, XLSX, TXT lub JSON — kodowanie UTF-8 lub ANSI/windows-1250, wykrywane automatycznie). Endpoint tworzy job i zwraca natychmiast {job_id, status, row_count}; wyniki odbierasz z endpointów joba poniżej. Wynik to Twój plik z dopisanymi kolumnami: status, TERYT, kod pocztowy, współrzędne, score, AID.

curl -s -X POST "https://api.adresy.app/api/v1/match/file" \
  -H "Authorization: Bearer sk_live_xxx" \
  -F "[email protected]"

Trzy tryby dopasowania (match_mode):

Tryb Co robi Parametry
address
(domyślny)
Fuzzy-match po nazwach — jak POST /match, wiersz po wierszu. Gdy plik ma kolumny z kodami TERYT, wiersz jest najpierw dopasowywany wprost po kodzie, a przy pudle wraca do nazw. address_column, city_column, number_column, postal_column (wszystkie opcjonalne — kolumny są wykrywane automatycznie), simc_column, ulic_column, default_city, default_woj, restrict_city, restrict_woj
coords Geokodowanie odwrotne — dla każdego wiersza najbliższy adres PRG dla podanych współrzędnych WGS84. lat_column, lon_column (opcjonalne — wykrywane automatycznie)
teryt Wyłącznie kody TERYT, bez dopasowania po nazwach. Pudło kodu = not_found z flagą (TERYT_NOT_FOUND / BRAK_SIMC / BRAK_NUMERU) — zero zgadywania. Dla plików z systemów gminnych, które niosą SIMC i numer. simc_column i number_column — wymagane (SIMC bywa wykryty z nagłówka); ulic_column opcjonalnie zawęża do ulicy
# tryb twardy po kodach TERYT
curl -s -X POST "https://api.adresy.app/api/v1/match/file" \
  -H "Authorization: Bearer sk_live_xxx" \
  -F "[email protected]" -F "match_mode=teryt" \
  -F "simc_column=kod_simc" -F "number_column=nr" -F "ulic_column=kod_ulic"

Odbiór wyników i cykl życia joba:

GET /match/file/job/{id} Status i postęp (liczniki matched / low_confidence / ambiguous / not_found)
GET /match/file/job/{id}/results Wyniki JSON z paginacją (page, per_page, filtr status)
GET /match/file/job/{id}/download CSV: kolumny klienta + wynik. Parametry: wariant=excel (BOM, średnik, przecinek dziesiętny), status=matched|..., kolumny=... (wybór kolumn)
GET /match/file/job/{id}/geojson / …/kml Dopasowane punkty jako GeoJSON / KML (mapy, GIS)
GET /match/file/jobs Lista Twoich jobów
DELETE /match/file/job/{id} Usunięcie joba z wynikami

Przetwarzanie różnicowe: podaj parent_job_id — wiersze identyczne z poprzednim jobem dostają wynik z cache, liczysz tylko nowe i zmienione. Webhook (plan Business): callback_url — POST z podsumowaniem po zakończeniu. send_email=true — powiadomienie mailowe. Tryb synchroniczny (mały plik, wynik od razu w odpowiedzi): POST /match/file/download. Streaming (NDJSON): POST /api/v1/match/stream — wyniki lecą zanim całość się zakończy.

9. Autouzupełnianie — miejscowości, ulice, numery

GET /api/v1/miejscowosci · /api/v1/ulice · /api/v1/numery

Podpowiedzi do formularzy checkout i wtyczek e-commerce (od planu Mini). Kaskada: miejscowość → ulica w niej → numery na ulicy.

curl -s "https://api.adresy.app/api/v1/miejscowosci?q=wro&api_key=sk_live_xxx"
curl -s "https://api.adresy.app/api/v1/ulice?miejscowosc=Wrocław&q=ryn&api_key=sk_live_xxx"
curl -s "https://api.adresy.app/api/v1/numery?miejscowosc=Wrocław&ulica=Rynek&api_key=sk_live_xxx"

Po wybraniu adresu GET /api/v1/lookup/autofill dopełnia kod pocztowy, TERYT i współrzędne — jedno zapytanie zamiast walidacji całego formularza.

Inne endpointy

GET /api/v1/health Status aplikacji
GET /api/v1/stats Statystyki bazy danych
GET /api/v1/wojewodztwa?q=... Autocomplete województw
GET /api/v1/reverse?lat=..&lon=.. Geokodowanie odwrotne — najbliższe adresy PRG (parametr coords przyjmuje też DMS/DM/URL z mapy, radius 1–5000 m)
GET /api/v1/lookup/ulice-w-miejscowosci?simc=... Wszystkie ulice miejscowości (po SIMC lub nazwie)
GET /api/v1/lookup/powiaty-w-wojewodztwie · …/gminy-w-powiecie · …/osiedla-w-miejscowosci Hierarchia administracyjna: województwo → powiaty → gminy; dzielnice i osiedla miast
GET /api/v1/lookup/delegatura?... Delegatura / jednostka pomocnicza dla adresu (Warszawa, Łódź, Kraków…)
GET /id/api/decode?aid=... Dekodowanie AID (adresy.app ID) — stały, 11-znakowy identyfikator punktu adresowego; zwracany też w każdym dopasowaniu jako aid
GET /api/v1/compare/kolumna · POST /api/v1/compare/files Porównywarka: dwa pliki albo plik ↔ job, po adresach, kodach TERYT lub współrzędnych (interfejs — zakładka Narzędzia)

Kody błędów

StatusZnaczenieDziałanie
200OK—
400Nieprawidłowe parametrySprawdź detail w JSON
401Brak / zły klucz APISprawdź nagłówek Authorization
404Nie znalezionofound: false to norma
429Rate limitOdczytaj Retry-After, zwolnij
500Błąd serweraPonów z backoffem

FAQ

Czy API jest darmowe?

Tak — bez rejestracji masz 20 zapytania/min na IP. Plan Free z kluczem API (30 req/min, 3 000 req/mies) jest bezpłatny. Dla wyższego ruchu: Starter od 39 zł/mies (200 req/min, 100k req/mies).

Skąd pochodzą dane?

Punkty adresowe z PRG (GUGiK), TERYT z GUS, kody pocztowe z przypisania PRG + weryfikacja z Pocztą Polską. Import PRG dobowy, TERYT miesięczny.

Czy mogę używać API komercyjnie?

Tak. Dane PRG i TERYT są publiczne. Wymagamy podania źródła (Adresy.app) przy publicznej prezentacji danych.

Jak działa /match vs /lookup?

/match — fuzzy-match brudnych danych (literówki, skróty, OCR). /lookup — szybkie wyszukiwanie czystych danych (znany kod, znana ulica). Dla formularzy i importów użyj match, dla walidacji lookup.

Współrzędne w WGS84?

Tak — lat/lon w EPSG:4326 (WGS84). Wewnętrznie PUWG 1992. Parametr srid=2180 dla natywnego układu.

Co zrobić przy 429?

Odczytaj Retry-After, zaimplementuj wykładniczy backoff (1s, 2s, 4s...). Cache lokalny dla powtarzających się zapytań na 24h.

Czy dane są zgodne z RODO?

Tak. API zwraca dane adresowe (budynki, ulice, kody) — nie dane osobowe. Serwery w EU (Falkenstein, DE).