KSeF TESTEnd-to-end flow live in the KSeF test environment

Issue e-invoices in Europe without leaving your code

Self-service API for Poland’s KSeF — with Italy, Romania and Peppol coming next. Generate valid FA(3) XML, submit it and track its status. No Peppol Access Point. No manual portal.

KSeF test environment available today Production coming soon No credit card

POST/invoices201 Created
curl -X POST https://api.getnotaly.com/invoices \
  -H "Authorization: Bearer $NOTALY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "FV/2026/10/001",
    "currency": "PLN",
    "seller": { "nip": "5260250995", … },
    "buyer":  { "nip": "1234563218", … },
    "items": [{ "name": "SaaS subscription",
      "quantity": 1, "unitNetPrice": 1000, "vatRate": 23 }]
  }'
GET/invoices/inv_3f9c…200 OK
{
  "status": "accepted",
  "number": "FV/2026/10/001",
  "ksefNumber": "5260250995-20261012-8F3A21C9B7D0-4E",
  "upo": "<UPO …/>"
}
draft submitted accepted
Webhook delivered invoice.accepted · HMAC
Fictional test data. The API returns the KSeF number and the UPO once KSeF accepts the invoice.
  • FA(3) XMLValidated against the official XSD
  • KSeF APITest environment available today
  • Signed webhooksHMAC on every status change
  • IdempotentSafe retries on POST /invoices
E-invoicing API for Poland

Built for developers, not for portals

Truly developer-first

API keys, webhooks and idempotent submissions. Integrate in hours, not weeks.

Compliance handled for you

We validate the XML against the official XSD before sending. You get a readable error, not a government rejection.

One endpoint, many markets

Start with Poland. Italy, Romania and Peppol arrive on the same API.

KSeF API in 3 steps

How it works

  1. 1. Create your API key

    Sandbox sign-up in minutes.

  2. 2. POST /invoices

    Send the invoice data as simple JSON.

  3. 3. Track status via webhook

    Track the submission and KSeF response until accepted or rejected, with the UPO.

POSThttps://api.getnotaly.com/invoices
curl -X POST https://api.getnotaly.com/invoices \
  -H "Authorization: Bearer $NOTALY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "FV/2026/10/001",
    "issueDate": "2026-10-12",
    "currency": "PLN",
    "seller": { "nip": "5260250995", "name": "Example Sp. z o.o. (FICTIONAL)", "address": { "line1": "ul. Testowa 1, 00-001 Warszawa", "country": "PL" } },
    "buyer": { "nip": "1234563218", "name": "Test Customer S.A. (FICTIONAL)", "address": { "line1": "ul. Probna 2, 30-001 Kraków", "country": "PL" } },
    "items": [
      { "name": "SaaS subscription - October", "unit": "szt.", "quantity": 1, "unitNetPrice": 1000, "vatRate": 23 },
      { "name": "Support", "unit": "godz.", "quantity": 2, "unitNetPrice": 150.5, "vatRate": 8 }
    ]
  }'

Fictional data (test NIPs), identical to docs/examples/invoice-sample.json in the repository.

Invoice status

  1. draftFA(3) XML generated and validated against the XSD
  2. submittedSent to KSeF; stays here while KSeF processes it
  3. acceptedKSeF number and UPO returned
  4. rejectedStable error code, never a raw government message
Glossary

KSeF and FA(3) in a nutshell

KSeF (Krajowy System e-Faktur) is Poland’s national e-invoicing system, run by the Ministry of Finance. B2B invoices are issued as XML and receive a unique KSeF number.

FA(3) is the current version of the XML schema (XSD) for KSeF structured invoices. An invoice must follow it to be accepted; Notaly generates the XML and validates it against the official XSD before submission.

UPO (Urzędowe Poświadczenie Odbioru) is the official proof of receipt returned by KSeF when an invoice is accepted.

Simple, monthly

Pricing

Sandbox

Free
  • KSeF test environment
  • Webhooks
Start free (sandbox)

Scale

€199/month
  • Up to 1,000 invoices/month
  • Multi-entity
  • Peppol (coming soon)
  • Priority support
Get Scale

Enterprise

Custom
  • Custom volume
  • SLA and dedicated onboarding
Contact us

Launch prices, subject to review before production release.

FAQ

Frequently asked questions

Still unsure? Open a support ticket.

What is Notaly?

Notaly is a self-service KSeF API and e-invoicing API for Poland (and, soon, more of Europe). Send JSON via POST /invoices and Notaly generates FA(3) XML, validates it against the official XSD, submits it to KSeF and tracks the status.

What is KSeF?

KSeF (Krajowy System e-Faktur) is Poland's national e-invoicing system, operated by the Ministry of Finance. Structured invoices are submitted as XML and receive a unique KSeF number.

What is the FA(3) format?

FA(3) is the current version of the XML schema (XSD) for KSeF invoices. Notaly generates FA(3) XML from simple JSON and validates it against the official XSD before submitting.

What is the UPO?

The UPO (Urzędowe Poświadczenie Odbioru) is the official proof of receipt issued by KSeF when an invoice is accepted. The API returns the UPO together with the status.

Do I need to be a Peppol Access Point?

No. Notaly talks directly to KSeF for Poland and, for Peppol, resells a certified partner. You do not inherit the certification cost.

Does Notaly calculate taxes?

No. We issue and track the e-invoice; tax calculation is your responsibility or your accountant's.

When is KSeF production available?

Today the full flow works in the KSeF TEST environment. Production follows after tax and legal validation.

How do I track an invoice's status?

Via a signed webhook (HMAC) or by calling GET /invoices/{id}. API statuses: draft → submitted → accepted | rejected. While KSeF processes the submission internally, the invoice stays submitted.

Which countries are supported?

Poland (KSeF) first. Italy, Romania and Peppol come next, on the same API.

How much does it cost?

Free sandbox; Starter €49/month for up to 200 invoices; Scale €199/month for up to 1,000 invoices; Enterprise on request.

Support

Talk to the team that builds it

Stuck on KSeF auth, an FA(3) validation error or a webhook? Open a ticket — an engineer replies by email.

  • Include the invoice id and the error code if you have them.
  • Never paste API keys, passwords or certificates.

Open a support ticket

0 / 5000

We reply to the email above. Plain text only.

Start invoicing in Europe today

Create a sandbox account and issue your first KSeF test invoice in minutes.

  • 3 free test invoices on KSeF TEST
  • API key in seconds, no credit card
  • Upgrade to Starter or Scale when you’re ready