Dla firm · Integracja
Pozywacz API
Składaj sprawy programistycznie i odbieraj gotowe pozwy. Zamiast klikać w kreatorze, Twój system wysyła jeden request z danymi sprawy - my walidujemy, przygotowujemy pozew, sprawdzamy go po naszej stronie i dopiero wtedy oddajemy wynik przez webhook lub odpytywanie statusu.
Jak zacząć
Integracja sprowadza się do dwóch wywołań: wysyłasz sprawę i odbierasz gotowe pismo. Poniżej masz całą ścieżkę w gotowych do wklejenia przykładach - od sprawdzenia klucza po pobranie PDF-a.
Model działania
API jest asynchroniczne. Twój request nie czeka na gotowy dokument - dostajesz identyfikator zgłoszenia i odbierasz wynik później, webhookiem albo odpytując status.
- TyRECEIVED
POST /api/v1/submissionsWysyłasz dane sprawy. Walidujemy je od razu i odpowiadamy
202zsubmissionId. - Pozywacz
Przygotowanie pisma
Pracujemy nad dokumentem w tle. Twój request już dawno wrócił.
- PozywaczIN_REVIEW
Kontrola po naszej stronie
Gotowe pismo sprawdza człowiek. Do tego momentu
resultjestnulli nie wysyłamy webhooka. - TyCOMPLETED
Webhook albo
GET /submissions/{id}Powiadamiamy Cię sami albo odpytujesz status. Obie drogi zwracają tę samą strukturę.
- Ty
GET /submissions/{id}/documentPobierasz gotowe pismo jako PDF, tym samym kluczem API.
Kluczowa różnica wobec typowego API: między przygotowaniem a wydaniem pisma jest kontrola po naszej stronie. Przez ten czas zgłoszenie ma status IN_REVIEW, result pozostaje null i nie wysyłamy webhooka. Zaprojektuj proces tak, żeby to znosił - nie zakładaj odpowiedzi w tej samej sesji użytkownika.
Krok 1. Klucz API
Dostęp nadajemy indywidualnie. Napisz na help@pozywacz.pl. Podanie od razu poniższych informacji skraca ustalenia zwykle do jednej wymiany maili:
| Co podać | Po co nam to |
|---|---|
Przewidywany wolumen | Ustawiamy limit zapytań na minutę i miesięczną kwotę zgłoszeń. |
Typy spraw, które chcesz składać | Konto ma listę dozwolonych claimType; poza nią dostaniesz 403. |
Adres webhooka (jeśli chcesz) | Skonfigurujemy go razem z sekretem do podpisu HMAC. Bez webhooka odpytujesz status sam. |
Dane do faktury | Rozliczamy się jedną zbiorczą fakturą miesięcznie. |
Czy potrzebujesz konta testowego | Możemy nadać osobne konto z niskim limitem, żebyś nie mieszał prób z ruchem produkcyjnym. |
Sekret klucza pokazujemy tylko raz, w chwili generowania. Zapisz go od razu w swoim magazynie sekretów - odczytać ponownie się go nie da, można tylko wygenerować nowy.
Krok 2. Sprawdź połączenie
Zanim wyślesz pierwszą sprawę, upewnij się, że klucz działa. GET /case-typesnic nie tworzy i nie liczy się do kwoty, więc jest bezpiecznym testem:
curl https://pozywacz.pl/api/v1/case-types \
-H "Authorization: Bearer pk_live_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"W odpowiedzi dostajesz typy spraw dostępne dla Twojego konta wraz z pełnym opisem pól. Warto z tego korzystać zamiast przepisywać pola z dokumentacji na sztywno - lista jest generowana z tego samego źródła co walidator, więc nigdy się z nim nie rozjedzie.
Dostajesz 401? Sprawdź, czy nagłówek ma postać Bearer ze spacją i czy nie skopiowałeś klucza ze złamaniem linii. Przy 403 client_suspendednapisz do nas.
Krok 3. Wyślij pierwszą sprawę
Minimalne wywołanie to claimType i obiekt data. Poniższy przykład jest kompletny - możesz go wkleić i podmienić dane:
curl -X POST https://pozywacz.pl/api/v1/submissions \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: sprawa-2026-00123" \
-d '{
"claimType": "b2b_payment_missing",
"data": {
"plaintiff": {
"name": "Przykład Sp. z o.o.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "5252525252"
},
"defendant": {
"name": "Dłużnik S.A.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "7010101010"
},
"defendantType": "business",
"defendantPeselUnknown": false,
"claimAmount": 12000,
"claimInterest": true,
"claimBusinessCosts": true,
"contractSubject": "Wykonanie instalacji elektrycznej",
"contractDescription": "Kompleksowe wykonanie instalacji elektrycznej w lokalu przy ul. ...",
"contractDate": "2026-01-15",
"paymentDue": "2026-05-10",
"invoices": [
{
"fileName": "FV 1/2026",
"amount": 12000,
"dueDate": "2026-05-10"
}
],
"demandSent": true,
"additionalInfo": "Dłużnik uznał dług mailowo w dniu ...",
"files": [
{
"fileId": "clx9f2k7b0001abcd"
}
]
}
}'Odpowiedź:
{
"submissionId": "clx123abc...",
"status": "RECEIVED",
"orderId": "a1b2c3..."
}- Zapisz
submissionIdprzy swojej sprawie. To po nim rozpoznasz webhooka i odpytasz status. - Zawsze wysyłaj
Idempotency-Key- własny identyfikator sprawy z Twojego systemu. Powtórzenie żądania z tym samym kluczem zwróci istniejące zgłoszenie zamiast utworzyć duplikat, a duplikat to druga sprawa na Twojej fakturze. - Walidacja jest ścisła. Nieznany klucz w
datakończy się błędem422, a nie cichym pominięciem - literówka w nazwie pola nie przejdzie niezauważona.
Krok 4. Dołącz dokumenty (opcjonalnie)
Faktury, umowy i korespondencję możesz dołączyć do sprawy. Najpierw wgrywasz plik, potem podajesz jego identyfikator przy składaniu sprawy:
# 1. wgraj plik
curl -X POST https://pozywacz.pl/api/v1/files \
-H "Authorization: Bearer pk_live_..." \
-F "file=@FV-1-2026.pdf"
# odpowiedź: { "fileId": "clx9f2k7b0001abcd", "extraction": { "status": "ok", ... } }
# 2. podaj fileId w polu data.files przy składaniu sprawy
# "files": [{ "fileId": "clx9f2k7b0001abcd" }]Pole extraction.status w odpowiedzi mówi, czy udało się odczytać treść dokumentu. ok to plik czytelny, pending oznacza skan, który spróbujemy rozpoznać przy przygotowaniu pisma. Szczegóły i limity: Załączniki.
Krok 5. Odbierz gotowe pismo
Są dwie drogi i możesz używać obu naraz.
Webhook - powiadamiamy Cię sami, gdy zgłoszenie jest gotowe. Ta sama struktura co odpowiedź GET /submissions/{id}, więc obsłużysz je jednym kodem. Weryfikuj podpis X-Pozywacz-Signature (szczegóły: Webhooki).
Odpytywanie - gdy nie masz publicznego adresu albo chcesz uzgodnić stan:
curl https://pozywacz.pl/api/v1/submissions/clx123abc... \
-H "Authorization: Bearer pk_live_..."Dopóki status to RECEIVED, GENERATING albo IN_REVIEW - sprawa jest w toku. Przy COMPLETED wypełnia się result, a w nim documentUrl:
curl -L https://pozywacz.pl/api/v1/submissions/clx123abc.../document \
-H "Authorization: Bearer pk_live_..." \
-o pozew.pdfDokumenty pobierasz tym samym kluczem API. Nie musisz zakładać konta Google ani niczego sobie udostępniać. W result.files[] znajdziesz też pozostałe pliki sprawy, w tym własne załączniki.
Zanim wejdziesz na produkcję
| Sprawdź | Dlaczego |
|---|---|
Idempotency-Key przy każdym zgłoszeniu | Timeout po Twojej stronie nie oznacza, że sprawa nie została przyjęta. Bez klucza ponowienie tworzy duplikat. |
Ponawianie tylko przy 5xx i 429 | Błędy 4xx (poza 429) są trwałe - ponowienie bez poprawy danych da ten sam wynik. |
Obsługa statusu IN_REVIEW | Nie traktuj go jak błędu ani jak końca procesu. To normalny etap, w którym pismo czeka na naszą kontrolę. |
Weryfikacja podpisu webhooka | Bez sprawdzenia X-Pozywacz-Signature Twój endpoint przyjmie dowolne żądanie, które ktoś na niego wyśle. |
Zapisywanie errorCode | Przy FAILED i REJECTED to jedyna informacja, co poszło nie tak. Zapisz ją przy sprawie. |
Klucz wyłącznie po stronie serwera | Klucz w kodzie front-endu albo aplikacji mobilnej jest kluczem publicznym. |
Limit zgłoszeń | Po wyczerpaniu miesięcznej kwoty dostaniesz 429 quota_exceeded w środku miesiąca. Monitoruj liczbę spraw po swojej stronie. |
Najczęstsze pomyłki
- Wysyłanie plików jako JSON.
POST /api/v1/filesprzyjmujemultipart/form-data, inaczej niż pozostałe endpointy. - Zapominanie o
defendantType. Pominięcie oznaczabusiness. Przy dłużniku będącym osobą fizyczną zmienia to podstawę odsetek i wyklucza rekompensatę 40/70/100 EUR - podawaj to pole jawnie. - Traktowanie załączników jako zamiennika pól. Odczyt dokumentu jest wsparciem, nie gwarancją. Kwoty, daty i dane stron zawsze podawaj też w
data. - Przetrzymywanie
fileId. Plik nieprzypięty do sprawy kasujemy po 24 h. Wgrywaj dokumenty tuż przed złożeniem sprawy, nie z wyprzedzeniem. - Poleganie na
orderId. To nasz wewnętrzny identyfikator, przydatny w zgłoszeniach do wsparcia. Do śledzenia sprawy używajsubmissionId.
Uwierzytelnianie
Każde żądanie musi zawierać Twój klucz API w nagłówku Authorization:
Authorization: Bearer pk_live_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx- Sekret klucza pokazujemy tylko raz, w chwili generowania. Przechowuj go bezpiecznie - nie da się go odczytać ponownie.
- Klucz można w każdej chwili unieważnić i wygenerować nowy (rotacja) bez zmiany konta.
- Wszystkie wywołania idą po HTTPS. Nie umieszczaj klucza w kodzie front-endu.
Endpointy
/api/v1/case-typesZwraca typy spraw dostępne dla Twojego klucza wraz ze schematem pól każdego typu. Lista jest filtrowana po uprawnieniach Twojego konta, więc widzisz dokładnie to, co możesz złożyć.
| Pole | Znaczenie |
|---|---|
caseTypes[].claimType | Identyfikator typu sprawy - wysyłasz go w polu claimType. |
caseTypes[].title | Nazwa typu sprawy. |
caseTypes[].description | Opis, czego dotyczy ten typ sprawy. |
caseTypes[].fields[].name | Nazwa klucza w obiekcie data. |
caseTypes[].fields[].type | Rodzaj pola: string, text, number, money, boolean, date, party, invoices, files, enum. |
caseTypes[].fields[].required | true, gdy pole jest obowiązkowe. |
caseTypes[].fields[].label | Etykieta pola po polsku. |
caseTypes[].fields[].description | Opis, co podać w polu. |
caseTypes[].fields[].values | Tylko dla type = enum: lista dopuszczalnych wartości. |
caseTypes[].fields[].default | Wartość przyjmowana, gdy pominiesz pole opcjonalne (jeśli dotyczy). |
caseTypes[].exampleData | Gotowy przykładowy obiekt data dla tego typu sprawy. |
{
"caseTypes": [
{
"claimType": "b2b_payment_missing",
"title": "Brak zapłaty za fakturę",
"fields": [
{
"name": "plaintiff",
"type": "party",
"required": true
},
{
"name": "defendant",
"type": "party",
"required": true
}
]
},
{
"claimType": "other",
"title": "Inna sprawa",
"fields": [
{
"name": "plaintiff",
"type": "party",
"required": true
},
{
"name": "defendant",
"type": "party",
"required": true
}
]
}
]
}/api/v1/submissionsSkłada jedną sprawę. W ciele podajesz claimType oraz obiekt data z polami sprawy. Przygotowanie pozwu rusza w tle, więc odpowiedź wraca od razu.
| Nagłówek | Znaczenie |
|---|---|
Authorization | Wymagany. Bearer pk_live_... |
Content-Type | Wymagany. application/json |
Idempotency-Key | Opcjonalny, zalecany. Maks. 200 znaków, unikalny per sprawa (np. UUID albo Twój identyfikator sprawy w CRM). Powtórzenie tego samego klucza zwraca istniejące zgłoszenie zamiast tworzyć duplikat. |
| Pole | Znaczenie |
|---|---|
claimType | Wymagane. Identyfikator typu sprawy z GET /case-types. |
data | Wymagane. Obiekt z polami sprawy - zestaw pól zależy od claimType (patrz „Typy spraw i pola”). Obiekt jest walidowany ściśle: nieznany klucz kończy się błędem 422, nie jest po cichu pomijany. |
| HTTP | Znaczenie |
|---|---|
202 | Zgłoszenie przyjęte i utworzone. Przygotowanie pozwu ruszyło w tle. |
200 | Powtórzenie żądania z tym samym Idempotency-Key. Zwracamy wcześniej utworzone zgłoszenie, nic nowego nie powstaje. |
400 / 403 / 422 / 429 | Błąd - patrz kody błędów. |
| Pole | Znaczenie |
|---|---|
submissionId | Identyfikator zgłoszenia. Używasz go w GET /submissions/{id} i rozpoznajesz po nim webhooka. |
status | Status początkowy, zawsze RECEIVED (przy powtórzeniu idempotentnym: aktualny status istniejącego zgłoszenia). |
orderId | Nasz wewnętrzny identyfikator zlecenia. Przydaje się w zgłoszeniach do wsparcia; może być null przez chwilę po utworzeniu. |
{
"claimType": "b2b_payment_missing",
"data": {
"plaintiff": {
"name": "Przykład Sp. z o.o.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "5252525252"
},
"defendant": {
"name": "Dłużnik S.A.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "7010101010"
},
"defendantType": "business",
"defendantPeselUnknown": false,
"claimAmount": 12000,
"claimInterest": true,
"claimBusinessCosts": true,
"contractSubject": "Wykonanie instalacji elektrycznej",
"contractDescription": "Kompleksowe wykonanie instalacji elektrycznej w lokalu przy ul. ...",
"contractDate": "2026-01-15",
"paymentDue": "2026-05-10",
"invoices": [
{
"fileName": "FV 1/2026",
"amount": 12000,
"dueDate": "2026-05-10"
}
],
"demandSent": true,
"additionalInfo": "Dłużnik uznał dług mailowo w dniu ...",
"files": [
{
"fileId": "clx9f2k7b0001abcd"
}
]
}
}{
"submissionId": "clx123abc...",
"status": "RECEIVED",
"orderId": "a1b2c3..."
}/api/v1/submissions/{id}Zwraca status zgłoszenia, a po naszej kontroli - przygotowane pismo i linki do plików sprawy. Dopóki zgłoszenie czeka na kontrolę, status to IN_REVIEW, a result pozostaje null. Widzisz wyłącznie zgłoszenia własnego konta; cudze zwracają 404.
| Pole | Znaczenie |
|---|---|
event | Zawsze submission.updated. Ta sama struktura wraca w webhooku, więc obie ścieżki obsłużysz jednym kodem. |
submissionId | Identyfikator zgłoszenia. |
claimType | Typ sprawy, z jakim zgłoszenie zostało złożone. |
status | Jeden z: RECEIVED, GENERATING, IN_REVIEW, COMPLETED, FAILED, REJECTED - patrz cykl życia. |
createdAt | Data przyjęcia zgłoszenia (ISO 8601, UTC). |
completedAt | Data zakończenia (ISO 8601, UTC). null, dopóki zgłoszenie jest w toku lub w kontroli (IN_REVIEW). |
error | null przy powodzeniu. Przy FAILED i REJECTED: obiekt { code, message } - patrz kody błędów. |
result | null, dopóki status nie jest COMPLETED - a więc także przez cały czas kontroli. |
result.documentUrl | Link do gotowego pisma w formacie PDF. Pobierasz go tym samym kluczem API (Authorization: Bearer). null, gdy dokumentu nie udało się utworzyć - wtedy zostaje lawsuitHtml. |
result.files[] | Wszystkie pliki sprawy: pismo, instrukcja i załączniki, które sam przesłałeś. Każdy z fileId, name, mimeType, size i downloadUrl. |
result.lawsuitHtml | Treść przygotowanego pisma w HTML - do zapisania przy sprawie w Twoim systemie. |
{
"event": "submission.updated",
"submissionId": "clx123abc...",
"claimType": "b2b_payment_missing",
"status": "COMPLETED",
"createdAt": "2026-09-04T09:12:31.004Z",
"completedAt": "2026-09-04T09:13:58.512Z",
"error": null,
"result": {
"documentUrl": "https://pozywacz.pl/api/v1/submissions/clx123abc.../document",
"files": [
{
"fileId": "1AbC…",
"name": "Pozew_non-payment-work_v1.pdf",
"mimeType": "application/vnd.google-apps.document",
"downloadUrl": "https://pozywacz.pl/api/v1/submissions/clx123abc.../files/1AbC…"
}
],
"lawsuitHtml": "<div>POZEW O ZAPŁATĘ…</div>"
}
}/api/v1/submissionsLista Twoich zgłoszeń (najnowsze pierwsze) z paginacją kursorową. Przydatna do uzgadniania stanu, gdy webhook nie dotarł.
| Parametr | Znaczenie |
|---|---|
status | Opcjonalny filtr statusu: RECEIVED, GENERATING, IN_REVIEW, COMPLETED, FAILED, REJECTED. |
limit | Opcjonalny. Liczba pozycji na stronę, domyślnie 25, maksymalnie 100. Wartości spoza zakresu przycinamy do granicy. |
cursor | Opcjonalny. Wartość nextCursor z poprzedniej odpowiedzi. |
| Pole | Znaczenie |
|---|---|
items[] | Zgłoszenia od najnowszego. Pozycja listy nie zawiera treści pozwu - po nią sięgnij przez GET /submissions/{id}. |
items[].errorCode | Kod błędu przy statusie FAILED lub REJECTED, w pozostałych przypadkach null. |
nextCursor | Kursor następnej strony albo null, gdy to już ostatnia. |
{
"items": [
{
"submissionId": "clx…",
"claimType": "b2b_payment_missing",
"status": "COMPLETED",
"orderId": "a1b2c3...",
"createdAt": "2026-09-04T09:12:31.004Z",
"completedAt": "2026-09-04T09:13:58.512Z",
"errorCode": null
}
],
"nextCursor": null
}/api/v1/filesWgrywa jeden załącznik i zwraca fileId, którym przypinasz go do sprawy w polu data.files. Ciało to multipart/form-data, nie JSON.
| Nagłówek | Znaczenie |
|---|---|
Authorization | Wymagany. Bearer pk_live_... |
Content-Type | Wymagany. multipart/form-data - nie application/json, inaczej niż w pozostałych endpointach. |
| Pole | Znaczenie |
|---|---|
file | Wymagane. Zawartość pliku. Maks. 15 MB. Dopuszczalne typy: image/jpeg, image/png, image/webp, image/heic, image/gif, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, text/plain, text/csv. |
| HTTP | Znaczenie |
|---|---|
201 | Plik przyjęty. Zapisz zwrócony fileId. |
413 | file_too_large - plik przekracza 15 MB. |
415 | unsupported_file_type - typ pliku nieobsługiwany albo nierozpoznany. Typ ustalamy z zawartości pliku, nie z deklarowanego nagłówka. |
503 | storage_unavailable - magazyn dokumentów chwilowo niedostępny, ponów za chwilę. |
| Pole | Znaczenie |
|---|---|
fileId | Identyfikator pliku. Przypinasz go do sprawy jako { "fileId": "..." } w tablicy data.files. |
expiresAt | Do kiedy plik czeka na przypięcie. Nieużyty plik kasujemy po 24 h - wgraj go ponownie, jeśli minie. |
extraction.status | ok - treść odczytana od razu. pending - plik wygląda na skan, treść odczytamy przy przygotowaniu pisma. To nie jest błąd. |
extraction.source | Skąd wzięliśmy tekst: pdf-text, docx albo cache (identyczny plik był już czytany). |
extraction.chars | Liczba odczytanych znaków. Zero przy statusie pending. |
{
"fileId": "clx9f2k7b0001abcd",
"name": "FV-1-2026.pdf",
"mimeType": "application/pdf",
"size": 184320,
"expiresAt": "2026-09-09T12:00:00.000Z",
"extraction": {
"status": "ok",
"source": "pdf-text",
"chars": 2841
}
}/api/v1/submissions/{id}/documentPobiera gotowe pismo jako PDF. Ten sam klucz API co reszta endpointów - nie musisz nic dodatkowo udostępniać ani logować się do Google.
| Parametr | Znaczenie |
|---|---|
disposition | Opcjonalny. inline pokazuje plik w przeglądarce zamiast go pobierać - przydatne, gdy osadzasz podgląd we własnym panelu. Domyślnie attachment. |
| HTTP | Znaczenie |
|---|---|
200 | Strumień pliku PDF. |
404 | not_found - zgłoszenie nie istnieje albo nie należy do Twojego konta. |
409 | not_ready - zgłoszenie wciąż w toku lub w kontroli. no_document - zgłoszenie nie ma dokumentu (sprawdź status i error). |
Analogicznie GET /api/v1/submissions/{id}/files/{fileId} pobiera dowolny plik sprawy - identyfikatory znajdziesz w result.files[].
Cykl życia zgłoszenia
Przygotowanie pozwu jest asynchroniczne - nie blokuj na nim swojego procesu, tylko czekaj na webhooka albo odpytuj status. Każdy pozew przed wydaniem przechodzi kontrolę po naszej stronie: dopóki jej nie zamkniemy, zgłoszenie ma status IN_REVIEW, pole result jest puste i nie wysyłamy żadnego webhooka.
| status | Co oznacza | Co robi Twój system |
|---|---|---|
RECEIVED | Zgłoszenie przyjęte i zwalidowane, czeka na przetworzenie. | Zapisz submissionId przy sprawie i czekaj. |
GENERATING | Trwa przygotowanie pozwu. | Nic - status zmieni się sam. |
IN_REVIEW | Zgłoszenie zamknięte po naszej stronie i czeka na kontrolę przed wydaniem. Nie ma jeszcze ani wyniku, ani webhooka. | Nic - czekaj. Status zmieni się na COMPLETED, FAILED albo REJECTED. |
COMPLETED | Pozew sprawdzony i wydany, dane w polu result. | Zapisz treść i link, skieruj sprawę do akceptacji przez człowieka. |
FAILED | Przygotowanie nie powiodło się, szczegóły w error. | Oznacz sprawę do obsługi ręcznej i skontaktuj się z nami. |
REJECTED | Zgłoszenie odrzucone po kontroli - pozwu nie wydajemy. | Oznacz sprawę do obsługi ręcznej i skontaktuj się z nami. |
Kody błędów
| HTTP | code | Znaczenie | Co zrobić |
|---|---|---|---|
| 400 | invalid_json | Ciało żądania nie jest poprawnym JSON-em. | Popraw request. Nie ponawiaj bez zmian. |
| 400 | invalid_claim_type | Brak pola claimType albo wartość spoza listy obsługiwanych typów. | Sprawdź GET /case-types. |
| 400 | invalid_data | Brak obiektu data albo nie jest obiektem. | Popraw strukturę żądania. |
| 401 | missing_credentials | Brak nagłówka Authorization. | Dodaj nagłówek z kluczem. |
| 401 | invalid_key | Klucz ma zły format albo nie istnieje. | Sprawdź, czy wysyłasz pełny klucz. |
| 401 | key_revoked | Klucz został unieważniony. | Użyj aktualnego klucza. |
| 401 | key_expired | Klucz wygasł. | Poproś nas o nowy klucz. |
| 403 | claim_type_forbidden | Twoje konto nie ma uprawnień do tego typu sprawy. | Napisz do nas, rozszerzymy uprawnienia. |
| 403 | client_suspended | Konto zawieszone. | Skontaktuj się z nami. |
| 404 | not_found | Zgłoszenie nie istnieje albo należy do innego konta. | Sprawdź submissionId. |
| 422 | validation_failed | Pola nie przeszły walidacji. Lista issues zawiera path (ścieżka pola) i message. | Popraw dane w swoim systemie. Ponowienie bez zmian da ten sam błąd. |
| 429 | rate_limited | Przekroczona liczba zapytań na minutę. | Odczekaj i ponów z tym samym Idempotency-Key. |
| 429 | quota_exceeded | Wyczerpany miesięczny limit zgłoszeń. | Skontaktuj się z nami w sprawie limitu. |
| 409 | not_ready | Dokument zamówiony przed zakończeniem kontroli zgłoszenia. | Poczekaj na status COMPLETED albo na webhooka. |
| 409 | no_document | Zgłoszenie nie ma dokumentu do pobrania. | Sprawdź status i error zgłoszenia. |
| 413 | file_too_large | Załącznik przekracza dopuszczalny rozmiar. | Zmniejsz plik albo podziel dokumentację. |
| 415 | unsupported_file_type | Typ pliku nieobsługiwany albo nierozpoznany po zawartości. | Prześlij PDF, DOCX albo obraz - lista w sekcji Załączniki. |
| 502 / 503 | upload_failed, storage_unavailable, document_unavailable | Chwilowy problem z magazynem dokumentów. | Ponów za chwilę - to błędy przejściowe. |
Każdy błąd ma tę samą strukturę - kod czytelny dla maszyny i komunikat dla człowieka:
{
"error": {
"code": "validation_failed",
"message": "Some fields are missing or invalid.",
"issues": [
{
"path": "claimAmount",
"message": "Required"
},
{
"path": "claimBusinessCosts",
"message": "Rekompensata za koszty odzyskiwania należności (40/70/100 EUR) przysługuje wyłącznie w transakcjach handlowych między przedsiębiorcami."
}
]
}
}Osobno występuje generation_failed - to nie błąd HTTP, tylko kod w polu error.codezgłoszenia ze statusem FAILED. Oznacza, że żądanie było poprawne, ale przygotowanie pozwu się nie powiodło. Podobnie rejected_by_provider przy statusie REJECTED - sprawa nie przeszła naszej kontroli i pozwu nie wydajemy.
Typy spraw i pola formularza
Pole data w POST /api/v1/submissions zależy od claimType. Poniżej pełny zestaw pól każdego typu. Obiekt data jest walidowany ściśle - klucz spoza tabeli kończy się błędem 422, więc niczego nie trzeba zgadywać.
b2b_payment_missingBrak zapłaty za fakturęPozew o zapłatę za wykonaną usługę lub dostarczony towar. Dłużnikiem może być przedsiębiorca (spór gospodarczy) albo osoba fizyczna — o tym rozstrzyga pole `defendantType`, które przesądza podstawę odsetek i dopuszczalność rekompensaty za koszty odzyskiwania należności.
| Pole | Typ | Ograniczenia | Wymagane | Opis |
|---|---|---|---|---|
plaintiff | obiekt: strona | obiekt - pola w tabeli „Obiekt strony" | tak | Dane strony dochodzącej roszczenia (Twój klient końcowy). |
defendant | obiekt: strona | obiekt - pola w tabeli „Obiekt strony" | tak | Dane dłużnika / strony pozwanej. Przy dłużniku będącym firmą podaj NIP lub KRS, przy osobie fizycznej PESEL i adres zamieszkania. |
defendantType | wartość ze zbioru | "business" | "individual" (domyślnie "business") | nie | Kim jest pozwany: `business` (przedsiębiorca) albo `individual` (osoba fizyczna nieprowadząca działalności). Pominięcie pola oznacza `business`. Zalecamy podawać jawnie — od tego zależy podstawa odsetek i dopuszczalność rekompensaty 40/70/100 EUR. |
defendantPeselUnknown | true/false | true albo false | nie | Ustaw `true`, gdy pozwany jest osobą fizyczną, a jego numeru PESEL nie znasz. Brak PESEL nie blokuje sprawy — do pozwu trafia wniosek o ustalenie danych pozwanego przez sąd. |
claimAmount | kwota (PLN) | liczba (nie ujemna), maks. 999 999 999 | tak | Łączna dochodzona kwota należności głównej w PLN. |
claimInterest | true/false | true albo false | nie | Czy żądać odsetek za opóźnienie. Podstawę dobieramy do dłużnika: przy `business` odsetki ustawowe za opóźnienie w transakcjach handlowych, przy `individual` odsetki ustawowe za opóźnienie (art. 481 KC). |
claimBusinessCosts | true/false | true albo false | nie | Czy żądać rekompensaty za koszty odzyskiwania należności. Dopuszczalne wyłącznie przy `defendantType: "business"` — rekompensata przysługuje tylko w transakcjach handlowych między przedsiębiorcami. |
contractSubject | tekst | maks. 1000 znaków | tak | Krótki tytuł: czego dotyczyła współpraca. |
contractDescription | tekst (długi) | maks. 20 000 znaków | nie | Szczegółowy opis zakresu umowy i wykonanych prac/dostaw. |
contractDate | data (YYYY-MM-DD) | tekst w formacie YYYY-MM-DD | nie | Data zawarcia umowy (YYYY-MM-DD). |
paymentDue | data (YYYY-MM-DD) | tekst w formacie YYYY-MM-DD | nie | Data wymagalności zapłaty (YYYY-MM-DD). |
invoices | lista faktur | lista obiektów, maks. 100 pozycji | nie | Lista nieopłaconych faktur (kwota + termin). Suma nie musi równać się kwocie roszczenia. |
demandSent | true/false | true albo false | nie | Czy wysłano przedsądowe wezwanie do zapłaty. |
additionalInfo | tekst (długi) | maks. 20 000 znaków | nie | Dowolny kontekst pomocny przy redakcji pozwu. |
files | lista załączników | lista obiektów, maks. 10 plików | nie | Dokumenty sprawy: faktury, umowy, korespondencja. Trafiają do akt zlecenia i odczytujemy z nich treść przy redakcji pisma. Nie zastępują pól - kwoty i daty podawaj też jawnie. |
Przykładowy request
curl -X POST https://pozywacz.pl/api/v1/submissions \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"claimType": "b2b_payment_missing",
"data": {
"plaintiff": {
"name": "Przykład Sp. z o.o.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "5252525252"
},
"defendant": {
"name": "Dłużnik S.A.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "7010101010"
},
"defendantType": "business",
"defendantPeselUnknown": false,
"claimAmount": 12000,
"claimInterest": true,
"claimBusinessCosts": true,
"contractSubject": "Wykonanie instalacji elektrycznej",
"contractDescription": "Kompleksowe wykonanie instalacji elektrycznej w lokalu przy ul. ...",
"contractDate": "2026-01-15",
"paymentDue": "2026-05-10",
"invoices": [
{
"fileName": "FV 1/2026",
"amount": 12000,
"dueDate": "2026-05-10"
}
],
"demandSent": true,
"additionalInfo": "Dłużnik uznał dług mailowo w dniu ...",
"files": [
{
"fileId": "clx9f2k7b0001abcd"
}
]
}
}'Przykładowy request - dłużnik jest osobą fizyczną
{
"claimType": "b2b_payment_missing",
"data": {
"plaintiff": {
"name": "Przykład Sp. z o.o.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "5252525252"
},
"defendant": {
"name": "Jan Przykładowy",
"street": "ul. Kwiatowa",
"houseNumber": "5",
"apartmentNumber": "2",
"city": "Kraków",
"postalCode": "30-001",
"pesel": "90010112345"
},
"defendantType": "individual",
"defendantPeselUnknown": false,
"claimAmount": 12000,
"claimInterest": true,
"claimBusinessCosts": false,
"contractSubject": "Wykonanie instalacji elektrycznej",
"contractDescription": "Kompleksowe wykonanie instalacji elektrycznej w lokalu przy ul. ...",
"contractDate": "2026-01-15",
"paymentDue": "2026-05-10",
"invoices": [
{
"fileName": "FV 1/2026",
"amount": 12000,
"dueDate": "2026-05-10"
}
],
"demandSent": true,
"additionalInfo": "Dłużnik uznał dług mailowo w dniu ...",
"files": [
{
"fileId": "clx9f2k7b0001abcd"
}
]
}
}otherInna sprawaSprawa cywilna niebędąca typowym pozwem B2B o zapłatę. Opisz fakty możliwie dokładnie w polach tekstowych — generator dobierze formę pozwu.
| Pole | Typ | Ograniczenia | Wymagane | Opis |
|---|---|---|---|---|
plaintiff | obiekt: strona | obiekt - pola w tabeli „Obiekt strony" | tak | Dane strony dochodzącej roszczenia (Twój klient końcowy). |
defendant | obiekt: strona | obiekt - pola w tabeli „Obiekt strony" | tak | Dane dłużnika / strony pozwanej. Przy dłużniku będącym firmą podaj NIP lub KRS, przy osobie fizycznej PESEL i adres zamieszkania. |
claimAmount | kwota (PLN) | liczba (nie ujemna), maks. 999 999 999 | nie | Kwota roszczenia w PLN, jeśli sprawa jest majątkowa. |
contractSubject | tekst | maks. 1000 znaków | tak | Jednozdaniowe streszczenie sprawy. |
whatWentWrong | tekst (długi) | maks. 20 000 znaków | tak | Co się wydarzyło, na czym polega spór, czego oczekuje powód. |
additionalInfo | tekst (długi) | maks. 20 000 znaków | nie | Dodatkowy kontekst, dowody, przebieg korespondencji. |
files | lista załączników | lista obiektów, maks. 10 plików | nie | Dokumenty sprawy: faktury, umowy, korespondencja. Trafiają do akt zlecenia i odczytujemy z nich treść przy redakcji pisma. Nie zastępują pól - kwoty i daty podawaj też jawnie. |
Przykładowy request
curl -X POST https://pozywacz.pl/api/v1/submissions \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"claimType": "other",
"data": {
"plaintiff": {
"name": "Przykład Sp. z o.o.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "5252525252"
},
"defendant": {
"name": "Dłużnik S.A.",
"street": "ul. Przykładowa",
"houseNumber": "12",
"city": "Warszawa",
"postalCode": "00-001",
"nip": "7010101010"
},
"claimAmount": 8000,
"contractSubject": "Zwrot zaliczki za niewykonaną usługę",
"whatWentWrong": "Wykonawca pobrał zaliczkę i nie przystąpił do prac mimo upływu terminu...",
"additionalInfo": "Strony wymieniły korespondencję mailową w okresie ...",
"files": [
{
"fileId": "clx9f2k7b0001abcd"
}
]
}
}'Obiekt strony (plaintiff, defendant)
Pola typu „obiekt: strona” przyjmują wyłącznie poniższe klucze. Podawaj identyfikator właściwy dla rodzaju strony: firma - nip lub krs, osoba fizyczna - pesel.
| Pole | Ograniczenia | Wymagane | Opis |
|---|---|---|---|
name | tekst, maks. 300 znaków | tak | Imię i nazwisko albo pełna nazwa firmy. |
street | tekst, maks. 200 znaków | nie | Ulica (bez numeru). |
houseNumber | tekst, maks. 50 znaków | nie | Numer budynku. |
apartmentNumber | tekst, maks. 50 znaków | nie | Numer lokalu. |
city | tekst, maks. 150 znaków | nie | Miejscowość. |
postalCode | tekst, maks. 20 znaków | nie | Kod pocztowy, np. 00-001. |
nip | tekst, maks. 20 znaków | nie | NIP - identyfikator przedsiębiorcy. |
krs | tekst, maks. 20 znaków | nie | KRS - identyfikator spółki. Osoba fizyczna go nie ma. |
pesel | tekst, maks. 20 znaków | nie | PESEL - identyfikator osoby fizycznej. |
Obiekt faktury (invoices[])
Lista przyjmuje maksymalnie 100 pozycji. Suma kwot nie musi równać się polu claimAmount.
| Pole | Ograniczenia | Wymagane | Opis |
|---|---|---|---|
fileName | tekst, maks. 300 znaków | nie | Oznaczenie faktury, np. "FV 1/2026". Trafia do opisu dowodu w pozwie. |
amount | liczba (nie ujemna), maks. 999 999 999 | tak | Kwota faktury w PLN. |
dueDate | tekst w formacie YYYY-MM-DD | nie | Termin płatności (YYYY-MM-DD). |
Obiekt załącznika (files[])
Lista przyjmuje maksymalnie 10 plików, łącznie do 40 MB. Każdy element ma jeden z dwóch kształtów - albo referencja do pliku wgranego wcześniej, albo mały plik przesłany od razu:
[
{
"fileId": "clx9f2k7b0001abcd"
},
{
"name": "umowa.pdf",
"mimeType": "application/pdf",
"contentBase64": "JVBERi0xLjQK..."
}
]| Pole | Ograniczenia | Wymagane | Opis |
|---|---|---|---|
fileId | tekst, maks. 100 znaków | nie | Identyfikator pliku wgranego wcześniej przez POST /api/v1/files. Wyklucza się z name/mimeType/contentBase64. |
name | tekst, maks. 300 znaków | nie | Nazwa pliku - tylko przy przesyłaniu inline. |
mimeType | tekst, maks. 150 znaków | nie | Typ MIME pliku - tylko przy przesyłaniu inline. |
contentBase64 | tekst, maks. 1000 znaków | nie | Zawartość pliku w base64 - tylko przy przesyłaniu inline, do 2 MB. |
Wariant inline jest ograniczony do 2 MB, bo tyle mieści się w ciele pojedynczego żądania. Większe pliki wysyłaj przez POST /api/v1/files.
Załączniki
Do każdej sprawy możesz dołączyć dokumenty - faktury, umowy, korespondencję. Trafiają do akt zlecenia razem z przygotowanym pismem i odczytujemy z nich treść, gdy redagujemy dokument.
Jak dołączyć
- Wyślij plik do
POST /api/v1/filesi zapiszfileId. - Podaj go w polu
data.filesprzy składaniu sprawy.
Pliki do 2 MB możesz też przesłać od razu w zgłoszeniu, w postaci contentBase64, bez osobnego żądania.
Limity
| Limit | Wartość |
|---|---|
Rozmiar jednego pliku | 15 MB |
Liczba plików na zgłoszenie | 10 |
Łączny rozmiar na zgłoszenie | 40 MB |
Plik przesłany inline (base64) | 2 MB |
Czas życia pliku przed przypięciem | 24 h |
Obsługiwane typy | image/jpeg, image/png, image/webp, image/heic, image/gif, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, text/plain, text/csv |
Załączniki nie są dodatkowo płatne - mieszczą się w miesięcznym rozliczeniu Twojego konta.
Jak czytamy pliki
PDF-y z warstwą tekstową i pliki DOCX odczytujemy wprost, bez rozpoznawania obrazu. Skany i zdjęcia przepuszczamy przez rozpoznawanie tekstu, co daje wynik zauważalnie mniej pewny.
Praktyczna wskazówka: wysyłaj PDF generowany z systemu księgowego, a nie skan wydruku. Odczyta się pewniej, a dane w piśmie będą dokładniejsze.
Odczyt treści jest wsparciem, nie gwarancją - słaby skan może się nie odczytać. Kwoty, daty i dane stron podawaj zawsze także w polach data. To one są źródłem prawdy: nie nadpisujemy pól tym, co znaleźliśmy w załączniku.
Odbiór dokumentów
Po zwolnieniu zgłoszenia result.files[] zawiera wszystkie pliki sprawy - przygotowane pismo, instrukcję i Twoje załączniki - każdy z gotowym downloadUrl. Pobierasz je tym samym kluczem API.
Webhooki
Jeśli skonfigurujemy dla Ciebie adres webhooka, wyślemy na niego POST z wynikiem - ale dopiero po zamknięciu naszej kontroli. Wcześniej (status IN_REVIEW) nie wysyłamy żadnego webhooka. Treść jest podpisana Twoim sekretem:
X-Pozywacz-Signature: sha256=<hmac_sha256(webhookSecret, body)>Treść jest identyczna z odpowiedzią GET /api/v1/submissions/{id}, więc obie ścieżki obsłużysz jednym kodem. Opis wszystkich pól znajdziesz przy tym endpoincie.
| Nagłówek | Wartość |
|---|---|
Content-Type | application/json |
User-Agent | Pozywacz-Webhook/1 |
X-Pozywacz-Signature | sha256=<hex> - HMAC-SHA256 z surowego ciała żądania, liczony Twoim sekretem. Nagłówka nie ma, jeśli nie ustawiliśmy sekretu dla Twojego konta. |
Zweryfikuj podpis na surowym ciele żądania, zanim je sparsujesz - ponowne serializowanie JSON-a zmienia bajty i psuje porównanie:
const crypto = require('crypto');
// rawBody: Buffer/string dokładnie tak, jak przyszedł
function isFromPozywacz(rawBody, signatureHeader, webhookSecret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', webhookSecret)
.update(rawBody)
.digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(signatureHeader || '');
return a.length === b.length && crypto.timingSafeEqual(a, b);
}- Wysyłamy
POSTdopiero po zwolnieniu zgłoszenia z kontroli - przyCOMPLETED,FAILEDiREJECTED. W trakcie kontroli webhook nie leci nigdy. - Odpowiedz kodem
2xx, aby potwierdzić odbiór. Każda inna odpowiedź liczy się jako nieudana. - Czekamy na odpowiedź maksymalnie 10 sekund. Nie wykonuj ciężkiej pracy synchronicznie - przyjmij i przetwórz asynchronicznie.
- Ponawiamy do 5 prób łącznie.
- Ta sama sprawa może dotrzeć więcej niż raz - obsłuż odbiór idempotentnie po
submissionId. - Webhook jest opcjonalny i najlepiej traktować go jako przyspieszenie, nie jedyne źródło prawdy. Jeśli nie dotarł, stan zawsze uzgodnisz przez
GET /api/v1/submissions.
Limity i rozliczenia
- Rate limit - liczba zapytań na minutę, ustalana per konto (domyślnie 60/min).
- Kwota miesięczna - opcjonalny limit liczby zgłoszeń w miesiącu kalendarzowym. Po przekroczeniu zwracamy
429 quota_exceeded. - Rozliczenie - na podstawie liczby zgłoszeń, jedną fakturą zbiorczą miesięcznie na dane Twojej firmy (zgodnie z umową).
Jak uzyskać klucz API
Dostęp nadajemy indywidualnie po kontakcie. Napisz do nas, opisz swój przypadek użycia i przewidywany wolumen - ustalimy warunki, limity i skonfigurujemy webhook, a następnie przekażemy Ci klucz.
Napisz: help@pozywacz.plMasz już pytania techniczne? Skorzystaj z formularza kontaktowego.