Domena API
test.ksefapi.dev, demo.ksefapi.dev, real.ksefapi.dev
Środowiska testowe, demo i produkcyjne.
Wysyłasz prosty JSON, a KSeF API przejmuje walidację, generowanie XML, wysyłkę i statusy faktur w środowisku testowym, demo i produkcyjnym.
Kontakt: [email protected]
Domena API
test.ksefapi.dev, demo.ksefapi.dev, real.ksefapi.dev
Środowiska testowe, demo i produkcyjne.
Autoryzacja
Bearer Token
Nagłówek: Authorization: Bearer KSEF_API_TOKEN (token przypisany do danej domeny API).
Format danych
application/json
Wszystkie requesty i odpowiedzi w JSON.
test.ksefapi.dev lub demo.ksefapi.dev, do produkcji real.ksefapi.dev).POST /api/company (do rejestracji możesz użyć dowolnej domeny API).POST /api/company/confirm i odbierz ksef_api_tokens dla środowisk test, demo, real.PATCH /api/ksef_auth_tokens, autoryzując się tokenem API dla wybranej domeny.POST /api/invoices.GET /api/invoices/:process_id.API rozpoznaje środowisko po domenie i przekazuje żądania do odpowiedniego środowiska KSeF.
Komunikuje się ze środowiskiem testowym KSeF.
Otwórz środowisko testowe KSeFKomunikuje się ze środowiskiem demo KSeF.
Otwórz środowisko demo KSeFKomunikuje się ze środowiskiem produkcyjnym KSeF.
Otwórz środowisko produkcyjne KSeFChronione endpointy wymagają nagłówka Bearer Token.
Authorization: Bearer KSEF_API_TOKEN
Używaj tokenu API dopasowanego do domeny: test.ksefapi.dev -> ksef_api_tokens.test, demo.ksefapi.dev -> ksef_api_tokens.demo, real.ksefapi.dev -> ksef_api_tokens.real.
Uwaga: przed potwierdzeniem firmy endpointy wymagające tokenu zwrócą błąd.
Tokeny ksef_auth_token i ksef_api_tokens.*
są szyfrowane w bazie danych (encryption at rest).
W bazie nie jest przechowywana jawna wartość tokenów - odczyt wymaga kluczy aplikacji.
Limity obowiązują per adres IP i resetują się co 3 minuty.
Limit: 10 requestów / 3 min.
POST /api/companyPOST /api/company/confirmGET /api/companyPATCH /api/companyPATCH /api/ksef_auth_tokensLimit: 90 requestów / 3 min.
POST /api/invoicesGET /api/invoices/:process_id/api/company
Rejestracja firmy (np. w domenie real.ksefapi.dev dla produkcji).
{
"company": {
"name": "Firma Sp. z o.o.",
"tax_id": "1234567890",
"street": "ul. Przykładowa 10",
"postal_code": "00-001",
"city": "Warszawa",
"email": "[email protected]"
}
}
curl -X POST "https://test.ksefapi.dev/api/company" \
-H "Content-Type: application/json" \
-d '{
"company": {
"name": "Firma Sp. z o.o.",
"tax_id": "1234567890",
"street": "ul. Przykładowa 10",
"postal_code": "00-001",
"city": "Warszawa",
"email": "[email protected]"
}
}'
201 Created
{
"message": "Company created, check your email for confirmation token"
}
422 Unprocessable Entity
{
"message": "Company validation error",
"errors": ["Tax id is invalid", "Email is invalid"]
}
/api/company/confirm
Potwierdzenie rejestracji firmy i wygenerowanie tokenów API dla środowisk test/demo/real.
Token confirmation_token jest ważny 5 minut od momentu wysłania.
Wartości ksef_api_tokens są szyfrowane w bazie danych.
{
"confirmation_token": "CONFIRMATION_TOKEN"
}
curl -X POST "https://test.ksefapi.dev/api/company/confirm" \
-H "Content-Type: application/json" \
-d '{
"confirmation_token": "CONFIRMATION_TOKEN"
}'
200 OK
{
"message": "Company confirmed",
"ksef_api_tokens": {
"test": "KSEF_API_TOKEN_TEST",
"demo": "KSEF_API_TOKEN_DEMO",
"real": "KSEF_API_TOKEN_REAL"
}
}
400 Bad Request
{
"message": "Confirmation token required"
}
404 Not Found
{
"message": "Invalid confirmation token"
}
404 Not Found
{
"message": "Confirmation token expired"
}
/api/company
Pobranie danych firmy przypisanej do tokenu API.
curl -X GET "https://test.ksefapi.dev/api/company" \
-H "Authorization: Bearer KSEF_API_TOKEN"
200 OK
{
"company": {
"name": "Firma Sp. z o.o.",
"tax_id": "1234567890",
"street": "ul. Przykładowa 10",
"postal_code": "00-001",
"city": "Warszawa",
"email": "[email protected]"
}
}
400 Bad Request
{
"message": "Company confirmation required"
}
401 Unauthorized
{
"message": "Invalid token"
}
/api/company
Aktualizacja danych firmy.
{
"company": {
"name": "Firma Sp. z o.o.",
"tax_id": "1234567890",
"street": "ul. Przykładowa 11",
"postal_code": "00-001",
"city": "Warszawa",
"email": "[email protected]"
}
}
curl -X PATCH "https://test.ksefapi.dev/api/company" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer KSEF_API_TOKEN" \
-d '{
"company": {
"city": "Warszawa"
}
}'
200 OK
{
"message": "Company updated"
}
422 Unprocessable Entity
{
"message": "Company validation error",
"errors": ["Email is invalid"]
}
/api/ksef_auth_tokens
Ustawienie lub aktualizacja tokenu autoryzacyjnego KSeF dla firmy.
Wartość ksef_auth_token jest szyfrowana w bazie danych.
{
"ksef_auth_token": "KSEF_AUTH_TOKEN"
}
curl -X PATCH "https://test.ksefapi.dev/api/ksef_auth_tokens" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer KSEF_API_TOKEN" \
-d '{
"ksef_auth_token": "KSEF_AUTH_TOKEN"
}'
200 OK
{
"message": "KSeF auth token has been updated"
}
422 Unprocessable Entity
{
"message": "KSeF auth token cannot be blank"
}
/api/invoices
Wysyłka faktury do asynchronicznego przetworzenia w KSeF.
{
"invoice": {
"number": "FV/2026/02/001",
"issue_date": "2026-02-19",
"trade_date": "2026-02-19",
"payment_date": "2026-02-26",
"unit_price_type": "net",
"currency": "PLN",
"paid_amount": "0",
"vat_free_reason": "Sprzedaż opodatkowana",
"buyer": {
"name": "Nabywca Sp. z o.o.",
"tax_id": "PL1234567890",
"street": "ul. Kupiecka 5",
"postal_code": "00-100",
"city": "Warszawa",
"country_code": "PL",
"ksef_jst": false
},
"recipient": {
"name": "Odbiorca Sp. z o.o.",
"tax_id": "PL0987654321",
"street": "ul. Odbiorcza 2",
"postal_code": "30-002",
"city": "Kraków",
"country_code": "PL"
},
"items": [
{
"name": "Usługa A",
"unit": "szt",
"amount": "2",
"unit_price": "100.00",
"vat_rate": "23"
}
],
"notes": [
"Płatność przelewem 7 dni",
"Dziękujemy za współpracę"
]
}
}
Dozwolone wartości unit_price_type: net, gross.
Dozwolone wartości vat_rate: 23, 22, 8, 7, 5, 4, 3, 0 KR, 0 WDT, 0 EX, zw, oo, np I, np II.
curl -X POST "https://test.ksefapi.dev/api/invoices" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer KSEF_API_TOKEN" \
-d '{
"invoice": {
"number": "FV/2026/02/001",
"issue_date": "2026-02-19",
"trade_date": "2026-02-19",
"unit_price_type": "net",
"currency": "PLN",
"buyer": {
"name": "Nabywca Sp. z o.o.",
"tax_id": "PL1234567890",
"street": "ul. Kupiecka 5",
"postal_code": "00-100",
"city": "Warszawa",
"country_code": "PL"
},
"items": [
{
"name": "Usługa A",
"unit": "szt",
"amount": "2",
"unit_price": "100.00",
"vat_rate": "23"
}
]
}
}'
202 Accepted
{
"message": "Invoice accepted for creation in KSeF",
"process_id": "PROCESS_ID"
}
400 Bad Request
{
"message": "JSON validation error",
"errors": ["invoice.number is missing"]
}
422 Unprocessable Entity
{
"message": "Invoice validation error",
"errors": ["Buyer tax id is invalid"]
}
/api/invoices/:process_id
Pobranie statusu i szczegółów przetwarzania faktury.
curl -X GET "https://test.ksefapi.dev/api/invoices/PROCESS_ID" \
-H "Authorization: Bearer KSEF_API_TOKEN"
200 OK
{
"invoice": {
"number": "FV/2026/02/001",
"issue_date": "2026-02-19",
"status": "accepted",
"status_description": null,
"ksef_number": "KSEF_NUMBER",
"upo_url": "https://...",
"ksef_env": "test",
"qr_code_url": "..."
}
}
Dla statusu accepted pole status_description zwykle jest puste (null).
200 OK (status rejected/error)
{
"invoice": {
"number": "FV/2026/02/001",
"issue_date": "2026-02-19",
"status": "rejected",
"status_description": "Validation failed: buyer tax id is invalid",
"ksef_number": null,
"upo_url": null,
"ksef_env": "test",
"qr_code_url": null
}
}
Dla statusów rejected lub error pole status_description zawiera opis ostatniego błędu z logów przetwarzania.
404 Not Found
{
"message": "Invoice not found",
"errors": []
}
Krok 1: Rejestracja firmy w domenie produkcyjnej
curl -X POST "https://test.ksefapi.dev/api/company" \
-H "Content-Type: application/json" \
-d '{
"company": {
"name": "Firma Sp. z o.o.",
"tax_id": "1234567890",
"street": "ul. Przykładowa 10",
"postal_code": "00-001",
"city": "Warszawa",
"email": "[email protected]"
}
}'
Krok 2: Potwierdzenie firmy i odbiór tokenów API
curl -X POST "https://test.ksefapi.dev/api/company/confirm" \
-H "Content-Type: application/json" \
-d '{
"confirmation_token": "CONFIRMATION_TOKEN"
}'
Z odpowiedzi wybierz ksef_api_tokens.test dla test.ksefapi.dev (analogicznie demo i real).
Krok 3: Ustawienie tokenu autoryzacyjnego KSeF (dla wybranej domeny)
curl -X PATCH "https://test.ksefapi.dev/api/ksef_auth_tokens" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer KSEF_API_TOKEN" \
-d '{
"ksef_auth_token": "KSEF_AUTH_TOKEN"
}'
Krok 4: Wysyłka faktury i odbiór process_id
curl -X POST "https://test.ksefapi.dev/api/invoices" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer KSEF_API_TOKEN" \
-d '{
"invoice": {
"number": "FV/2026/02/001",
"issue_date": "2026-02-19",
"trade_date": "2026-02-19",
"unit_price_type": "net",
"currency": "PLN",
"buyer": {
"name": "Nabywca Sp. z o.o.",
"tax_id": "PL1234567890",
"street": "ul. Kupiecka 5",
"postal_code": "00-100",
"city": "Warszawa",
"country_code": "PL"
},
"items": [
{
"name": "Usługa A",
"unit": "szt",
"amount": "2",
"unit_price": "100.00",
"vat_rate": "23"
}
]
}
}'
Krok 5: Sprawdzenie statusu faktury
curl -X GET "https://test.ksefapi.dev/api/invoices/PROCESS_ID" \
-H "Authorization: Bearer KSEF_API_TOKEN"
Najczęstsze pytania o rejestrację firmy, autoryzację i obsługę faktur przez API.
Nie. Wysyłasz dane faktury jako JSON, a KSeF API odpowiada za walidację i generowanie XML zgodnego z KSeF.
Tak. Używasz dedykowanych domen: test.ksefapi.dev, demo.ksefapi.dev oraz real.ksefapi.dev.
Najpierw wywołujesz POST /api/company i przesyłasz dane firmy, np. nazwę, NIP, adres i email.
Wywołujesz POST /api/company/confirm z confirmation_token. W odpowiedzi otrzymujesz ksef_api_tokens z kluczami test, demo i real.
Użyj PATCH /api/ksef_auth_tokens i przekaż ksef_auth_token, autoryzując request nagłówkiem Bearer tokenem środowiskowym z ksef_api_tokens.
Chronione endpointy wymagają nagłówka Authorization: Bearer KSEF_API_TOKEN.
Wszystkie requesty i odpowiedzi są w formacie application/json.
Limity są per IP i resetują się co 3 minuty: 10 requestów dla procesu rejestracji firmy oraz 90 requestów dla wystawiania i statusu faktur.
POST /api/invoices?Przy poprawnym zgłoszeniu otrzymasz 202 Accepted z process_id, który służy do monitorowania dalszego przetwarzania.
Po wysyłce odbierasz process_id i sprawdzasz postęp przez endpoint GET /api/invoices/:process_id.
Odpowiedź 404 Not Found oznacza, że faktura o podanym process_id nie została znaleziona.