Feed zmian rejestru TERYT
GUS publikuje „pliki aktualizacyjne”: RÓŻNICE między stanami katalogu. GET /v1/changes udostępnia je jako feed — z datą stanu katalogu, na którym zmiana nastąpiła, i z polami GUS-a w oryginalnych nazwach (bloki before i after nie wymyślają własnego schematu).
Trzy znaczenia, powiedziane wprost. LIKWIDACJA oznacza, że obiekt zniknął z katalogu — NIE oznacza, że adres stał się nieprawidłowy. ZMIANA KOLEJNOŚCI (typ „reordered”, czyli ULIC-owe „Z”) to zmiana FORMATOWA: zmieniła się część nazwy ulicy decydująca o jej pozycji alfabetycznej — ma własny typ, więc można go odfiltrować. Daty to STANY KATALOGU (GUS-owe StanPrzed/StanPo), a nie moment publikacji pliku.
Feed zaczyna się od pierwszego wgranego pliku aktualizacyjnego: wcześniejszej historii rejestru NIE odtwarza się, bo pliki różnicowe opisują tylko te stany, dla których zostały wygenerowane. `meta.coverage.complete` mówi to wprost. Do czasu pierwszego pobrania endpoint odpowiada 503.
GET /v1/changes
Feed zmian: filtry po stanie katalogu, rejestrze i typie zmiany. Kolejność: od najnowszych.
Sprawdź na żywo: /v1/changes?dataset=simc&since=2026-10-01&limit=2
| Nazwa | Wymagany | Opis |
|---|---|---|
since | — | The catalogue state to start from (YYYY-MM-DD). Changes whose "after" state is on or after this date are returned. |
until | — | The catalogue state to stop at (YYYY-MM-DD), inclusive. |
dataset | — | The registry: terc (administrative units) | simc (localities) | ulic (streets). All three when omitted. |
type | — | The change type(s), comma-separated: added, modified, moved, renamed, reordered, deleted. All of them when omitted. |
limit | — | Maximum changes per page (1–200). |
offset | — | 0-based, skips the first N changes (max 10000). |
Przykład
Zmiany miejscowości
curl "https://teryt24.pl/v1/changes?dataset=simc&since=2026-10-01&limit=2"Odpowiedź (skrócona — pokazano pierwsze wiersze):
{
"changes": [
{
"dataset": "simc",
"type": "renamed",
"correctionType": "Z",
"stanBefore": "2026-10-12",
"stanAfter": "2026-11-09",
"identityBefore": "0983988",
"identityAfter": "0983988",
"nameBefore": "Dzierżoniów",
"nameAfter": "Dzierżoniów Śląski",
"before": { "Stan": "2026-10-12", "Woj": "14", "Pow": "65", "Gmi": "03", "Rodz": "01", "Nazwa": "Dzierżoniów" },
"after": { "Stan": "2026-11-09", "Woj": "14", "Pow": "65", "Gmi": "03", "Rodz": "01", "Nazwa": "Dzierżoniów Śląski" }
}
],
"meta": {
"total": 1,
"offset": 0,
"limit": 2,
"coverage": { "from": "2026-10-12", "to": "2026-11-09", "ingestedAt": "2026-11-10T03:12:44.000Z", "complete": false }
}
}| Status | Opis |
|---|---|
200 | The changes, newest first, plus `meta.coverage` — the states the feed covers, when it was last ingested, and the fact that the earlier history is not reconstructed. |
400 | Invalid query parameters. |
429 | Rate limit exceeded (60 requests/min/IP) or a plan's monthly quota exhausted. Includes `Retry-After` and `X-RateLimit-*` headers; the body's `code` distinguishes the two kinds. |
500 | Unexpected server failure (e.g. the database is unreachable). The body is deliberately generic — error detail lives in the server logs, never in the response. |
Przeglądaj dane
Zmiany dotyczą tych samych obiektów, które mają strony w przeglądarce:
Wszystkie endpointy /v1 zwracają JSON, obsługują CORS i są objęte dokumentem openapi.json. Interaktywna wersja tej referencji: /docs.
Limity: 60 zapytań/min na IP bez klucza; klucz API (nagłówek X-API-Key) dostaje własny kubełek. Po przekroczeniu endpointy odpowiadają HTTP 429 z nagłówkiem Retry-After. Szczegóły: limity i klucze · zasady użycia.
Dane: GUS TERYT, punkty adresowe PRG (GUGiK), kody pocztowe GeoNames — przez teryt24.pl z linkiem do zasad użycia. Użycie wyłącznie po stronie serwera jest zwolnione.