Referencja API
Faktury i korekty
Faktura powstaje z opłaconego zamówienia i przechodzi przez kolejkę: numer, XML FA(3), KSeF, PDF. Korekta powstaje ze zwrotu i odwołuje się do numeru KSeF faktury. Oba dokumenty mają te same statusy i pola.
Obiekt Invoice (faktura)
Faktura VAT wystawiona z opłaconego zamówienia. Korekty tej faktury są zagnieżdżone w polu corrections.
Pola
idstringwymaganeId dokumentu.
Prefiks
inv_objectstringwymaganeRodzaj obiektu.
Jedna z:
invoice,correction· Zawszeinvoicelivemodebooleanwymaganetruew trybie produkcyjnym,falsew testowym.statusstringwymaganepending→queued→sending→accepted,rejectedalboerror; alboskipped(nie da się zafakturować) iwaiting_for_plan_limit(wyczerpany limit planu).Jedna z:
pending,queued,sending,accepted,rejected,skipped,waiting_for_plan_limit,errororderobjectwymaganeZamówienie, z którego powstał dokument.
Pokaż pola
external_idstringwymaganeTwoje id zamówienia.
numberstring | nullwymaganeNumer zamówienia.
numberstring | nullwymaganeNumer faktury (bez luk w miesiącu), nadawany w kolejce.
ksef_numberstring | nullwymaganeNumer KSeF, gdy KSeF przyjmie dokument.
ksef_environmentstringwymaganeŚrodowisko KSeF:
testdla kluczy testowych,proddla produkcyjnych.Jedna z:
test,demo,prodissue_datestring | nullwymaganeData wystawienia.
date
currencystring | nullwymaganeWaluta faktury.
total_grossstring | nullwymaganeSuma brutto w walucie faktury (ujemna dla korekt).
buyer_nipstring | nullwymaganeNIP nabywcy.
pdf_urlstring | nullwymaganePubliczny link do PDF z niemożliwym do odgadnięcia tokenem, dla kupującego.
last_errornull | ErrorwymaganeOstatni błąd dokumentu albo
null. Kody błędówPokaż pola
typestringwymaganeRodzaj błędu.
Jedna z:
invalid_request_error,authentication_error,permission_error,not_found_error,idempotency_error,rate_limit_error,invoice_error,ksef_error,api_errorcodestringwymaganeStały kod do obsługi w programie. Lista kodów
Jedna z:
parameter_missing,parameter_invalid,body_invalid_json,body_too_large,buyer_nip_missing,buyer_nip_invalid,order_not_paid,order_cancelled,currency_not_supported,vat_rate_missing,vat_rate_unsupported,order_unprocessable,correction_requires_invoice,livemode_mismatch,resource_missing,route_not_found,method_not_allowed,pdf_not_ready,api_key_missing,api_key_invalid,live_mode_disabled,idempotency_key_reused,idempotency_key_invalid,rate_limited,internal_error,seller_not_configured,plan_limit_reached,invoice_build_failed,invoice_schema_invalid,original_not_invoiced,original_rejected,ksef_not_connected,ksef_auth_failed,ksef_duplicate_number,ksef_rejected,ksef_unavailablemessagestringwymaganeOpis dla człowieka (po angielsku); może się zmieniać.
paramstringŚcieżka JSON parametru, np.
order.buyer.nip.ksef_codeintegerWłasny kod liczbowy KSeF (np. 440 duplikat, 450 faktura niepoprawna).
doc_urlstringwymaganeLink do opisu kodu na tej stronie.
createdintegerwymaganeUtworzono (sekundy Unix).
updatedintegerwymaganeOstatnia zmiana (sekundy Unix).
correctionsarray of CorrectionwymaganeKorekty tej faktury.
{
"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": []
}Obiekt Correction (faktura korygująca)
Faktura korygująca (KOR) wystawiona ze zwrotu. Ma te same pola co faktura oraz invoice i refund.
Pola
idstringwymaganeId dokumentu.
Prefiks
cor_objectstringwymaganeRodzaj obiektu.
Jedna z:
invoice,correction· Zawszecorrectionlivemodebooleanwymaganetruew trybie produkcyjnym,falsew testowym.statusstringwymaganepending→queued→sending→accepted,rejectedalboerror; alboskipped(nie da się zafakturować) iwaiting_for_plan_limit(wyczerpany limit planu).Jedna z:
pending,queued,sending,accepted,rejected,skipped,waiting_for_plan_limit,errororderobjectwymaganeZamówienie, z którego powstał dokument.
Pokaż pola
external_idstringwymaganeTwoje id zamówienia.
numberstring | nullwymaganeNumer zamówienia.
numberstring | nullwymaganeNumer faktury (bez luk w miesiącu), nadawany w kolejce.
ksef_numberstring | nullwymaganeNumer KSeF, gdy KSeF przyjmie dokument.
ksef_environmentstringwymaganeŚrodowisko KSeF:
testdla kluczy testowych,proddla produkcyjnych.Jedna z:
test,demo,prodissue_datestring | nullwymaganeData wystawienia.
date
currencystring | nullwymaganeWaluta faktury.
total_grossstring | nullwymaganeSuma brutto w walucie faktury (ujemna dla korekt).
buyer_nipstring | nullwymaganeNIP nabywcy.
pdf_urlstring | nullwymaganePubliczny link do PDF z niemożliwym do odgadnięcia tokenem, dla kupującego.
last_errornull | ErrorwymaganeOstatni błąd dokumentu albo
null. Kody błędówPokaż pola
typestringwymaganeRodzaj błędu.
Jedna z:
invalid_request_error,authentication_error,permission_error,not_found_error,idempotency_error,rate_limit_error,invoice_error,ksef_error,api_errorcodestringwymaganeStały kod do obsługi w programie. Lista kodów
Jedna z:
parameter_missing,parameter_invalid,body_invalid_json,body_too_large,buyer_nip_missing,buyer_nip_invalid,order_not_paid,order_cancelled,currency_not_supported,vat_rate_missing,vat_rate_unsupported,order_unprocessable,correction_requires_invoice,livemode_mismatch,resource_missing,route_not_found,method_not_allowed,pdf_not_ready,api_key_missing,api_key_invalid,live_mode_disabled,idempotency_key_reused,idempotency_key_invalid,rate_limited,internal_error,seller_not_configured,plan_limit_reached,invoice_build_failed,invoice_schema_invalid,original_not_invoiced,original_rejected,ksef_not_connected,ksef_auth_failed,ksef_duplicate_number,ksef_rejected,ksef_unavailablemessagestringwymaganeOpis dla człowieka (po angielsku); może się zmieniać.
paramstringŚcieżka JSON parametru, np.
order.buyer.nip.ksef_codeintegerWłasny kod liczbowy KSeF (np. 440 duplikat, 450 faktura niepoprawna).
doc_urlstringwymaganeLink do opisu kodu na tej stronie.
createdintegerwymaganeUtworzono (sekundy Unix).
updatedintegerwymaganeOstatnia zmiana (sekundy Unix).
invoicestring | nullwymaganeId korygowanej faktury.
refundobjectwymaganeZwrot, z którego powstała korekta.
Pokaż pola
external_idstringwymaganeTwoje id zwrotu.
{
"id": "cor_8hG3jK2lMnBvCxZ1aS4dF6gH",
"object": "correction",
"livemode": false,
"status": "pending",
"order": {
"external_id": "SO-1001",
"number": null
},
"number": null,
"ksef_number": null,
"ksef_environment": "test",
"issue_date": null,
"currency": null,
"total_gross": null,
"buyer_nip": null,
"pdf_url": null,
"last_error": null,
"created": 1760951000,
"updated": 1760951000,
"invoice": "inv_4fJ2kP9xQwErTy7uI0oPaSdF",
"refund": {
"external_id": "RF-1"
}
}Lista faktur
GET /v1/invoices
Faktury od najnowszych, z zagnieżdżonymi korektami. Paginacja przez limit i starting_after, filtr external_id zwraca fakturę jednego zamówienia.
Parametry
limitquery · integerIle obiektów na stronie.
Domyślnie
10· 1-100starting_afterquery · stringId ostatniego obiektu poprzedniej strony.
external_idquery · stringTylko faktura tego zamówienia.
Odpowiedzi
- 200Strona listy faktur.
- 400Błędne żądanie, np.
parameter_invalidbuyer_nip_invalidvat_rate_unsupported - 401Brak klucza albo zły klucz:
api_key_missingapi_key_invalid - 404Nie ma takiego obiektu (albo należy do innego konta lub trybu):
resource_missing - 429Przekroczony limit zapytań, czekaj
Retry-Aftersekund:rate_limited
curl "https://app.ksefshop.pl/v1/invoices?limit=10" \
-H "Authorization: Bearer $KSEF_API_KEY"<?php
$ch = curl_init('https://app.ksefshop.pl/v1/invoices?limit=10');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KSEF_API_KEY'),
],
]);
$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 count($data['data']), ' obiektów', PHP_EOL;const res = await fetch("https://app.ksefshop.pl/v1/invoices?limit=10", {
headers: {
Authorization: `Bearer ${process.env.KSEF_API_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data.data.length, data.has_more);import os
import requests
resp = requests.get(
"https://app.ksefshop.pl/v1/invoices?limit=10",
headers={
"Authorization": f"Bearer {os.environ['KSEF_API_KEY']}",
},
timeout=30,
)
data = resp.json()
if not resp.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(len(data["data"]), data["has_more"]){
"object": "list",
"url": "/v1/invoices",
"has_more": false,
"data": []
}{
"error": {
"type": "invalid_request_error",
"code": "buyer_nip_invalid",
"message": "buyer.nip is not a valid Polish NIP (checksum).",
"param": "order.buyer.nip",
"doc_url": "https://ksefshop.pl/api/errors#buyer_nip_invalid"
}
}{
"error": {
"type": "authentication_error",
"code": "api_key_invalid",
"message": "The API key is wrong, revoked, or the account is disabled.",
"doc_url": "https://ksefshop.pl/api/errors#api_key_invalid"
}
}{
"error": {
"type": "not_found_error",
"code": "resource_missing",
"message": "No such invoice: 'inv_4fJ2kP9xQwErTy7uI0oPaSdF'",
"doc_url": "https://ksefshop.pl/api/errors#resource_missing"
}
}Utwórz fakturę z opłaconego zamówienia
POST /v1/invoices
Przyjmuje opłacone zamówienie i od razu odpowiada fakturą w statusie pending. Kolejka nadaje numer, buduje FA(3), wysyła do KSeF i renderuje PDF; zwykle po 10-60 sekundach status to accepted. Nabywca musi mieć poprawny polski NIP.
Wyślij order (format neutralny, ceny brutto) albo woocommerce_order (zamówienie z REST API WooCommerce v3). Dla tego samego external_id dostaniesz istniejącą fakturę i kod 200 zamiast 201.
Parametry
Idempotency-Keyheader · stringDowolny unikalny tekst (1-255 znaków), np.
order-SO-1001. Ponowienie z tym samym kluczem przez 24 godziny zwraca pierwszą odpowiedź. Idempotencja
Treść żądania (JSON)
Dokładnie jedno z pól: order albo woocommerce_order.
orderOrderZamówienie w formacie neutralnym (ceny brutto, jawne stawki VAT).
Pokaż pola
external_idstringwymaganeTwoje id zamówienia; jedna faktura na
external_id. Litery, cyfry i._:-, do 64 znaków.numberstringNumer zamówienia drukowany na fakturze (domyślnie
external_id).created_atstringKiedy złożono zamówienie.
Data i czas ISO 8601
paid_atstringwymaganeMoment zapłaty; od niego zależy data obowiązku podatkowego i data kursu NBP.
Data i czas ISO 8601
currencystringPLN albo waluta z tabeli A NBP. Waluty obce
Domyślnie
PLNpayment_methodstringForma płatności na fakturze.
Jedna z:
card,transfer,cash,mobile· DomyślniecardbuyerobjectwymaganeNabywca z polskim NIP.
Pokaż pola
nipstringwymaganePolski NIP, z prefiksem PL lub bez, z myślnikami lub spacjami. Sprawdzamy sumę kontrolną.
namestringwymaganeNazwa firmy nabywcy.
address_line1stringwymaganeUlica i numer.
address_line2stringKod pocztowy i miasto.
emailstringNa ten adres wysyłamy PDF faktury.
linesarray of OrderLinewymaganePozycje zamówienia.
1-1000 elementów
Pokaż pola
namestringwymaganeNazwa towaru lub usługi.
maks. 512 znaków
skustringKod produktu (opcjonalnie).
quantityintegerwymaganeLiczba sztuk.
unit_pricedecimal stringwymaganeCena jednostkowa brutto przed rabatem na pozycji.
Kwota jako tekst z kropką, np.
"49.00"discountdecimal stringRabat brutto na całą pozycję.
Kwota jako tekst z kropką, np.
"49.00"vat_ratestringwymaganeStawka VAT:
23,8,5albo0(0% krajowe). Zwolnienie (zw) nie jest jeszcze obsługiwane.Jedna z:
23,8,5,0
shippingarray of objectKoszty dostawy jako osobne pozycje.
Pokaż pola
namestringwymaganeNazwa dostawy, np. „Kurier InPost”.
pricedecimal stringwymaganeCena dostawy brutto.
Kwota jako tekst z kropką, np.
"49.00"vat_ratestringwymaganeStawka VAT dostawy.
Jedna z:
23,8,5,0
woocommerce_orderobjectZamówienie z REST API WooCommerce v3 (pola id, number, status, currency, daty, billing, meta_data z NIP, line_items, shipping_lines, fee_lines, tax_lines). Tak wysyła je wtyczka WooCommerce.
Odpowiedzi
- 200Faktura dla tego
external_idjuż istnieje (albo powtórka zIdempotency-Key). - 201Nowa faktura, status
pending. - 400Błędne żądanie, np.
parameter_invalidbuyer_nip_invalidvat_rate_unsupported - 401Brak klucza albo zły klucz:
api_key_missingapi_key_invalid - 403Tryb produkcyjny nie jest jeszcze włączony:
live_mode_disabled - 409Klucz idempotencji użyty z innym żądaniem albo PDF jeszcze niegotowy:
idempotency_key_reusedpdf_not_ready - 413Błędne żądanie, np.
parameter_invalidbuyer_nip_invalidvat_rate_unsupported - 422Zamówienia nie da się zamienić w fakturę:
order_unprocessable - 429Przekroczony limit zapytań, czekaj
Retry-Aftersekund:rate_limited - 500Błąd po naszej stronie; ponów z tym samym
Idempotency-Key:internal_error
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": []
}{
"id": "inv_4fJ2kP9xQwErTy7uI0oPaSdF",
"object": "invoice",
"livemode": false,
"status": "pending",
"order": {
"external_id": "SO-1001",
"number": null
},
"number": null,
"ksef_number": null,
"ksef_environment": "test",
"issue_date": null,
"currency": null,
"total_gross": null,
"buyer_nip": null,
"pdf_url": null,
"last_error": null,
"created": 1760865185,
"updated": 1760865185,
"corrections": []
}{
"error": {
"type": "invalid_request_error",
"code": "buyer_nip_invalid",
"message": "buyer.nip is not a valid Polish NIP (checksum).",
"param": "order.buyer.nip",
"doc_url": "https://ksefshop.pl/api/errors#buyer_nip_invalid"
}
}{
"error": {
"type": "authentication_error",
"code": "api_key_invalid",
"message": "The API key is wrong, revoked, or the account is disabled.",
"doc_url": "https://ksefshop.pl/api/errors#api_key_invalid"
}
}Pobierz fakturę lub korektę
GET /v1/invoices/{id}
Zwraca fakturę (inv_..., razem z korektami) albo korektę (cor_...). Tym endpointem sprawdzasz status, numer KSeF i ewentualny błąd w last_error.
Parametry
idpath · stringwymaganeIdentyfikator obiektu.
Prefiks
inv_/cor_
Odpowiedzi
- 200Faktura albo korekta.
- 400Błędne żądanie, np.
parameter_invalidbuyer_nip_invalidvat_rate_unsupported - 401Brak klucza albo zły klucz:
api_key_missingapi_key_invalid - 404Nie ma takiego obiektu (albo należy do innego konta lub trybu):
resource_missing - 429Przekroczony limit zapytań, czekaj
Retry-Aftersekund:rate_limited
curl https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF \
-H "Authorization: Bearer $KSEF_API_KEY"<?php
$ch = curl_init('https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KSEF_API_KEY'),
],
]);
$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['status'], true), ' ', var_export($data['ksef_number'], true), PHP_EOL;const res = await fetch("https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF", {
headers: {
Authorization: `Bearer ${process.env.KSEF_API_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data.status, data.ksef_number);import os
import requests
resp = requests.get(
"https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF",
headers={
"Authorization": f"Bearer {os.environ['KSEF_API_KEY']}",
},
timeout=30,
)
data = resp.json()
if not resp.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data["status"], data["ksef_number"]){
"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": []
}{
"error": {
"type": "invalid_request_error",
"code": "buyer_nip_invalid",
"message": "buyer.nip is not a valid Polish NIP (checksum).",
"param": "order.buyer.nip",
"doc_url": "https://ksefshop.pl/api/errors#buyer_nip_invalid"
}
}{
"error": {
"type": "authentication_error",
"code": "api_key_invalid",
"message": "The API key is wrong, revoked, or the account is disabled.",
"doc_url": "https://ksefshop.pl/api/errors#api_key_invalid"
}
}{
"error": {
"type": "not_found_error",
"code": "resource_missing",
"message": "No such invoice: 'inv_4fJ2kP9xQwErTy7uI0oPaSdF'",
"doc_url": "https://ksefshop.pl/api/errors#resource_missing"
}
}Pobierz PDF
GET /v1/invoices/{id}/pdf
PDF w układzie wizualizacji Ministerstwa Finansów, z numerem KSeF i kodem QR (KOD I) do weryfikacji. Dopóki PDF się renderuje, dostaniesz 409 pdf_not_ready. Kupującemu przekaż raczej publiczny link pdf_url z obiektu faktury.
Parametry
idpath · stringwymaganeIdentyfikator obiektu.
Prefiks
inv_/cor_
Odpowiedzi
- 200Plik PDF.
- 401Brak klucza albo zły klucz:
api_key_missingapi_key_invalid - 404Nie ma takiego obiektu (albo należy do innego konta lub trybu):
resource_missing - 409Klucz idempotencji użyty z innym żądaniem albo PDF jeszcze niegotowy:
idempotency_key_reusedpdf_not_ready
curl https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF/pdf \
-H "Authorization: Bearer $KSEF_API_KEY" \
--fail -o faktura.pdf<?php
$ch = curl_init('https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF/pdf');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KSEF_API_KEY'),
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException('PDF: HTTP ' . $status); // 409 pdf_not_ready: spróbuj ponownie za kilka sekund
}
file_put_contents('faktura.pdf', $body);import { writeFile } from "node:fs/promises";
const res = await fetch("https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF/pdf", {
headers: {
Authorization: `Bearer ${process.env.KSEF_API_KEY}`,
},
});
if (!res.ok) throw new Error(`PDF: HTTP ${res.status}`); // 409 pdf_not_ready: spróbuj ponownie za kilka sekund
await writeFile("faktura.pdf", Buffer.from(await res.arrayBuffer()));import os
import requests
resp = requests.get(
"https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF/pdf",
headers={
"Authorization": f"Bearer {os.environ['KSEF_API_KEY']}",
},
timeout=30,
)
resp.raise_for_status() # 409 pdf_not_ready: spróbuj ponownie za kilka sekund
with open("faktura.pdf", "wb") as f:
f.write(resp.content)%PDF-1.7
… plik PDF (application/pdf) z numerem KSeF i kodem QR{
"error": {
"type": "authentication_error",
"code": "api_key_invalid",
"message": "The API key is wrong, revoked, or the account is disabled.",
"doc_url": "https://ksefshop.pl/api/errors#api_key_invalid"
}
}{
"error": {
"type": "not_found_error",
"code": "resource_missing",
"message": "No such invoice: 'inv_4fJ2kP9xQwErTy7uI0oPaSdF'",
"doc_url": "https://ksefshop.pl/api/errors#resource_missing"
}
}{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "Idempotency-Key \"k-1002\" was already used with a different request.",
"doc_url": "https://ksefshop.pl/api/errors#idempotency_key_reused"
}
}Utwórz korektę (zwrot)
POST /v1/invoices/{id}/corrections
Zwrot staje się fakturą korygującą (KOR, TypKorekty 2) z pozycjami różnicowymi (ujemne ilości), która wskazuje numer KSeF faktury pierwotnej. Kolejka czeka, aż faktura pierwotna zostanie przyjęta w KSeF.
Wyślij refund (format neutralny) albo woocommerce_order razem z woocommerce_refund.
Parametry
idpath · stringwymaganeIdentyfikator obiektu.
Prefiks
inv_Idempotency-Keyheader · stringDowolny unikalny tekst (1-255 znaków), np.
order-SO-1001. Ponowienie z tym samym kluczem przez 24 godziny zwraca pierwszą odpowiedź. Idempotencja
Treść żądania (JSON)
Albo refund, albo woocommerce_order + woocommerce_refund.
refundRefundZwrot w formacie neutralnym.
Pokaż pola
external_idstringwymaganeTwoje id zwrotu; jedna korekta na
external_id.reasonstringPrzyczyna korekty drukowana na fakturze, np. „Zwrot towaru”.
created_atstringKiedy zwrócono pieniądze.
Data i czas ISO 8601
linesarray of objectZwrócone pozycje (co najmniej jedno z:
lines,shipping).Pokaż pola
namestringwymaganeNazwa pozycji jak na fakturze.
skustringKod produktu.
quantityintegerwymaganeLiczba zwróconych sztuk (dodatnia).
unit_pricedecimal stringwymaganeCena jednostkowa brutto.
Kwota jako tekst z kropką, np.
"49.00"vat_ratestringwymaganeStawka VAT pozycji.
Jedna z:
23,8,5,0
shippingobjectZwrócone koszty dostawy.
Pokaż pola
pricedecimal stringwymaganeZwrócona kwota dostawy brutto; stawka VAT jak w dostawie z faktury.
Kwota jako tekst z kropką, np.
"49.00"
woocommerce_orderobjectZamówienie WooCommerce, którego dotyczy zwrot.
woocommerce_refundobjectZwrot z REST API WooCommerce v3.
Odpowiedzi
- 200Korekta dla tego
refund.external_idjuż istnieje. - 201Nowa korekta, status
pending. - 400Błędne żądanie, np.
parameter_invalidbuyer_nip_invalidvat_rate_unsupported - 401Brak klucza albo zły klucz:
api_key_missingapi_key_invalid - 404Nie ma takiego obiektu (albo należy do innego konta lub trybu):
resource_missing - 409Klucz idempotencji użyty z innym żądaniem albo PDF jeszcze niegotowy:
idempotency_key_reusedpdf_not_ready - 422Zamówienia nie da się zamienić w fakturę:
order_unprocessable - 429Przekroczony limit zapytań, czekaj
Retry-Aftersekund:rate_limited
curl -X POST https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF/corrections \
-H "Authorization: Bearer $KSEF_API_KEY" \
-H "Idempotency-Key: refund-RF-1" \
-H "Content-Type: application/json" \
-d '{
"refund": {
"external_id": "RF-1",
"reason": "Zwrot towaru",
"lines": [
{
"name": "Kubek ceramiczny 350 ml",
"sku": "KUB-350",
"quantity": 1,
"unit_price": "49.00",
"vat_rate": "23"
}
],
"shipping": {
"price": "15.99"
}
}
}'<?php
$payload = [
'refund' => [
'external_id' => 'RF-1',
'reason' => 'Zwrot towaru',
'lines' => [
[
'name' => 'Kubek ceramiczny 350 ml',
'sku' => 'KUB-350',
'quantity' => 1,
'unit_price' => '49.00',
'vat_rate' => '23',
],
],
'shipping' => ['price' => '15.99'],
],
];
$ch = curl_init('https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF/corrections');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KSEF_API_KEY'),
'Idempotency-Key: refund-RF-1',
'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/inv_4fJ2kP9xQwErTy7uI0oPaSdF/corrections", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KSEF_API_KEY}`,
"Idempotency-Key": "refund-RF-1",
"Content-Type": "application/json",
},
body: JSON.stringify({
refund: {
external_id: "RF-1",
reason: "Zwrot towaru",
lines: [
{
name: "Kubek ceramiczny 350 ml",
sku: "KUB-350",
quantity: 1,
unit_price: "49.00",
vat_rate: "23",
},
],
shipping: { price: "15.99" },
},
}),
});
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/inv_4fJ2kP9xQwErTy7uI0oPaSdF/corrections",
headers={
"Authorization": f"Bearer {os.environ['KSEF_API_KEY']}",
"Idempotency-Key": "refund-RF-1",
},
json={
"refund": {
"external_id": "RF-1",
"reason": "Zwrot towaru",
"lines": [
{
"name": "Kubek ceramiczny 350 ml",
"sku": "KUB-350",
"quantity": 1,
"unit_price": "49.00",
"vat_rate": "23",
},
],
"shipping": {"price": "15.99"},
},
},
timeout=30,
)
data = resp.json()
if not resp.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data["id"], data["status"]){
"id": "cor_8hG3jK2lMnBvCxZ1aS4dF6gH",
"object": "correction",
"livemode": false,
"status": "pending",
"order": {
"external_id": "SO-1001",
"number": null
},
"number": null,
"ksef_number": null,
"ksef_environment": "test",
"issue_date": null,
"currency": null,
"total_gross": null,
"buyer_nip": null,
"pdf_url": null,
"last_error": null,
"created": 1760951000,
"updated": 1760951000,
"invoice": "inv_4fJ2kP9xQwErTy7uI0oPaSdF",
"refund": {
"external_id": "RF-1"
}
}{
"id": "cor_8hG3jK2lMnBvCxZ1aS4dF6gH",
"object": "correction",
"livemode": false,
"status": "pending",
"order": {
"external_id": "SO-1001",
"number": null
},
"number": null,
"ksef_number": null,
"ksef_environment": "test",
"issue_date": null,
"currency": null,
"total_gross": null,
"buyer_nip": null,
"pdf_url": null,
"last_error": null,
"created": 1760951000,
"updated": 1760951000,
"invoice": "inv_4fJ2kP9xQwErTy7uI0oPaSdF",
"refund": {
"external_id": "RF-1"
}
}{
"error": {
"type": "invalid_request_error",
"code": "buyer_nip_invalid",
"message": "buyer.nip is not a valid Polish NIP (checksum).",
"param": "order.buyer.nip",
"doc_url": "https://ksefshop.pl/api/errors#buyer_nip_invalid"
}
}{
"error": {
"type": "authentication_error",
"code": "api_key_invalid",
"message": "The API key is wrong, revoked, or the account is disabled.",
"doc_url": "https://ksefshop.pl/api/errors#api_key_invalid"
}
}