PRG Address Matcher

Wyszukiwarka adresów PRG

🔍

Wyszukaj adres w bazie PRG

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

Kliknij lub przeciągnij plik

CSV, XLSX, TXT, JSON

Narzędzia adresowe

Wyszukiwarka miejscowości, ulic, kodów pocztowych, TERYT, okręgów wyborczych i szkół. Dane z PRG (GUGiK), TERYT (GUS), RSPO (MEiN) i PKW.

Kody pocztowe i TERYT

Miejscowości

Wyszukaj miejscowość w rejestrze TERYT SIMC

Ulice w miejscowości

Wyszukaj ulicę w wybranej miejscowości

Kod pocztowy

Sprawdź adresy przypisane do kodu pocztowego

Kod dla adresu

Znajdź kod pocztowy dla podanego adresu

Wyszukaj TERYT

Znajdź kody TERYT (SIMC, ULIC) dla adresu

Dekoduj TERYT

Wpisz SIMC, ULIC lub pełny kod SIMC#ULIC#NR

Dane publiczne

Okręgi wyborcze

Wyszukaj obwody głosowania, okręgi rad gmin, powiatów i sejmików

Szkoły i placówki oświatowe

Dane: RSPO/SIO 2025/2026

Adres z mapy

Kliknij na mapę, aby znaleźć najbliższe adresy

Kliknij na mapę... m

Adresy w pobliżu

Wklej współrzędne w dowolnym formacie

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

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 3 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 ulic w odpowiedzi (domyślnie 200)
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. Dekodowanie TERYT

GET /api/v1/lookup/teryt/decode

Zamienia kody TERYT na pełne dane. Auto-detect: SIMC (7 cyfr), ULIC (5 cyfr), format SIMC#ULIC#NR.

curl -s "https://api.adresy.app/api/v1/lookup/teryt/decode?kod=0986283"

5. Adresy w pobliżu (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}
  }'
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

POST /api/v1/match/file

Prześlij plik z adresami (CSV UTF-8 lub XLSX, do 100 tys. wierszy). Otrzymasz ten sam plik z dopisanymi kolumnami: dopasowanie, TERYT, współrzędne, score.

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

Streaming (NDJSON): POST /api/v1/match/stream — wyniki lecą zanim całość się zakończy.

Inne endpointy

GET /api/v1/health Status aplikacji
GET /api/v1/stats Statystyki bazy danych
GET /api/v1/wojewodztwa?q=... Autocomplete województw

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