Dokumentacja API — Pisma Szyte Na Miarę

Darmowy generator dokumentów online. REST API generujące umowy, pisma prawne i wnioski jako pliki PDF. Bez rejestracji, bez kluczy API, bez opłat. Wystarczy jedno zapytanie HTTP.

API obsługuje 11 szablonów dokumentów w trzech kategoriach: umowy, pisma i wnioski. Każdy szablon posiada zdefiniowane pola formularza z walidacją, polami warunkowymi i wartościami domyślnymi.

Adres bazowy: https://pismoszytenamiare.pl/api/v1

Uwierzytelnianie

API nie wymaga uwierzytelniania. Jest całkowicie darmowe i otwarte dla każdego. Wystarczy wysyłać zapytania HTTP do endpointów poniżej.

GET /api/v1/templates

GET /api/v1/templates

Pobierz listę wszystkich dostępnych szablonów dokumentów. Opcjonalnie filtruj po kategorii.

Parametry zapytania

ParametrTypWymaganyOpis
category string opcjonalny Filtruj po kategorii: "umowy", "pisma" lub "wnioski"

Przykładowe zapytanie

cURL
curl "https://pismoszytenamiare.pl/api/v1/templates"

curl "https://pismoszytenamiare.pl/api/v1/templates?category=umowy"

Przykładowa odpowiedź

200 OK
{
  "status": "success",
  "count": 11,
  "data": [
    {
      "id": "umowa-najmu",
      "name": "Rental Agreement",
      "namePl": "Umowa najmu",
      "category": "umowy",
      "categoryPl": "Umowy",
      "description": "Standard rental/lease agreement",
      "descriptionPl": "Standardowa umowa najmu lokalu",
      "fieldCount": 13
    },
    {
      "id": "umowa-najmu-okazjonalny",
      "name": "Occasional Rental Agreement",
      "namePl": "Umowa najmu okazjonalnego",
      "category": "umowy",
      "categoryPl": "Umowy",
      "description": "Occasional rental agreement (Art. 19a)",
      "descriptionPl": "Umowa najmu okazjonalnego (Art. 19a)",
      "fieldCount": 16
    },
    {
      "id": "umowa-o-prace",
      "name": "Employment Contract",
      "namePl": "Umowa o pracę",
      "category": "umowy",
      "categoryPl": "Umowy",
      "description": "Standard employment contract",
      "descriptionPl": "Standardowa umowa o pracę",
      "fieldCount": 14
    }
  ]
}

GET /api/v1/templates/:templateId

GET /api/v1/templates/:templateId

Pobierz pełny schemat szablonu z definicją pól formularza. Użyj tego endpointu, aby poznać wymagane pola przed wygenerowaniem dokumentu.

Parametry ścieżki

ParametrTypWymaganyOpis
templateId string wymagany Identyfikator szablonu, np. "umowa-najmu"

Przykładowe zapytanie

cURL
curl "https://pismoszytenamiare.pl/api/v1/templates/umowa-najmu"

Przykładowa odpowiedź

200 OK
{
  "status": "success",
  "data": {
    "id": "umowa-najmu",
    "name": "Rental Agreement",
    "namePl": "Umowa najmu",
    "category": "umowy",
    "categoryPl": "Umowy",
    "description": "Standard rental/lease agreement",
    "descriptionPl": "Standardowa umowa najmu lokalu",
    "fields": [
      {
        "name": "landlordName",
        "label": "Imię i nazwisko wynajmującego",
        "type": "text",
        "required": true,
        "placeholder": "Jan Kowalski"
      },
      {
        "name": "landlordAddress",
        "label": "Adres wynajmującego",
        "type": "textarea",
        "required": true,
        "placeholder": "ul. Przykładowa 1, 00-001 Warszawa"
      },
      {
        "name": "landlordPesel",
        "label": "PESEL wynajmującego",
        "type": "text",
        "required": true,
        "placeholder": "12345678901"
      },
      {
        "name": "tenantName",
        "label": "Imię i nazwisko najemcy",
        "type": "text",
        "required": true,
        "placeholder": "Anna Nowak"
      },
      {
        "name": "propertyAddress",
        "label": "Adres lokalu",
        "type": "textarea",
        "required": true,
        "placeholder": "ul. Mieszkalna 5/3, 00-002 Warszawa"
      },
      {
        "name": "rentAmount",
        "label": "Kwota czynszu (PLN)",
        "type": "number",
        "required": true,
        "placeholder": "2500"
      },
      {
        "name": "startDate",
        "label": "Data rozpoczęcia",
        "type": "date",
        "required": true
      },
      {
        "name": "endDate",
        "label": "Data zakończenia",
        "type": "date",
        "required": false
      },
      {
        "name": "depositAmount",
        "label": "Kaucja (PLN)",
        "type": "number",
        "required": false,
        "defaultValue": "0"
      },
      {
        "name": "paymentDay",
        "label": "Dzień płatności",
        "type": "number",
        "required": true,
        "placeholder": "10",
        "defaultValue": "10"
      },
      {
        "name": "includeInventory",
        "label": "Dołącz protokół zdawczo-odbiorczy",
        "type": "checkbox",
        "required": false,
        "defaultValue": false
      },
      {
        "name": "inventoryItems",
        "label": "Elementy wyposażenia",
        "type": "textarea",
        "required": false,
        "condition": "includeInventory === true",
        "placeholder": "Lodówka, pralka, kuchenka..."
      },
      {
        "name": "additionalTerms",
        "label": "Dodatkowe postanowienia",
        "type": "textarea",
        "required": false
      }
    ]
  }
}

Typy pól formularza

TypOpisPrzykład
text Jednowierszowe pole tekstowe Imię i nazwisko, PESEL, NIP
textarea Wielowierszowe pole tekstowe Adres, opis, uwagi
date Data w formacie YYYY-MM-DD Data rozpoczęcia, data zawarcia
number Wartość liczbowa Kwota czynszu, kaucja
select Wybór z listy opcji Typ umowy, rodzaj wypowiedzenia
checkbox Pole logiczne (tak/nie) Dołącz załącznik, zgódź się na warunki

POST /api/v1/documents/generate

POST /api/v1/documents/generate

Wygeneruj dokument PDF na podstawie wybranego szablonu i danych formularza. Odpowiedź zawiera plik binarny PDF.

Nagłówki

NagłówekWartość
Content-Type application/json

Treść zapytania (JSON)

PoleTypWymaganyOpis
templateId string wymagany Identyfikator szablonu (np. "umowa-najmu")
data object wymagany Obiekt z wartościami pól formularza (klucze odpowiadają name z definicji pól)

Przykładowe zapytanie

cURL
curl -X POST "https://pismoszytenamiare.pl/api/v1/documents/generate" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "umowa-najmu",
    "data": {
      "landlordName": "Jan Kowalski",
      "landlordAddress": "ul. Przykładowa 1, 00-001 Warszawa",
      "landlordPesel": "85010112345",
      "tenantName": "Anna Nowak",
      "propertyAddress": "ul. Mieszkalna 5/3, 00-002 Warszawa",
      "rentAmount": 2500,
      "startDate": "2026-03-01",
      "endDate": "2027-02-28",
      "depositAmount": 5000,
      "paymentDay": 10,
      "includeInventory": false
    }
  }' --output umowa-najmu.pdf

Odpowiedź

NagłówekWartość
Content-Type application/pdf
Content-Disposition attachment; filename="umowa-najmu.pdf"

Odpowiedź to binarny plik PDF. Zapisz go do pliku używając --output w cURL lub obsłuż blob w JavaScript.

Błędy

400 Bad Request
{
  "status": "error",
  "error": "Brakujące wymagane pola",
  "message": "Następujące pola są wymagane: landlordName, tenantName, rentAmount",
  "missingFields": ["landlordName", "tenantName", "rentAmount"]
}
404 Not Found
{
  "status": "error",
  "error": "Nie znaleziono szablonu",
  "message": "Szablon o identyfikatorze 'nieistniejacy-szablon' nie istnieje"
}

POST /api/v1/documents/preview

POST /api/v1/documents/preview

Podgląd dokumentu bez generowania pliku PDF. Zwraca strukturę dokumentu w formacie JSON z podziałem na sekcje. Użyteczne do walidacji danych przed wygenerowaniem PDF.

Treść zapytania (JSON)

Identyczna jak w endpointcie POST /documents/generate — pola templateId i data.

Przykładowe zapytanie

cURL
curl -X POST "https://pismoszytenamiare.pl/api/v1/documents/preview" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "umowa-najmu",
    "data": {
      "landlordName": "Jan Kowalski",
      "landlordAddress": "ul. Przykładowa 1, 00-001 Warszawa",
      "landlordPesel": "85010112345",
      "tenantName": "Anna Nowak",
      "propertyAddress": "ul. Mieszkalna 5/3, 00-002 Warszawa",
      "rentAmount": 2500,
      "startDate": "2026-03-01",
      "paymentDay": 10
    }
  }'

Przykładowa odpowiedź

200 OK
{
  "status": "success",
  "data": {
    "templateId": "umowa-najmu",
    "templateName": "Umowa najmu",
    "generatedAt": "2026-02-27T12:00:00.000Z",
    "sections": [
      {
        "title": "Nagłówek",
        "content": "UMOWA NAJMU LOKALU MIESZKALNEGO"
      },
      {
        "title": "Strony umowy",
        "content": "Zawarta w dniu 2026-03-01 pomiędzy:\n1. Jan Kowalski, zamieszkały/a: ul. Przykładowa 1, 00-001 Warszawa, PESEL: 85010112345 (Wynajmujący)\n2. Anna Nowak (Najemca)"
      },
      {
        "title": "Przedmiot umowy",
        "content": "Wynajmujący oddaje Najemcy do używania lokal mieszkalny położony pod adresem: ul. Mieszkalna 5/3, 00-002 Warszawa"
      },
      {
        "title": "Czynsz",
        "content": "Najemca zobowiązuje się płacić czynsz w wysokości 2500 PLN miesięcznie, do 10. dnia każdego miesiąca."
      }
    ]
  }
}

Lista szablonów (11)

Poniżej znajduje się pełna lista dostępnych szablonów dokumentów, pogrupowanych według kategorii.

Umowy (6 szablonów)

ID szablonuNazwaOpisPola
umowa-najmu Umowa najmu Standardowa umowa najmu lokalu mieszkalnego. Zawiera dane stron, adres lokalu, kwotę czynszu, datę rozpoczęcia, kaucję, opcjonalny protokół zdawczo-odbiorczy. 13
umowa-najmu-okazjonalny Umowa najmu okazjonalnego Umowa najmu okazjonalnego zgodna z Art. 19a ustawy o ochronie praw lokatorów. Wymaga oświadczenia notarialnego najemcy o poddaniu się egzekucji oraz wskazania lokalu zastępczego. 16
umowa-o-prace Umowa o pracę Standardowa umowa o pracę na czas określony lub nieokreślony. Dane pracodawcy i pracownika, stanowisko, wynagrodzenie, wymiar czasu pracy, miejsce wykonywania pracy. 14
umowa-zlecenie Umowa zlecenie Umowa zlecenie (umowa cywilnoprawna). Dane zleceniodawcy i zleceniobiorcy, zakres zlecenia, wynagrodzenie, termin wykonania. 12
umowa-o-dzielo Umowa o dzieło Umowa o dzieło z określonym rezultatem. Dane zamawiającego i wykonawcy, opis dzieła, wynagrodzenie, termin oddania, prawa autorskie. 11
umowa-kupna-sprzedazy Umowa kupna-sprzedaży Ogólna umowa kupna-sprzedaży rzeczy ruchomych. Dane sprzedawcy i kupującego, opis przedmiotu, cena, sposób płatności, data wydania. 12

Pisma (3 szablony)

ID szablonuNazwaOpisPola
wypowiedzenie Wypowiedzenie umowy Pismo wypowiadające umowę (najmu, pracy, usługi, ubezpieczenia itp.). Dane nadawcy i adresata, numer umowy, data zawarcia, powód wypowiedzenia, okres wypowiedzenia. 10
reklamacja Reklamacja Pismo reklamacyjne dotyczące towaru lub usługi. Dane reklamującego, dane sprzedawcy, opis produktu/usługi, opis wady, żądanie (wymiana, naprawa, zwrot). 11
wezwanie-do-zaplaty Wezwanie do zapłaty Przedsądowe wezwanie do zapłaty. Dane wierzyciela i dłużnika, kwota zaległości, tytuł zobowiązania, termin zapłaty, numer konta bankowego, informacja o konsekwencjach prawnych. 12

Wnioski (2 szablony)

ID szablonuNazwaOpisPola
pelnomocnictwo Pełnomocnictwo Pełnomocnictwo ogólne lub szczególne. Dane mocodawcy i pełnomocnika, zakres umocowania, data ważności, możliwość substytucji. 9
oswiadczenie Oświadczenie Ogólne oświadczenie pisemne. Dane oświadczającego, treść oświadczenia, cel złożenia, data, podpis. 7

Format odpowiedzi

Endpointy JSON zwracają odpowiedzi w ustandaryzowanym formacie. Endpoint /documents/generate zwraca binarny PDF.

Odpowiedź sukcesu (JSON)

200 OK
{
  "status": "success",
  "data": { ... },
  "count": 11
}

Odpowiedź błędu

4xx / 5xx
{
  "status": "error",
  "error": "Krótki opis błędu",
  "message": "Szczegółowy opis problemu z informacją jak go rozwiązać"
}

Kody błędów

StatusZnaczenieKiedy występuje
400 Bad Request — Nieprawidłowe zapytanie Brakujące wymagane pola, nieprawidłowy format danych, brak templateId lub data w treści zapytania
404 Not Found — Nie znaleziono Nieprawidłowy templateId, nieistniejący endpoint
429 Too Many Requests — Zbyt wiele zapytań Przekroczony limit zapytań (30/min ogólne lub 10/min generowanie PDF)
500 Internal Server Error — Błąd serwera Nieoczekiwany błąd po stronie serwera. Jeśli się powtarza, zgłoś problem.

Limity zapytań

API stosuje ograniczenia liczby zapytań w celu zapewnienia stabilności usługi:

LimitWartośćOpis
Ogólny limit 30 zapytań/min Dotyczy wszystkich endpointów (GET i POST) na adres IP
Generowanie PDF 10 zapytań/min Dotyczy endpointu POST /documents/generate na adres IP
Okno czasowe 60 sekund Przesuwne okno czasowe (sliding window)

Po przekroczeniu limitu API zwraca status 429 z nagłówkiem Retry-After.

Nagłówki limitowania są dołączane do każdej odpowiedzi: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset.

Przykłady cURL

terminal
# Lista wszystkich szablonów
curl "https://pismoszytenamiare.pl/api/v1/templates"

# Szablony tylko z kategorii "umowy"
curl "https://pismoszytenamiare.pl/api/v1/templates?category=umowy"

# Pobierz schemat szablonu umowy najmu
curl "https://pismoszytenamiare.pl/api/v1/templates/umowa-najmu"

# Wygeneruj umowę najmu jako PDF
curl -X POST "https://pismoszytenamiare.pl/api/v1/documents/generate" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "umowa-najmu",
    "data": {
      "landlordName": "Jan Kowalski",
      "landlordAddress": "ul. Przykładowa 1, 00-001 Warszawa",
      "landlordPesel": "85010112345",
      "tenantName": "Anna Nowak",
      "propertyAddress": "ul. Mieszkalna 5/3, 00-002 Warszawa",
      "rentAmount": 2500,
      "startDate": "2026-03-01",
      "endDate": "2027-02-28",
      "depositAmount": 5000,
      "paymentDay": 10,
      "includeInventory": false
    }
  }' --output umowa-najmu.pdf

# Podgląd dokumentu (JSON)
curl -X POST "https://pismoszytenamiare.pl/api/v1/documents/preview" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "wezwanie-do-zaplaty",
    "data": {
      "creditorName": "Firma ABC Sp. z o.o.",
      "debtorName": "XYZ Jan Nowak",
      "amount": 15000,
      "currency": "PLN",
      "dueDate": "2026-01-15",
      "paymentDeadline": "2026-03-15",
      "bankAccount": "PL 12 3456 7890 1234 5678 9012 3456"
    }
  }'

Przykłady JavaScript

app.js
const BASE_URL = 'https://pismoszytenamiare.pl/api/v1';

// Lista wszystkich szablonów
const templatesRes = await fetch(`${BASE_URL}/templates`);
const templates = await templatesRes.json();
console.log(`Dostępne szablony: ${templates.count}`);

// Pobierz schemat szablonu
const schemaRes = await fetch(`${BASE_URL}/templates/umowa-najmu`);
const schema = await schemaRes.json();
console.log('Pola formularza:', schema.data.fields);

// Wygeneruj PDF umowy najmu
const pdfRes = await fetch(`${BASE_URL}/documents/generate`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    templateId: 'umowa-najmu',
    data: {
      landlordName: 'Jan Kowalski',
      landlordAddress: 'ul. Przykładowa 1, 00-001 Warszawa',
      landlordPesel: '85010112345',
      tenantName: 'Anna Nowak',
      propertyAddress: 'ul. Mieszkalna 5/3, 00-002 Warszawa',
      rentAmount: 2500,
      startDate: '2026-03-01',
      endDate: '2027-02-28',
      depositAmount: 5000,
      paymentDay: 10,
      includeInventory: false
    }
  })
});

// Zapisz PDF (Node.js)
const fs = await import('fs');
const buffer = Buffer.from(await pdfRes.arrayBuffer());
fs.writeFileSync('umowa-najmu.pdf', buffer);
console.log('PDF zapisany: umowa-najmu.pdf');

// Lub pobierz w przeglądarce
const blob = await pdfRes.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'umowa-najmu.pdf';
a.click();

// Podgląd dokumentu (JSON)
const previewRes = await fetch(`${BASE_URL}/documents/preview`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    templateId: 'umowa-najmu',
    data: {
      landlordName: 'Jan Kowalski',
      tenantName: 'Anna Nowak',
      propertyAddress: 'ul. Mieszkalna 5/3',
      rentAmount: 2500,
      startDate: '2026-03-01',
      paymentDay: 10
    }
  })
});
const preview = await previewRes.json();
console.log('Sekcje dokumentu:', preview.data.sections);

Przykłady Python

main.py
import requests

BASE_URL = "https://pismoszytenamiare.pl/api/v1"

# Lista wszystkich szablonów
response = requests.get(f"{BASE_URL}/templates")
templates = response.json()
print(f"Dostępne szablony: {templates['count']}")

# Filtruj szablony po kategorii
response = requests.get(f"{BASE_URL}/templates", params={"category": "umowy"})
umowy = response.json()
for t in umowy["data"]:
    print(f"  - {t['id']}: {t['namePl']}")

# Pobierz schemat szablonu
response = requests.get(f"{BASE_URL}/templates/umowa-najmu")
schema = response.json()
for field in schema["data"]["fields"]:
    req = "wymagane" if field["required"] else "opcjonalne"
    print(f"  {field['name']} ({field['type']}) - {req}")

# Wygeneruj PDF umowy najmu
response = requests.post(
    f"{BASE_URL}/documents/generate",
    json={
        "templateId": "umowa-najmu",
        "data": {
            "landlordName": "Jan Kowalski",
            "landlordAddress": "ul. Przykładowa 1, 00-001 Warszawa",
            "landlordPesel": "85010112345",
            "tenantName": "Anna Nowak",
            "propertyAddress": "ul. Mieszkalna 5/3, 00-002 Warszawa",
            "rentAmount": 2500,
            "startDate": "2026-03-01",
            "endDate": "2027-02-28",
            "depositAmount": 5000,
            "paymentDay": 10,
            "includeInventory": False,
        },
    },
)

# Zapisz PDF do pliku
with open("umowa-najmu.pdf", "wb") as f:
    f.write(response.content)
print("PDF zapisany: umowa-najmu.pdf")

# Podgląd dokumentu (JSON)
response = requests.post(
    f"{BASE_URL}/documents/preview",
    json={
        "templateId": "reklamacja",
        "data": {
            "complainantName": "Piotr Wiśniewski",
            "sellerName": "Sklep Elektroniczny Sp. z o.o.",
            "productName": "Laptop Model X200",
            "purchaseDate": "2026-01-10",
            "defectDescription": "Ekran migocze po 5 minutach użytkowania",
            "demand": "wymiana",
        },
    },
)
preview = response.json()
for section in preview["data"]["sections"]:
    print(f"\n--- {section['title']} ---")
    print(section["content"])

Integracja MCP (Claude Desktop)

Pisma Szyte Na Miarę obsługuje Model Context Protocol (MCP), co pozwala asystentom AI takim jak Claude, VS Code Copilot, Cursor i innym klientom MCP korzystać z API jako narzędzia. Poproś Claude: "Wygeneruj umowę najmu dla Jana Kowalskiego", a dokument PDF zostanie automatycznie utworzony.

Instalacja

Dodaj tę konfigurację do pliku klienta MCP (np. claude_desktop_config.json):

claude_desktop_config.json
{
  "mcpServers": {
    "pismoszytenamiare": {
      "command": "npx",
      "args": ["-y", "pismoszytenamiare-mcp"]
    }
  }
}

Dostępne narzędzia MCP

NarzędzieOpisParametry
list_templates Pobierz listę dostępnych szablonów category (opcjonalny)
get_template Pobierz schemat szablonu z definicją pól templateId (wymagany)
generate_document Wygeneruj dokument PDF templateId (wymagany), data (wymagany)
preview_document Podgląd struktury dokumentu templateId (wymagany), data (wymagany)

Przykład użycia z Claude

Rozmowa z Claude
Użytkownik: Wygeneruj umowę najmu. Wynajmujący: Jan Kowalski,
ul. Polna 5, Warszawa, PESEL 85010112345. Najemca: Anna Nowak.
Lokal: ul. Krótka 3/2, Warszawa. Czynsz: 3000 PLN, od 1 marca 2026.

Claude: Generuję umowę najmu z podanymi danymi...
[Używa narzędzia generate_document]
Umowa najmu została wygenerowana. Oto plik PDF do pobrania.

Zmienne środowiskowe

ZmiennaWartość domyślnaOpis
PISMOSZYTENAMIARE_BASE_URL https://pismoszytenamiare.pl Nadpisz bazowy adres URL API (np. dla instancji lokalnej)
Część ekosystemu SoftVoyagers