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.
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.
Kontakt: [email protected]
Bez skomplikowanych pakietów - jedna, jasna cena na start.
Dla jednej firmy
299 zł netto / miesiąc
W cenie masz pełną obsługę pojedynczej firmy w KSeF API.
Działamy fair-use: pakiet obejmuje do 1 000 faktur miesięcznie.
Jeśli potrzebujesz większego wolumenu lub obsługujesz wiele firm, skontaktuj się z nami, a przygotujemy dla Ciebie indywidualną ofertę.
Masz pytania o dopasowanie planu? Napisz: [email protected]
Dokumenty: Regulamin i Polityka prywatności
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.
Dane w KSeF API są chronione podczas przetwarzania i przechowywania. Tokeny
ksef_auth_token oraz ksef_api_tokens.*
są szyfrowane (encryption at rest), a ich jawna wartość nie jest przechowywana - odczyt wymaga kluczy aplikacji.
Dane faktur są przechowywane tymczasowo - codziennie usuwane są rekordy starsze niż 7 dni.
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).
Pole accepted_terms_and_privacy_policy jest wymagane i musi mieć wartość true, co oznacza akceptację Regulaminu i Polityki prywatności.
{
"company": {
"name": "Firma Sp. z o.o.",
"tax_id": "1234567890",
"street": "ul. Przykładowa 10",
"postal_code": "00-001",
"city": "Warszawa",
"email": "[email protected]",
"accepted_terms_and_privacy_policy": true
}
}
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]",
"accepted_terms_and_privacy_policy": true
}
}'
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",
"payment_type": "przelew",
"bank_account": "12345678901234567890123456",
"unit_price_type": "net",
"currency": "PLN",
"paid_amount": "50.00",
"paid_amount_payment_type": "karta",
"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.
Dozwolone wartości payment_type i paid_amount_payment_type: gotówka, karta, bon, czek, kredyt, przelew, mobilna.
Pole payment_type określa formę płatności dla terminu płatności, a paid_amount_payment_type formę dla zapłaconej kwoty (pełnej lub częściowej). Oba pola są opcjonalne.
Pole bank_account jest opcjonalne. Jeśli je podasz, trafi do XML jako RachunekBankowy/NrRB. Długość: od 10 do 34 znaków.
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",
"payment_date": "2026-02-26",
"payment_type": "przelew",
"paid_amount": "50.00",
"paid_amount_payment_type": "karta",
"bank_account": "12345678901234567890123456",
"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]",
"accepted_terms_and_privacy_policy": true
}
}'
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, email oraz accepted_terms_and_privacy_policy: true. Akceptacja dotyczy Regulaminu i Polityki prywatności.
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.