Odeslání faktury přes API

Odeslání e-faktury přes endpoint SalesInvoice: upload v libovolném podporovaném formátu, routing a sledování stavu.

Odeslání e-faktury přes API PSB je nejpoužívanější endpoint. Odešlete XML dokument v libovolném podporovaném formátu (UBL 2.1, NLCIUS, BIS Billing V3, PINT, CII, XRechnung, Factur-X/ZUGFeRD a další) a PSB se postará o automatickou detekci formátu, validaci, routing a doručení přes příslušnou síť.

Endpoint
POST /api/v1/{partyId}/salesInvoice/send

{partyId} v URL je Peppol identifikátor odesílající organizace (dodavatele). Požadavek obsahuje XML dokument jako body (content-type application/xml). PSB automaticky rozpozná formát dokumentu (UBL 2.1, NLCIUS, BIS Billing V3, PINT, CII, XRechnung, Factur-X/ZUGFeRD, FatturaPA a další) a validuje dokument vůči příslušným pravidlům.

Základní tok
  1. Upload: odešlete XML dokument na endpoint
  2. Validace: PSB validuje dokument vůči XSD schématu a obchodním pravidlům
  3. Routing: PSB vyhledá přes SML/SMP, jak dosáhnout příjemce
  4. Doručení: dokument je doručen přes příslušný kanál (Peppol, e-mail nebo jiná síť)
  5. Aktualizace stavu: obdržíte webhook notifikaci se stavem doručení

Důležité: PSB určuje příjemce na základě EndpointID ve Vašem XML dokumentu. Pokud tento element chybí nebo obsahuje nesprávný identifikátor, odeslání selže se stavem InvoiceSentError. Ujistěte se, že Váš zdrojový systém správně vyplňuje EndpointID. Více o identifikátorech a routingu najdete v článku o Peppol identifikátorech.

Idempotency: prevence duplicitních uploadů

PSB podporuje idempotency přes header požadavku X-EConnect-DocumentId. Zahrnutím vlastního UUID u každého upload požadavku se zabrání duplicitnímu zpracování:

X-EConnect-DocumentId: 550e8400-e29b-41d4-a716-446655440000

Pokud odešlete stejný documentId znovu, API vrátí 409 Conflict a odesílatel ví, že dokument již byl zpracován.

Důležité: Vždy používejte UUID/GUID jako documentId. Nikdy nepoužívejte číslo faktury, protože to způsobuje problémy při opětovném odeslání opravené verze téže faktury.

Kontrola routingu

Před odesláním faktury můžete přes queryRecipientParty zkontrolovat, zda a jak je příjemce dostupný:

POST /api/v1/{partyId}/salesInvoice/queryRecipientParty

V těle požadavku předáváte seznam identifikátorů, například ["0106:12345678"], nebo objekt s partyIds a metaAttributes. Volitelné dotazové parametry jsou ?preferredDocumentTypeId a ?includeOptions.

Odpověď obsahuje informace o:

  • Zda je příjemce registrován na Peppol
  • Jaké typy dokumentů příjemce může přijímat
  • Přes jaký Access Point je příjemce dostupný
  • Jaký kanál PSB použije pro doručení

Pro pokročilé vyhledávání včetně URL Access Pointu a certifikátu AP je k dispozici samostatná cesta:

GET /api/v1/peppol/deliveryOption?partyIds={id}&documentFamily=Invoice&isCredit=false
Zpracování chyb

Při neúspěšném doručení PSB automaticky uplatňuje mechanismus opakování:

  • Maximálně 8 pokusů rozložených na přibližně 35 hodin
  • Pouze u chyb serveru 5xx (dočasné chyby na straně příjemce)
  • U každého pokusu se publikuje událost InvoiceSentRetry
  • Při definitivním selhání obdržíte událost InvoiceSentError přes Váš webhook

Časté chyby při odesílání:

ChybaPříčinaŘešeníChyba validace (4xx)Dokument není v souladu se standardemZkontrolujte dokument pomocí Validate API. Poznámka: chyby 4xx se neopakují; dokument zůstává v InvoiceSentError jako konečný stav.Invalid payload — '{hodnota}' není platný xs:decimal na poli částkyZdrojový systém serializuje částku (například cbc:TaxInclusiveAmount, cbc:PriceAmount, cbc:LineExtensionAmount) ve vědeckém zápisu, jako -1.336061E6 místo -1336061.00. Pole částek UBL jsou typu xs:decimal a typ XML Schema neumožňuje exponentový zápis; platný je pouze pevný desetinný zápis s maximálně 2 desetinnými místy. Vyskytuje se typicky u velkých nebo záporných částek, které jsou interně serializovány jako double.Upravte zdrojový systém tak, aby částky byly zapsány jako běžná desetinná čísla (žádný zápis E, žádné oddělovače tisíců). Nahlaste problém dodavateli odesílajícího softwaru; eConnect to neumí opravit, protože hodnota se nachází v dodaném XML.The string '' is not a valid Decimal value v poli PriceAmountPole částky (např. cbc:PriceAmount) obsahuje prázdný řetězec ("") místo desetinného čísla na jednom nebo více řádcích faktury. xs:decimal neumožňuje prázdný řetězec jako lexikální hodnotu. Jiná příčina než vědecký zápis, stejná třída chybového vzoru.eConnect to nemůže automaticky opravit. Upravte zdrojový systém tak, aby žádné pole částky nezůstalo prázdné; znovu odešlete fakturu s platnou desetinnou částkou na všech řádcích.Příjemce nenalezenIdentifikátor není registrován v PeppolZkontrolujte přes queryRecipientParty409 ConflictDokument s tímto documentId již byl zpracovánNení potřeba žádná akce, dokument byl již odeslánHTTP 500 u velkého payloaduPožadavek přesahuje limit 24 MB webového serveru (včetně overheadu)Zmenšete vložené PDF přílohy; zohledněte ~33% base64 overhead

Poznámka: SI-UBL 1.2 (Simpler Invoicing 1.2) není povolen na síti Peppol od 1. ledna 2024. Faktury v tomto formátu vedou k InvoiceSentError. Používejte NLCIUS (SI-UBL 2.0) nebo Peppol BIS Billing V3. Zkontrolujte CustomizationID ve Vašem XML dokumentu, pokud narazíte na tuto chybu.

Odpověď

Úspěšný upload vrátí 200 OK s identifikátorem dokumentu v PSB. Tento identifikátor použijte ke sledování stavu dokumentu přes API nebo přes webhooky.

Žádný DELETE na salesInvoice: konečný stav po chybě 4xx

Na rozdíl od purchaseInvoice endpoint salesInvoice nemá DELETE. Jde o záměrnou volbu, protože odeslaná nebo odmítnutá prodejní faktura je událost významná pro audit: dokument zůstává dohledatelný v auditní stopě i poté, co odeslání selhalo.

Zákazníci se někdy ptá, zda lze odmítnutou prodejní fakturu zastavit nebo smazat, například poté, co fakturu interně již dobropisovali. Odpověď zní:

  • Chyba validace (4xx, například Invalid payload): PSB umístí dokument do konečného stavu InvoiceSentError. Žádné opakování se neprovádí (opakují se pouze chyby 5xx). Dokument není dodatečně doručen příjemci. Na PSB není potřeba žádná akce; dokument je v konečném stavu a uchovává se 90 dní pro účely auditu.
  • Žádný DELETE endpoint není potřeba: protože dokument již není aktivní a neopakuje se, nemusí být explicitně mazaný pro zastavení odeslání.
  • Poslat opravu pomocí nového dokumentu: pokud byla původní faktura nesprávná a již byla (částečně) doručena, použijte dobropis nebo opravnou fakturu podle standardního účetního postupu. Původní documentId zůstává jako reference v auditní stopě.

Tento rozdíl v životním cyklu mezi salesInvoice (bez DELETE) a purchaseInvoice (s DELETE) vyplývá z role: odchozí faktura je obchodní úkon zaznamenaný odesílatelem, který musí být právně dohledatelný; příchozí faktura může být po úspěšném stažení odstraněna z vlastního systému příjemce.

Rozšířené možnosti
Vynucení kanálu

Standardně PSB automaticky vybírá nejlepší kanál. S parametrem dotazu ?channel={hookId} můžete vynutit konkrétní kanál doručení (např. konkrétní síť nebo e-mailový fallback).

Zahrnutí příloh

Přílohy (PDF, obrázky) se mohou vložit jako base64 do UBL dokumentu jako AdditionalDocumentReference. PSB zpracovává vložené přílohy správně a doručuje je společně s fakturou.

Poznámka: Endpoint odesílání přijímá maximálně 24 MB na požadavek (včetně HTTP overheadu). U příloh kódovaných v base64 payload naroste o přibližně 33%, takže 18 MB PDF vede k požadavku o velikosti přibližně 24 MB. Payloady přesahující limit jsou odmítnuty webovým serverem s HTTP 500 (nikoli 413), ještě před aplikační validací. Zmenšete velké přílohy nebo je odešlete přes samostatný kanál.

Tip: Aktuální standard Peppol BIS Billing 3.0 podporuje maximálně jednu OrderReference na fakturu. Pokud se faktura vztahuje na více objednávek, musí se odeslat více faktur.

Tip: Někteří příjemci hlásí chyby u faktur s XML namespace prefixem (např. <urn:Invoice> místo <Invoice>). Obě formy jsou technicky správný XML podle W3C specifikace. Pokud příjemce uvádí toto jako důvod odmítnutí, nejedná se o platné odmítnutí v rámci sítě Peppol. Příjemce musí používat XML parser, který správně zpracovává prefixované i výchozí namespacey.

ViDA a CTC reportování

PSB je připraven na požadavky ViDA (VAT in the Digital Age). Při odeslání faktury PSB automaticky generuje příslušné CTC/DRR hlášení a odesílá ho finančnímu úřadu. Pro integrátory to neznamená žádnou změnu ve workflow: používáte stejný endpoint a stejný formát jako dosud.

Stavové zprávy o CTC reportování jsou součástí standardního webhook mechanismu. PSB poskytuje důkazové soubory (evidence files) pro každé hlášení. CTC reportování je zahrnuto v ceně dokumentu.

Často kladené otázky
Jak odešlu fakturu a v jakém formátu?

XML dokument odešlete jako body na POST /api/v1/{partyId}/salesInvoice/send s Content-Type: application/xml. PSB podporuje více než 20 formátů (UBL 2.1, NLCIUS, BIS Billing V3, PINT, CII, XRechnung, Factur-X/ZUGFeRD a další) a automaticky detekuje formát. Odešlete dokument ve vlastním formátu a PSB ho validuje vůči příslušným XSD a business rules. Příjemce se určí podle EndpointID ve Vašem XML; pokud chybí nebo je nesprávný, obdržíte InvoiceSentError.

Jak zabráním duplicitnímu odeslání a co znamená 409 Conflict?

Při každém uploadu přidejte hlavičku X-EConnect-DocumentId s unikátním UUID. Pokud zopakujete stejné documentId, API odpoví 409 Conflict, čímž potvrdí, že dokument již byl zpracován. Nikdy nepoužívejte číslo faktury jako documentId, protože při opětovném odeslání opravené verze potřebujete nové ID.

Jak sleduji stav doručení a co se děje při dočasných chybách?

Po úspěšném uploadu API vrátí identifikátor dokumentu v PSB, pomocí kterého můžete sledovat stav přes API nebo webhooky. Při dočasných 5xx chybách na straně příjemce PSB zveřejní pro každý pokus event InvoiceSentRetry a opakuje až 8krát během přibližně 35 hodin; při definitivním selhání obdržíte event InvoiceSentError.

Musím něco měnit pro ViDA/CTC reportování?

Ne. PSB automaticky generuje CTC/DRR hlášení při odeslání faktury a odesílá ho příslušnému finančnímu úřadu. Používáte stejný endpoint a stejný formát jako dosud. Stavové zprávy o CTC jsou dostupné přes standardní webhook mechanismus.


Chcete nejprve otestovat, zda je Váš dokument platný? Použijte Validate API.

Vyzkoušejte v API

Související