API dla programistów · wczesny dostęp
API KSeF Faktury
Wysyłasz opłacone zamówienie w JSON. My nadajemy numer faktury bez luk, budujemy XML FA(3) sprawdzony ze schematem XSD, wysyłamy go do KSeF i zwracamy numer KSeF oraz PDF z kodem QR. Do tego klucze testowe i produkcyjne, idempotencja i podpisane webhooki.
- OpenAPI 3.1 i kolekcja Postman
- KSeF TEST bez limitu faktur
- Przykłady w cURL, PHP, Node.js i Pythonie
curl -X POST https://app.ksefshop.pl/v1/invoices \
-H "Authorization: Bearer $KSEF_API_KEY" \
-H "Idempotency-Key: order-SO-1001" \
-H "Content-Type: application/json" \
-d '{
"order": {
"external_id": "SO-1001",
"number": "1001",
"paid_at": "2026-10-19T09:13:05Z",
"currency": "PLN",
"payment_method": "card",
"buyer": {
"nip": "5260250274",
"name": "Testowa Firma sp. z o.o.",
"address_line1": "ul. Prosta 20",
"address_line2": "00-850 Warszawa",
"email": "jan@example.com"
},
"lines": [
{
"name": "Kubek ceramiczny 350 ml",
"sku": "KUB-350",
"quantity": 2,
"unit_price": "49.00",
"vat_rate": "23"
},
{
"name": "Książka: Podstawy księgowości",
"sku": "KS-001",
"quantity": 1,
"unit_price": "59.90",
"discount": "9.90",
"vat_rate": "5"
}
],
"shipping": [
{
"name": "Kurier InPost",
"price": "15.99",
"vat_rate": "23"
}
]
}
}'<?php
$payload = [
'order' => [
'external_id' => 'SO-1001',
'number' => '1001',
'paid_at' => '2026-10-19T09:13:05Z',
'currency' => 'PLN',
'payment_method' => 'card',
'buyer' => [
'nip' => '5260250274',
'name' => 'Testowa Firma sp. z o.o.',
'address_line1' => 'ul. Prosta 20',
'address_line2' => '00-850 Warszawa',
'email' => 'jan@example.com',
],
'lines' => [
[
'name' => 'Kubek ceramiczny 350 ml',
'sku' => 'KUB-350',
'quantity' => 2,
'unit_price' => '49.00',
'vat_rate' => '23',
],
[
'name' => 'Książka: Podstawy księgowości',
'sku' => 'KS-001',
'quantity' => 1,
'unit_price' => '59.90',
'discount' => '9.90',
'vat_rate' => '5',
],
],
'shipping' => [
['name' => 'Kurier InPost', 'price' => '15.99', 'vat_rate' => '23'],
],
],
];
$ch = curl_init('https://app.ksefshop.pl/v1/invoices');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KSEF_API_KEY'),
'Idempotency-Key: order-SO-1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
$data = json_decode($body, true);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
echo var_export($data['id'], true), ' ', var_export($data['status'], true), PHP_EOL;const res = await fetch("https://app.ksefshop.pl/v1/invoices", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KSEF_API_KEY}`,
"Idempotency-Key": "order-SO-1001",
"Content-Type": "application/json",
},
body: JSON.stringify({
order: {
external_id: "SO-1001",
number: "1001",
paid_at: "2026-10-19T09:13:05Z",
currency: "PLN",
payment_method: "card",
buyer: {
nip: "5260250274",
name: "Testowa Firma sp. z o.o.",
address_line1: "ul. Prosta 20",
address_line2: "00-850 Warszawa",
email: "jan@example.com",
},
lines: [
{
name: "Kubek ceramiczny 350 ml",
sku: "KUB-350",
quantity: 2,
unit_price: "49.00",
vat_rate: "23",
},
{
name: "Książka: Podstawy księgowości",
sku: "KS-001",
quantity: 1,
unit_price: "59.90",
discount: "9.90",
vat_rate: "5",
},
],
shipping: [
{ name: "Kurier InPost", price: "15.99", vat_rate: "23" },
],
},
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data.id, data.status);import os
import requests
resp = requests.post(
"https://app.ksefshop.pl/v1/invoices",
headers={
"Authorization": f"Bearer {os.environ['KSEF_API_KEY']}",
"Idempotency-Key": "order-SO-1001",
},
json={
"order": {
"external_id": "SO-1001",
"number": "1001",
"paid_at": "2026-10-19T09:13:05Z",
"currency": "PLN",
"payment_method": "card",
"buyer": {
"nip": "5260250274",
"name": "Testowa Firma sp. z o.o.",
"address_line1": "ul. Prosta 20",
"address_line2": "00-850 Warszawa",
"email": "jan@example.com",
},
"lines": [
{
"name": "Kubek ceramiczny 350 ml",
"sku": "KUB-350",
"quantity": 2,
"unit_price": "49.00",
"vat_rate": "23",
},
{
"name": "Książka: Podstawy księgowości",
"sku": "KS-001",
"quantity": 1,
"unit_price": "59.90",
"discount": "9.90",
"vat_rate": "5",
},
],
"shipping": [
{"name": "Kurier InPost", "price": "15.99", "vat_rate": "23"},
],
},
},
timeout=30,
)
data = resp.json()
if not resp.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data["id"], data["status"]){
"id": "inv_4fJ2kP9xQwErTy7uI0oPaSdF",
"object": "invoice",
"livemode": false,
"status": "accepted",
"order": {
"external_id": "SO-1001",
"number": "1001"
},
"number": "FV/2026/10/1",
"ksef_number": "4235405606-20261019-0E7570400000-57",
"ksef_environment": "test",
"issue_date": "2026-10-19",
"currency": "PLN",
"total_gross": "163.99",
"buyer_nip": "5260250274",
"pdf_url": "https://app.ksefshop.pl/pdf/cmgxa1b2c0000/Qk9tZ2FsX3ZhbGlkX3Rva2VuX2V4YW1w",
"last_error": null,
"created": 1760865185,
"updated": 1760865214,
"corrections": []
}Co się dzieje po wysłaniu zamówienia
Żądanie wraca od razu. Resztę robi kolejka, a stan widzisz w polu status, w zdarzeniach i w webhookach.
pendingAPI sprawdziło zamówienie (NIP, stawki VAT, kwoty) i zapisało dokument.queuedFaktura dostała numer: bez luk, osobno w każdym miesiącu.sendingXML FA(3) sprawdzony ze schematem XSD idzie do KSeF certyfikatem lub tokenem sprzedawcy.acceptedKSeF nadał numer KSeF. PDF z kodem QR jest gotowy, kupujący dostaje go e-mailem.rejectedKSeF odrzucił dokument. Kod KSeF i nasz kod błędu są w last_error.skippedZamówienia nie da się zafakturować, np. brak stawki VAT. Powód w last_error.
Od czego zacząć
Szybki start
Klucz testowy, jedno zamówienie, numer KSeF i PDF. Cztery żądania.
Uwierzytelnianie i klucze
Klucze sk_test_ i sk_live_, nagłówek Bearer, rotacja, certyfikat KSeF.
Webhooki
Typy zdarzeń, podpis HMAC w 4 językach, ponowienia przez 3 dni.
Błędy i kody
Wszystkie kody błędów i mapowanie odpowiedzi KSeF, np. 440.
Idempotencja
Ponawianie po błędzie sieci bez dubli faktur w KSeF.
Korekty i zwroty
Zwrot towaru lub dostawy jako faktura korygująca.
Waluty obce i kurs NBP
Faktury w EUR i innych walutach, VAT w PLN po kursie NBP.
WooCommerce i PrestaShop
Wtyczka WooCommerce i szkic modułu PrestaShop.
Wszystkie endpointy
Każdy endpoint z polami, odpowiedziami i przykładami.
Co obsługuje API
- Faktury FA(3) z opłaconych zamówień z polskim NIP: stawki 23, 8, 5 i 0%, rabaty, koszty dostawy, do 1000 pozycji.
- Numeracja bez luk nadawana w kolejce, osobno w każdym miesiącu, z Twoim wzorem.
- Wysyłka do KSeF Twoim certyfikatem lub tokenem KSeF, z automatycznym ponawianiem, gdy KSeF nie odpowiada.
- PDF w układzie wizualizacji Ministerstwa Finansów z numerem KSeF i kodem QR, plus publiczny link dla kupującego.
- Korekty przy zwrotach towaru i dostawy, powiązane z numerem KSeF faktury pierwotnej. Korekty
- Waluty obce z tabeli A NBP, z VAT w złotych po kursie NBP. Waluty
- Klucze testowe i produkcyjne z osobnymi danymi, idempotencja, podpisane webhooki, zdarzenia do uzgadniania.
- Format WooCommerce: zamówienie z REST API WooCommerce można wysłać bez przerabiania. WooCommerce
Sklep na Shopify nie potrzebuje API: aplikacja KSeF Faktury robi to samo bez programowania.
Specyfikacja i kolekcja Postman
Ta dokumentacja jest generowana z pliku OpenAPI 3.1, tego samego, którym testujemy API. Kolekcja Postman ma dwa foldery: Reference (każdy endpoint) i Scenarios (pierwsza faktura, EUR, WooCommerce, błędny NIP, idempotencja, korekta, PDF, webhooki). W środowiskach wpisz swój klucz w miejsce REPLACE_ME.
- openapi.yamlSpecyfikacja OpenAPI 3.1 · 42 KB
- ksef-faktury.postman_collection.jsonKolekcja Postman v2.1 · 167 KB
- test.postman_environment.jsonŚrodowisko: test (KSeF TEST) · 392 B
- live.postman_environment.jsonŚrodowisko: live (po starcie) · 392 B
- local.postman_environment.jsonŚrodowisko: localhost:3000 · 391 B