Teraz na Pozywaczu

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.

  1. Ty

    POST /api/v1/submissions

    Wysyłasz dane sprawy. Walidujemy je od razu i odpowiadamy 202 z submissionId.

    RECEIVED
  2. Pozywacz

    Przygotowanie pisma

    Pracujemy nad dokumentem w tle. Twój request już dawno wrócił.

    GENERATING
  3. Pozywacz

    Kontrola po naszej stronie

    Gotowe pismo sprawdza człowiek. Do tego momentu result jest null i nie wysyłamy webhooka.

    IN_REVIEW
  4. Ty

    Webhook albo GET /submissions/{id}

    Powiadamiamy Cię sami albo odpytujesz status. Obie drogi zwracają tę samą strukturę.

    COMPLETED
  5. Ty

    GET /submissions/{id}/document

    Pobierasz gotowe pismo jako PDF, tym samym kluczem API.

    PDF

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 wolumenUstawiamy 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 fakturyRozliczamy się jedną zbiorczą fakturą miesięcznie.
Czy potrzebujesz konta testowegoMoż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 submissionId przy 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 data kończy się błędem 422, 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.pdf

Dokumenty 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łoszeniuTimeout po Twojej stronie nie oznacza, że sprawa nie została przyjęta. Bez klucza ponowienie tworzy duplikat.
Ponawianie tylko przy 5xx i 429Błędy 4xx (poza 429) są trwałe - ponowienie bez poprawy danych da ten sam wynik.
Obsługa statusu IN_REVIEWNie traktuj go jak błędu ani jak końca procesu. To normalny etap, w którym pismo czeka na naszą kontrolę.
Weryfikacja podpisu webhookaBez sprawdzenia X-Pozywacz-Signature Twój endpoint przyjmie dowolne żądanie, które ktoś na niego wyśle.
Zapisywanie errorCodePrzy FAILED i REJECTED to jedyna informacja, co poszło nie tak. Zapisz ją przy sprawie.
Klucz wyłącznie po stronie serweraKlucz 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/files przyjmuje multipart/form-data, inaczej niż pozostałe endpointy.
  • Zapominanie o defendantType. Pominięcie oznacza business. 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żywaj submissionId.

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

GET/api/v1/case-types

Zwraca 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ć.

Pola odpowiedzi
PoleZnaczenie
caseTypes[].claimTypeIdentyfikator typu sprawy - wysyłasz go w polu claimType.
caseTypes[].titleNazwa typu sprawy.
caseTypes[].descriptionOpis, czego dotyczy ten typ sprawy.
caseTypes[].fields[].nameNazwa klucza w obiekcie data.
caseTypes[].fields[].typeRodzaj pola: string, text, number, money, boolean, date, party, invoices, files, enum.
caseTypes[].fields[].requiredtrue, gdy pole jest obowiązkowe.
caseTypes[].fields[].labelEtykieta pola po polsku.
caseTypes[].fields[].descriptionOpis, co podać w polu.
caseTypes[].fields[].valuesTylko dla type = enum: lista dopuszczalnych wartości.
caseTypes[].fields[].defaultWartość przyjmowana, gdy pominiesz pole opcjonalne (jeśli dotyczy).
caseTypes[].exampleDataGotowy przykładowy obiekt data dla tego typu sprawy.
Response
{
  "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
        }
      ]
    }
  ]
}
POST/api/v1/submissions

Skł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łówki
NagłówekZnaczenie
AuthorizationWymagany. Bearer pk_live_...
Content-TypeWymagany. application/json
Idempotency-KeyOpcjonalny, 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.
Pola ciała żądania
PoleZnaczenie
claimTypeWymagane. Identyfikator typu sprawy z GET /case-types.
dataWymagane. 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.
Kody odpowiedzi
HTTPZnaczenie
202Zgłoszenie przyjęte i utworzone. Przygotowanie pozwu ruszyło w tle.
200Powtórzenie żądania z tym samym Idempotency-Key. Zwracamy wcześniej utworzone zgłoszenie, nic nowego nie powstaje.
400 / 403 / 422 / 429Błąd - patrz kody błędów.
Pola odpowiedzi
PoleZnaczenie
submissionIdIdentyfikator zgłoszenia. Używasz go w GET /submissions/{id} i rozpoznajesz po nim webhooka.
statusStatus początkowy, zawsze RECEIVED (przy powtórzeniu idempotentnym: aktualny status istniejącego zgłoszenia).
orderIdNasz wewnętrzny identyfikator zlecenia. Przydaje się w zgłoszeniach do wsparcia; może być null przez chwilę po utworzeniu.
Request
{
  "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"
      }
    ]
  }
}
Response
{
  "submissionId": "clx123abc...",
  "status": "RECEIVED",
  "orderId": "a1b2c3..."
}
GET/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.

Pola odpowiedzi
PoleZnaczenie
eventZawsze submission.updated. Ta sama struktura wraca w webhooku, więc obie ścieżki obsłużysz jednym kodem.
submissionIdIdentyfikator zgłoszenia.
claimTypeTyp sprawy, z jakim zgłoszenie zostało złożone.
statusJeden z: RECEIVED, GENERATING, IN_REVIEW, COMPLETED, FAILED, REJECTED - patrz cykl życia.
createdAtData przyjęcia zgłoszenia (ISO 8601, UTC).
completedAtData zakończenia (ISO 8601, UTC). null, dopóki zgłoszenie jest w toku lub w kontroli (IN_REVIEW).
errornull przy powodzeniu. Przy FAILED i REJECTED: obiekt { code, message } - patrz kody błędów.
resultnull, dopóki status nie jest COMPLETED - a więc także przez cały czas kontroli.
result.documentUrlLink 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.lawsuitHtmlTreść przygotowanego pisma w HTML - do zapisania przy sprawie w Twoim systemie.
Response
{
  "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>"
  }
}
GET/api/v1/submissions

Lista Twoich zgłoszeń (najnowsze pierwsze) z paginacją kursorową. Przydatna do uzgadniania stanu, gdy webhook nie dotarł.

Parametry zapytania
ParametrZnaczenie
statusOpcjonalny filtr statusu: RECEIVED, GENERATING, IN_REVIEW, COMPLETED, FAILED, REJECTED.
limitOpcjonalny. Liczba pozycji na stronę, domyślnie 25, maksymalnie 100. Wartości spoza zakresu przycinamy do granicy.
cursorOpcjonalny. Wartość nextCursor z poprzedniej odpowiedzi.
Pola odpowiedzi
PoleZnaczenie
items[]Zgłoszenia od najnowszego. Pozycja listy nie zawiera treści pozwu - po nią sięgnij przez GET /submissions/{id}.
items[].errorCodeKod błędu przy statusie FAILED lub REJECTED, w pozostałych przypadkach null.
nextCursorKursor następnej strony albo null, gdy to już ostatnia.
Response
{
  "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
}
POST/api/v1/files

Wgrywa 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łówki
NagłówekZnaczenie
AuthorizationWymagany. Bearer pk_live_...
Content-TypeWymagany. multipart/form-data - nie application/json, inaczej niż w pozostałych endpointach.
Pola ciała żądania
PoleZnaczenie
fileWymagane. 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.
Kody odpowiedzi
HTTPZnaczenie
201Plik przyjęty. Zapisz zwrócony fileId.
413file_too_large - plik przekracza 15 MB.
415unsupported_file_type - typ pliku nieobsługiwany albo nierozpoznany. Typ ustalamy z zawartości pliku, nie z deklarowanego nagłówka.
503storage_unavailable - magazyn dokumentów chwilowo niedostępny, ponów za chwilę.
Pola odpowiedzi
PoleZnaczenie
fileIdIdentyfikator pliku. Przypinasz go do sprawy jako { "fileId": "..." } w tablicy data.files.
expiresAtDo kiedy plik czeka na przypięcie. Nieużyty plik kasujemy po 24 h - wgraj go ponownie, jeśli minie.
extraction.statusok - treść odczytana od razu. pending - plik wygląda na skan, treść odczytamy przy przygotowaniu pisma. To nie jest błąd.
extraction.sourceSkąd wzięliśmy tekst: pdf-text, docx albo cache (identyczny plik był już czytany).
extraction.charsLiczba odczytanych znaków. Zero przy statusie pending.
Response
{
  "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
  }
}
GET/api/v1/submissions/{id}/document

Pobiera gotowe pismo jako PDF. Ten sam klucz API co reszta endpointów - nie musisz nic dodatkowo udostępniać ani logować się do Google.

Parametry zapytania
ParametrZnaczenie
dispositionOpcjonalny. inline pokazuje plik w przeglądarce zamiast go pobierać - przydatne, gdy osadzasz podgląd we własnym panelu. Domyślnie attachment.
Kody odpowiedzi
HTTPZnaczenie
200Strumień pliku PDF.
404not_found - zgłoszenie nie istnieje albo nie należy do Twojego konta.
409not_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.

statusCo oznaczaCo robi Twój system
RECEIVEDZgłoszenie przyjęte i zwalidowane, czeka na przetworzenie.Zapisz submissionId przy sprawie i czekaj.
GENERATINGTrwa przygotowanie pozwu.Nic - status zmieni się sam.
IN_REVIEWZgł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.
COMPLETEDPozew sprawdzony i wydany, dane w polu result.Zapisz treść i link, skieruj sprawę do akceptacji przez człowieka.
FAILEDPrzygotowanie nie powiodło się, szczegóły w error.Oznacz sprawę do obsługi ręcznej i skontaktuj się z nami.
REJECTEDZgłoszenie odrzucone po kontroli - pozwu nie wydajemy.Oznacz sprawę do obsługi ręcznej i skontaktuj się z nami.

Kody błędów

HTTPcodeZnaczenieCo zrobić
400invalid_jsonCiało żądania nie jest poprawnym JSON-em.Popraw request. Nie ponawiaj bez zmian.
400invalid_claim_typeBrak pola claimType albo wartość spoza listy obsługiwanych typów.Sprawdź GET /case-types.
400invalid_dataBrak obiektu data albo nie jest obiektem.Popraw strukturę żądania.
401missing_credentialsBrak nagłówka Authorization.Dodaj nagłówek z kluczem.
401invalid_keyKlucz ma zły format albo nie istnieje.Sprawdź, czy wysyłasz pełny klucz.
401key_revokedKlucz został unieważniony.Użyj aktualnego klucza.
401key_expiredKlucz wygasł.Poproś nas o nowy klucz.
403claim_type_forbiddenTwoje konto nie ma uprawnień do tego typu sprawy.Napisz do nas, rozszerzymy uprawnienia.
403client_suspendedKonto zawieszone.Skontaktuj się z nami.
404not_foundZgłoszenie nie istnieje albo należy do innego konta.Sprawdź submissionId.
422validation_failedPola 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.
429rate_limitedPrzekroczona liczba zapytań na minutę.Odczekaj i ponów z tym samym Idempotency-Key.
429quota_exceededWyczerpany miesięczny limit zgłoszeń.Skontaktuj się z nami w sprawie limitu.
409not_readyDokument zamówiony przed zakończeniem kontroli zgłoszenia.Poczekaj na status COMPLETED albo na webhooka.
409no_documentZgłoszenie nie ma dokumentu do pobrania.Sprawdź status i error zgłoszenia.
413file_too_largeZałącznik przekracza dopuszczalny rozmiar.Zmniejsz plik albo podziel dokumentację.
415unsupported_file_typeTyp pliku nieobsługiwany albo nierozpoznany po zawartości.Prześlij PDF, DOCX albo obraz - lista w sekcji Załączniki.
502 / 503upload_failed, storage_unavailable, document_unavailableChwilowy 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.

PoleTypOgraniczeniaWymaganeOpis
plaintiffobiekt: stronaobiekt - pola w tabeli „Obiekt strony"takDane strony dochodzącej roszczenia (Twój klient końcowy).
defendantobiekt: stronaobiekt - pola w tabeli „Obiekt strony"takDane dłużnika / strony pozwanej. Przy dłużniku będącym firmą podaj NIP lub KRS, przy osobie fizycznej PESEL i adres zamieszkania.
defendantTypewartość ze zbioru"business" | "individual" (domyślnie "business")nieKim 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.
defendantPeselUnknowntrue/falsetrue albo falsenieUstaw `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.
claimAmountkwota (PLN)liczba (nie ujemna), maks. 999 999 999takŁączna dochodzona kwota należności głównej w PLN.
claimInteresttrue/falsetrue albo falsenieCzy żą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).
claimBusinessCoststrue/falsetrue albo falsenieCzy żą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.
contractSubjecttekstmaks. 1000 znakówtakKrótki tytuł: czego dotyczyła współpraca.
contractDescriptiontekst (długi)maks. 20 000 znakównieSzczegółowy opis zakresu umowy i wykonanych prac/dostaw.
contractDatedata (YYYY-MM-DD)tekst w formacie YYYY-MM-DDnieData zawarcia umowy (YYYY-MM-DD).
paymentDuedata (YYYY-MM-DD)tekst w formacie YYYY-MM-DDnieData wymagalności zapłaty (YYYY-MM-DD).
invoiceslista fakturlista obiektów, maks. 100 pozycjinieLista nieopłaconych faktur (kwota + termin). Suma nie musi równać się kwocie roszczenia.
demandSenttrue/falsetrue albo falsenieCzy wysłano przedsądowe wezwanie do zapłaty.
additionalInfotekst (długi)maks. 20 000 znakównieDowolny kontekst pomocny przy redakcji pozwu.
fileslista załącznikówlista obiektów, maks. 10 plikównieDokumenty 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 sprawa

Sprawa cywilna niebędąca typowym pozwem B2B o zapłatę. Opisz fakty możliwie dokładnie w polach tekstowych — generator dobierze formę pozwu.

PoleTypOgraniczeniaWymaganeOpis
plaintiffobiekt: stronaobiekt - pola w tabeli „Obiekt strony"takDane strony dochodzącej roszczenia (Twój klient końcowy).
defendantobiekt: stronaobiekt - pola w tabeli „Obiekt strony"takDane dłużnika / strony pozwanej. Przy dłużniku będącym firmą podaj NIP lub KRS, przy osobie fizycznej PESEL i adres zamieszkania.
claimAmountkwota (PLN)liczba (nie ujemna), maks. 999 999 999nieKwota roszczenia w PLN, jeśli sprawa jest majątkowa.
contractSubjecttekstmaks. 1000 znakówtakJednozdaniowe streszczenie sprawy.
whatWentWrongtekst (długi)maks. 20 000 znakówtakCo się wydarzyło, na czym polega spór, czego oczekuje powód.
additionalInfotekst (długi)maks. 20 000 znakównieDodatkowy kontekst, dowody, przebieg korespondencji.
fileslista załącznikówlista obiektów, maks. 10 plikównieDokumenty 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.

PoleOgraniczeniaWymaganeOpis
nametekst, maks. 300 znakówtakImię i nazwisko albo pełna nazwa firmy.
streettekst, maks. 200 znakównieUlica (bez numeru).
houseNumbertekst, maks. 50 znakównieNumer budynku.
apartmentNumbertekst, maks. 50 znakównieNumer lokalu.
citytekst, maks. 150 znakównieMiejscowość.
postalCodetekst, maks. 20 znakównieKod pocztowy, np. 00-001.
niptekst, maks. 20 znakównieNIP - identyfikator przedsiębiorcy.
krstekst, maks. 20 znakównieKRS - identyfikator spółki. Osoba fizyczna go nie ma.
peseltekst, maks. 20 znakówniePESEL - identyfikator osoby fizycznej.

Obiekt faktury (invoices[])

Lista przyjmuje maksymalnie 100 pozycji. Suma kwot nie musi równać się polu claimAmount.

PoleOgraniczeniaWymaganeOpis
fileNametekst, maks. 300 znakównieOznaczenie faktury, np. "FV 1/2026". Trafia do opisu dowodu w pozwie.
amountliczba (nie ujemna), maks. 999 999 999takKwota faktury w PLN.
dueDatetekst w formacie YYYY-MM-DDnieTermin 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..."
  }
]
PoleOgraniczeniaWymaganeOpis
fileIdtekst, maks. 100 znakównieIdentyfikator pliku wgranego wcześniej przez POST /api/v1/files. Wyklucza się z name/mimeType/contentBase64.
nametekst, maks. 300 znakównieNazwa pliku - tylko przy przesyłaniu inline.
mimeTypetekst, maks. 150 znakównieTyp MIME pliku - tylko przy przesyłaniu inline.
contentBase64tekst, maks. 1000 znakównieZawartość 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ć

  1. Wyślij plik do POST /api/v1/files i zapisz fileId.
  2. Podaj go w polu data.files przy składaniu sprawy.

Pliki do 2 MB możesz też przesłać od razu w zgłoszeniu, w postaci contentBase64, bez osobnego żądania.

Limity

LimitWartość
Rozmiar jednego pliku15 MB
Liczba plików na zgłoszenie10
Łączny rozmiar na zgłoszenie40 MB
Plik przesłany inline (base64)2 MB
Czas życia pliku przed przypięciem24 h
Obsługiwane typyimage/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łówki, które wysyłamy
NagłówekWartość
Content-Typeapplication/json
User-AgentPozywacz-Webhook/1
X-Pozywacz-Signaturesha256=<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);
}
Zasady dostarczania
  • Wysyłamy POST dopiero po zwolnieniu zgłoszenia z kontroli - przy COMPLETED, FAILED i REJECTED. 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.pl

Masz już pytania techniczne? Skorzystaj z formularza kontaktowego.