KSeF Faktury
PL
Zapisz się na start
Wczesny dostęp

API jest we wczesnym dostępie: klucze testowe (KSeF TEST) wydajemy partiami osobom z listy startowej. Tryb produkcyjny włączymy później.

Poproś o dostęp

Szybki start · ok. 5 minut

Pierwsza faktura w KSeF w 5 minut

Cztery żądania: sprawdzasz klucz, wysyłasz opłacone zamówienie, odbierasz numer KSeF i pobierasz PDF. Wszystko w trybie testowym, na KSeF TEST, bez skutków prawnych.

Potrzebujesz: klucza testowego sk_test_... (wydajemy go w ramach wczesnego dostępu), uzupełnionych danych sprzedawcy i połączenia z KSeF TEST w panelu klienta (testowy certyfikat KSeF tworzy się jednym kliknięciem) oraz curl, PHP z ext-curl, Node.js 18+ albo Pythona 3 z requests. Klucz trzymaj w zmiennej środowiskowej:

export KSEF_API_KEY=sk_test_...

Tryb testowy wysyła faktury do KSeF TEST Ministerstwa Finansów: dostajesz prawdziwy numer KSeF i PDF, ale faktury nie mają skutków prawnych i nie liczą się do limitu.

  1. 1Sprawdź klucz i połączenie z KSeF
  2. 2Wyślij opłacone zamówienie
  3. 3Odbierz numer KSeF
  4. 4Pobierz PDF z kodem QR

130 sekund

Sprawdź klucz i połączenie z KSeF

Zapytaj o konto. Gdy seller_configured i ksef_connected mają wartość true, możesz wystawiać faktury. Jeśli dostaniesz 401, klucz jest błędny; jeśli ksef_connected to false, w ksef_check_error jest powód.

GET /v1/account
curl https://app.ksefshop.pl/v1/account \
  -H "Authorization: Bearer $KSEF_API_KEY"
Odpowiedź
{
  "id": "acct_Xy7Qw2Er4Ty6Ui8Op0As2Df4",
  "object": "account",
  "livemode": false,
  "email": "sklep@example.com",
  "platform": "woocommerce",
  "ksef_environment": "test",
  "seller": {
    "nip": "4235405606",
    "name": "Sklep Woo sp. z o.o.",
    "address_line1": "ul. Testowa 1",
    "address_line2": "00-001 Warszawa"
  },
  "seller_configured": true,
  "ksef_connected": true,
  "ksef_check_error": null,
  "plan": {
    "name": "Unlimited",
    "monthly_limit": null,
    "used_this_month": 12
  }
}

21 minuta

Wyślij opłacone zamówienie

Wyślij zamówienie z NIP nabywcy, pozycjami w cenach brutto i stawkami VAT. API od razu odpowiada 201 i fakturą w statusie pending; zapamiętaj jej id.

Idempotency-Key sprawia, że ponowienie po błędzie sieci nie utworzy drugiej faktury. Błędny NIP zwraca od razu 400 buyer_nip_invalid z param: order.buyer.nip.

POST /v1/invoices
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"
      }
    ]
  }
}'
Odpowiedź
{
  "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": []
}

310-60 sekund

Odbierz numer KSeF

Kolejka nadaje numer (queued), wysyła XML do KSeF (sending), a po przyjęciu status zmienia się na accepted i pojawia się ksef_number. W produkcji zamiast odpytywać, odbieraj webhooki invoice.accepted i invoice.rejected.

Czekaj na numer KSeF
ID=inv_4fJ2kP9xQwErTy7uI0oPaSdF
for i in $(seq 1 30); do
  STATUS=$(curl -s https://app.ksefshop.pl/v1/invoices/$ID \
    -H "Authorization: Bearer $KSEF_API_KEY" | jq -r .status)
  echo "$STATUS"
  case "$STATUS" in accepted|rejected|skipped|error) break ;; esac
  sleep 3
done
curl -s https://app.ksefshop.pl/v1/invoices/$ID \
  -H "Authorization: Bearer $KSEF_API_KEY" | jq '{status, number, ksef_number, last_error}'
Odpowiedź
{
  "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": []
}

410 sekund

Pobierz PDF z kodem QR

PDF ma numer KSeF i kod QR do weryfikacji faktury w KSeF. Przez kilka sekund po przyjęciu możesz dostać 409 pdf_not_ready; wtedy ponów. Kupującemu wyślij link pdf_url z obiektu faktury: działa bez klucza API, a gdy podasz buyer.email, PDF wysyłamy mu sami.

GET /v1/invoices/{id}/pdf
curl https://app.ksefshop.pl/v1/invoices/inv_4fJ2kP9xQwErTy7uI0oPaSdF/pdf \
  -H "Authorization: Bearer $KSEF_API_KEY" \
  --fail -o faktura.pdf

Co dalej

  • Webhooki: numer KSeF w Twoim systemie bez odpytywania.
  • Idempotencja: bezpieczne ponawianie po błędach sieci i 5xx.
  • Korekty: zwrot towaru jako faktura korygująca.
  • Waluty obce: zamówienia w EUR i innych walutach.
  • Referencja API: wszystkie pola i odpowiedzi.

Gdy coś nie działa

Odpowiedź Co zrobić
401 api_key_invalid Sprawdź, czy w nagłówku jest Bearer i cały klucz.
400 buyer_nip_invalid NIP ma błędną sumę kontrolną; testowo użyj 5260250274.
status skipped, seller_not_configured Uzupełnij dane sprzedawcy w panelu.
status queued, ksef_not_connected Połącz KSeF TEST w panelu (certyfikat testowy).
403 live_mode_disabled Użyłeś klucza sk_live_; we wczesnym dostępie pracuj kluczem testowym.

Pełna lista: błędy i kody.

KSeF Faktury

Wczesny dostęp do API

Klucze testowe wydajemy partiami. Zostaw e-mail: napiszemy, gdy dostęp będzie gotowy.