API PDWD - dokumentacja

Dla dostawców systemów, z których korzystają urzędy: jak dodawać i aktualizować karty informacyjne w wykazie przez API.

Zanim zaczniesz

Ekorejestr nie ma gotowych integracji z konkretnymi systemami. To aplikacja urzędu, działająca lokalnie lub w innym portalu, łączy się z API Ekorejestr. Każda integracja wymaga indywidualnych ustaleń: urząd zamawia dostęp, a my wydajemy klucz API przypisany do tego urzędu.

Kontakt w sprawie integracji: kontakt@ekorejestr.pl.

  • API publiczne (tylko odczyt, bez klucza) - karty opublikowane w wykazie i słowniki.
  • API integracyjne (klucz API) - odczyt, dodawanie i edycja kart jednego urzędu, także kart jeszcze nieopublikowanych.

Adres bazowy: http://13.140.161.151/api/v1. Format: JSON w UTF-8, daty w formacie RRRR-MM-DD.

Klucz API i bezpieczeństwo

Klucz ma postać ekr_… i przesyła się go w nagłówku każdego zapytania:

Authorization: Bearer ekr_TWOJ_KLUCZ
Content-Type: application/json
Accept: application/json
  • Klucz działa wyłącznie na kartach jednego urzędu. Karty innych urzędów są dla niego niewidoczne: odpowiedź to 404, tak jak dla karty, która nie istnieje.
  • Klucz ma uprawnienia cards:read (odczyt) i/lub cards:write (dodawanie i edycja). Może mieć datę ważności i listę dozwolonych adresów IP.
  • API nie pozwala usuwać ani wykreślać kart. Te operacje wykonuje urzędnik w panelu.
  • Każda zmiana z API trafia do historii karty i dziennika zdarzeń jako zmiana konta przypisanego do klucza.
  • Klucz przechowuj jak hasło: nie umieszczaj go w kodzie strony WWW ani w repozytorium.
  • Wyciek klucza: administrator urzędu może sam natychmiast unieważnić klucz w panelu Ekorejestr (Ustawienia → Moja organizacja → Klucze API), bez czekania na nas. Nowy klucz wydajemy na prośbę urzędu wysłaną na kontakt@ekorejestr.pl; do czasu wpisania nowego klucza integracja nie działa.
  • Komunikacja wyłącznie przez HTTPS.

Limity

  • API integracyjne: 60 zapytań na minutę na klucz.
  • API publiczne: 60 zapytań na minutę na adres IP.
  • Po przekroczeniu limitu: odpowiedź 429 z nagłówkiem Retry-After (sekundy).
  • Listy: maksymalnie 100 pozycji na stronę (per_page).

API integracyjne - endpointy

Metoda i ścieżkaUprawnienieOpis
GET /integration/medowolneSprawdzenie klucza: urząd, nazwa klucza, uprawnienia, data ważności.
GET /integration/cardscards:readLista kart urzędu. Filtry: year, listed (true/false), external_id, updated_since (data i czas ISO 8601), page, per_page.
GET /integration/cards/{id}cards:readJedna karta.
POST /integration/cardscards:writeNowa karta. Odpowiedź 201 z kartą.
PATCH /integration/cards/{id}cards:writeZmiana wybranych pól karty. Pola nieprzesłane pozostają bez zmian.

Numer karty, rok i urząd nadaje system. Karta bez listed_at jest szkicem: widzi ją tylko urząd w panelu, nie ma jej w publicznym wykazie. Ustawienie listed_at publikuje kartę z tą datą zamieszczenia (pole 16).

Pole external_id to identyfikator dokumentu w Twoim systemie. Ponowne wysłanie POST z tym samym external_id nie tworzy duplikatu, tylko zwraca 409 z numerem istniejącej karty. Dzięki temu bezpiecznie ponowisz zapytanie po błędzie sieci.

Pola karty

Pola odpowiadają 18 polom karty informacyjnej z Rozporządzenia Ministra Środowiska z 22.09.2010 (Dz.U. Nr 186, poz. 1249). Nieznane pola są odrzucane (422), żeby literówka w nazwie nie przepadła po cichu.

PoleTypOpis
external_idtekst, do 100 znakówOpcjonalny identyfikator w Twoim systemie (litery, cyfry, . _ : / -). Tylko przy tworzeniu.
document_typekod a-w, wymaganePole 2, rodzaj dokumentu. Kody: /document-types.
document_topickod a-h, wymaganePole 3, temat. Kody: /document-topics.
document_nametekst, do 255, wymaganePole 4, nazwa dokumentu.
document_descriptiontekst, do 10 000Pole 5, zakres przedmiotowy. Bez danych osobowych osób fizycznych - dane są publiczne.
voivodeship_id, county_id, municipality_idliczbaPole 6, obszar. Identyfikatory z /areas i /areas/{id}/children. Powiat musi należeć do województwa, gmina do powiatu. Pominięte: domyślny obszar urzędu, jeśli urząd go ustawił.
case_referencetekst, do 255Pole 7, znak sprawy.
created_bytekst, do 255Pole 8, kto wytworzył (instytucja, nie osoba). Pominięte: nazwa urzędu.
document_datedata, wymaganePole 9, data wydania lub aktualizacji dokumentu. Nie z przyszłości.
received_atdataData wpływu do urzędu (dokumenty zewnętrzne). Od niej liczy się 14-dniowy termin zamieszczenia.
approved_by, approval_datetekst / dataPola 10-11, kto i kiedy zatwierdził.
storage_location, is_destroyedtekst / true-falsePole 12, miejsce przechowywania: nazwa i siedziba podmiotu oraz telefon i e-mail. Pominięte: dane urzędu z ustawień organizacji.
electronic_urladres http(s)Pole 13, wersja elektroniczna dokumentu.
is_finaltrue/falsePole 14, czy dokument jest ostateczny.
related_card_idslista liczb, do 50Pole 15, powiązane karty (tylko karty tego samego urzędu). Przesłana lista zastępuje dotychczasowe powiązania.
listed_atdataPole 16, data zamieszczenia w wykazie. Puste = szkic.
has_restriction, access_restrictiontrue-false / tekstPole 17, zastrzeżenia. Przy true podaj podstawę prawną.
notestekst, do 10 000Pole 18, uwagi.

Odpowiedź zawiera dodatkowo: id, card_number (np. „12/2026”), status (draft, listed lub struck_off), deadline_at (termin zamieszczenia), public_url (dla kart opublikowanych) i updated_at.

Przykłady

Sprawdzenie klucza:

curl -H "Authorization: Bearer ekr_TWOJ_KLUCZ" http://13.140.161.151/api/v1/integration/me

Dodanie szkicu karty:

curl -X POST http://13.140.161.151/api/v1/integration/cards \
  -H "Authorization: Bearer ekr_TWOJ_KLUCZ" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "KANC/2026/0153",
    "document_type": "d",
    "document_topic": "b",
    "document_name": "Decyzja o środowiskowych uwarunkowaniach dla przedsięwzięcia X",
    "document_description": "Decyzja określa środowiskowe uwarunkowania realizacji przedsięwzięcia X.",
    "case_reference": "OŚ.6220.12.2026",
    "document_date": "2026-10-20",
    "is_final": false
  }'

Odpowiedź (201, skrócona):

{
  "data": {
    "id": 4812,
    "external_id": "KANC/2026/0153",
    "card_number": "153/2026",
    "status": "draft",
    "document_type": "d",
    "document_date": "2026-10-20",
    "deadline_at": "2026-11-03",
    "public_url": null
  }
}

Publikacja karty w wykazie:

curl -X PATCH http://13.140.161.151/api/v1/integration/cards/4812 \
  -H "Authorization: Bearer ekr_TWOJ_KLUCZ" \
  -H "Content-Type: application/json" \
  -d '{"listed_at": "2026-10-28"}'

Kody odpowiedzi

KodZnaczenie
200 / 201Sukces / karta utworzona.
401Brak klucza, klucz nieprawidłowy, odwołany lub wygasły.
403Klucz nie ma potrzebnego uprawnienia, adres IP spoza listy lub dostęp urzędu nieaktywny.
404Karta nie istnieje albo należy do innego urzędu.
409Karta z tym external_id już istnieje albo karta jest wykreślona i nie można jej edytować.
422Błąd danych. Treść: {"message": "...", "errors": {"pole": ["opis"]}}.
429Przekroczony limit zapytań.

API publiczne (bez klucza)

Tylko karty opublikowane w wykazie, bez szkiców i kart wykreślonych.

ŚcieżkaOpis
GET /cardsLista kart. Parametry: page, per_page, sort (card_number, document_name, document_date, listed_at, card_year), order (asc/desc).
GET /cards/searchWyszukiwanie: q (pełnotekstowe), type, topic (identyfikatory ze słowników), year, area.
GET /cards/{id}Szczegóły karty (18 pól).
GET /document-typesRodzaje dokumentów (a-w).
GET /document-topicsTematy (a-h).
GET /areas, /areas/{id}/childrenWojewództwa oraz podległe powiaty i gminy (TERYT).