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/lubcards: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ź
429z nagłówkiemRetry-After(sekundy). - Listy: maksymalnie 100 pozycji na stronę (
per_page).
API integracyjne - endpointy
| Metoda i ścieżka | Uprawnienie | Opis |
|---|---|---|
| GET /integration/me | dowolne | Sprawdzenie klucza: urząd, nazwa klucza, uprawnienia, data ważności. |
| GET /integration/cards | cards:read | Lista 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:read | Jedna karta. |
| POST /integration/cards | cards:write | Nowa karta. Odpowiedź 201 z kartą. |
| PATCH /integration/cards/{id} | cards:write | Zmiana 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.
| Pole | Typ | Opis |
|---|---|---|
| external_id | tekst, do 100 znaków | Opcjonalny identyfikator w Twoim systemie (litery, cyfry, . _ : / -). Tylko przy tworzeniu. |
| document_type | kod a-w, wymagane | Pole 2, rodzaj dokumentu. Kody: /document-types. |
| document_topic | kod a-h, wymagane | Pole 3, temat. Kody: /document-topics. |
| document_name | tekst, do 255, wymagane | Pole 4, nazwa dokumentu. |
| document_description | tekst, do 10 000 | Pole 5, zakres przedmiotowy. Bez danych osobowych osób fizycznych - dane są publiczne. |
| voivodeship_id, county_id, municipality_id | liczba | Pole 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_reference | tekst, do 255 | Pole 7, znak sprawy. |
| created_by | tekst, do 255 | Pole 8, kto wytworzył (instytucja, nie osoba). Pominięte: nazwa urzędu. |
| document_date | data, wymagane | Pole 9, data wydania lub aktualizacji dokumentu. Nie z przyszłości. |
| received_at | data | Data wpływu do urzędu (dokumenty zewnętrzne). Od niej liczy się 14-dniowy termin zamieszczenia. |
| approved_by, approval_date | tekst / data | Pola 10-11, kto i kiedy zatwierdził. |
| storage_location, is_destroyed | tekst / true-false | Pole 12, miejsce przechowywania: nazwa i siedziba podmiotu oraz telefon i e-mail. Pominięte: dane urzędu z ustawień organizacji. |
| electronic_url | adres http(s) | Pole 13, wersja elektroniczna dokumentu. |
| is_final | true/false | Pole 14, czy dokument jest ostateczny. |
| related_card_ids | lista liczb, do 50 | Pole 15, powiązane karty (tylko karty tego samego urzędu). Przesłana lista zastępuje dotychczasowe powiązania. |
| listed_at | data | Pole 16, data zamieszczenia w wykazie. Puste = szkic. |
| has_restriction, access_restriction | true-false / tekst | Pole 17, zastrzeżenia. Przy true podaj podstawę prawną. |
| notes | tekst, do 10 000 | Pole 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
| Kod | Znaczenie |
|---|---|
| 200 / 201 | Sukces / karta utworzona. |
| 401 | Brak klucza, klucz nieprawidłowy, odwołany lub wygasły. |
| 403 | Klucz nie ma potrzebnego uprawnienia, adres IP spoza listy lub dostęp urzędu nieaktywny. |
| 404 | Karta nie istnieje albo należy do innego urzędu. |
| 409 | Karta z tym external_id już istnieje albo karta jest wykreślona i nie można jej edytować. |
| 422 | Błąd danych. Treść: {"message": "...", "errors": {"pole": ["opis"]}}. |
| 429 | Przekroczony limit zapytań. |
API publiczne (bez klucza)
Tylko karty opublikowane w wykazie, bez szkiców i kart wykreślonych.
| Ścieżka | Opis |
|---|---|
| GET /cards | Lista kart. Parametry: page, per_page, sort (card_number, document_name, document_date, listed_at, card_year), order (asc/desc). |
| GET /cards/search | Wyszukiwanie: q (pełnotekstowe), type, topic (identyfikatory ze słowników), year, area. |
| GET /cards/{id} | Szczegóły karty (18 pól). |
| GET /document-types | Rodzaje dokumentów (a-w). |
| GET /document-topics | Tematy (a-h). |
| GET /areas, /areas/{id}/children | Województwa oraz podległe powiaty i gminy (TERYT). |