Dokumentace

Pro vývojáře: API reference

REST API portálu a národní rozhraní SAPI-SK 1.0: autentizace, firmy, doklady, webhooky, chyby a limity.

Úvod

Verteco API je REST nad HTTPS. Request i response jsou JSON (UTF-8). Začněte vytvořením účtu, potom API tokenu, a udělejte první volání do minuty. Všechny cesty jsou relativní vůči základní URL níže.

Celé testovací prostředí najdete na test.peppol.verteco.digital. Chová se stejně jako produkce, navíc má testovací nástroje (FS webhook, verifikační token, odstranění firmy) a simulovaný výběr poskytovatele namísto portálu Finanční správy.

Base URL
https://peppol.verteco.digital/api/v1
Verze
v1 (v cestě). Zpětně nekompatibilní změny přijdou pod novou verzí.
Protokol
HTTPS only · TLS 1.2+ · TLS A+
Formát
application/json (UTF-8)
Auth
cookie session (portál) nebo Bearer token (server-to-server)
Časy
ISO-8601 (UTC), např. 2026-06-03T09:40:27Z

Certifikovaný AP

Reálný Peppol Access Point (Seat ID PSK001128), ne reseller. Prošli jsme OpenPeppol conformance (19/19), v produkci.

Validní doklady

Server-side validace EN 16931 + Peppol BIS 3.0 Schematron u každého přijatého I odesílaného dokladu. Doklad si umíte ověřit i předem: veřejný validátor běží na /validator (a jako API na POST /api/v1/public/peppol-validate); chyby vracíme s konkrétním pravidlem (např. BR-CO-15). Ověřené vzory pro slovenské situace (neplátce DPH, cizí měna, přenesení daňové povinnosti, dobropis, zálohy, vložené PDF) jsou na /vzory.

Multi-tenant

Jeden účet a jeden token pro N firem, ideální pro SaaS, ERP a účetní.

SK TDD automaticky

Daňové hlášení (corner-5 / TDD) Finanční správě generujeme a odesíláme za vás.

Strojové rozhraní (OpenAPI 3.1): /api/v1/openapi.json. Importujte do Postmanu, otevřete ve Swagger Editoru, nebo si přes openapi-generator vygenerujte typovaného klienta v libovolném jazyce (TS, Java, PHP, Python…). Pokrývá portálové API i SAPI-SK.

Rychlý start

Které rozhraní je pro vás

SAPI-SK 1.0 (/sapi)

Účetní nebo fakturační program, ERP, platforma pro více firem: národní rozhraní pro odesílání, příjem, stavy, doručenky a hlášení FS. Doporučené pro každou integraci, která posílá nebo čte doklady.

OAuth2 client credentials: client_id = UUID API klíče, client_secret = vpt_ klíč, 15min access token.

Portal API (/api/v1)

Správa firem, webhooků, notifikací, exportů a stahování souborů; partnerská konzole (/resellers/me). Doplňuje SAPI, nenahrazuje ho.

Authorization: Bearer vpt_… (API klíč účtu).

MCP server (/api/mcp)

AI asistent (Claude Code, Cursor, Claude Desktop) má číst doklady, ověřovat příjemce a po výslovném potvrzení odesílat.

Bearer vpt_… přes MCP klienta.

E-mail do schránky firmy

Bez programování: XML faktura jako příloha e-mailu na tajnou adresu firmy; validuje se a odešle jako z portálu.

Adresa odesílatele na seznamu + SPF/DKIM.

Účet i API token si vytvoříte v portálu (přes prohlížeč). Integrace potom běží výhradně přes API token. Registraci, přihlášení ani hesla vaše aplikace neřeší.

  1. 1

    Vytvořte si účet v portálu

    Zaregistrujte se e-mailem a potvrďte ho odkazem z e-mailu.
  2. 2

    Vygenerujte API token

    V portálu API tokeny → Vytvořit. Token vpt_… se zobrazí pouze jednou. Uložte si ho bezpečně.
  3. 3

    Udělejte první volání

    Token použijte v hlavičce Authorization:
    javascript
    const res = await fetch('https://peppol.verteco.digital/api/v1/companies', {
    headers: { Authorization: 'Bearer vpt_8f2a…' },
    });
    const companies = await res.json();
  4. 4

    Výběr poskytovatele na portálu Finanční správy

    V ostrém provozu je výběr Verteco na portálu FS (vpds.financnasprava.sk) potřebný i při čistě odesílacím použití: odemyká odesílání (Verifikační údaj) a firmu aktivuje. Příjem přitom může zůstat u poskytovatele vašeho účetního programu: příjemce má firma v síti právě jednoho, odesílatelů může mít více.

Rychlý start přes curl (nejprve v testovacím prostředí)

Šest volání od účtu po první doručenou fakturu. Všechno běží proti test.peppol.verteco.digital, kde je firma aktivní hned po vytvoření a doklady jdou do testovací sítě Peppol. Očekávané odpovědi jsou zkrácené.

shell
export BASE=https://test.peppol.verteco.digital   # production: https://peppol.verteco.digital
export KEY=vpt_…        # step 1
  1. 1

    Účet a API klíč

    Zaregistrujte se na test.peppol.verteco.digital/register (v testu bez potvrzovacího e-mailu) a na stránce API klíče vytvořte klíč. Zobrazí se jednou a používá se celý: seznam klíčů ukazuje jen jeho začátek (vpt_xxxxxxxx…) a klíč zkopírovaný odtud i s tečkami API odmítne s chybou 400. Níže jako $KEY.

  2. 2

    Ověřte klíč

    shell
    curl -s $BASE/api/v1/auth/me -H "Authorization: Bearer $KEY"
    json
    { "id": "7f1d…", "email": "dev@firma.sk", "emailVerified": true, "persona": "developer" }
  3. 3

    Vytvořte firmu

    shell
    curl -s -X POST $BASE/api/v1/companies -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{"ico":"12345678","dic":"SK2120000001","legalName":"Test s. r. o.","street":"Hlavná 1","city":"Žilina","postalCode":"01001"}'
    json
    { "id": "5c0e…", "legalName": "Test s. r. o.", "dic": "SK2120000001", "status": "active",
      "peppolParticipantId": "0245:2120000001", "verified": true }
  4. 4

    SAPI access token

    shell
    curl -s -X POST $BASE/sapi/auth/token -H "Content-Type: application/json" -d '{"grant_type":"client_credentials","client_id":"<UUID klíče ze stránky API klíče>","client_secret":"'$KEY'"}'
    json
    { "access_token": "eyJhbGciOiJIUzI1NiJ9…", "token_type": "Bearer", "expires_in": 900,
      "refresh_token": "eyJhbGciOiJIUzI1NiJ9…" }
  5. 5

    Zvalidujte doklad bez odeslání

    shell
    curl -s -X POST $BASE/sapi/document/validate -H "Authorization: Bearer $ACCESS" -H "Content-Type: application/json" -d '{"payload":"<Invoice …>","payloadFormat":"XML"}'
    json
    { "valid": true, "errors": [], "warnings": [] }
  6. 6

    Odešlete a sledujte stav

    shell
    curl -s -X POST $BASE/sapi/document/send -H "Authorization: Bearer $ACCESS" -H "X-Peppol-Participant-Id: 0245:2120000001" -H "Idempotency-Key: FA-2026-0001" -H "Content-Type: application/json" -d @send.json a potom curl -s "$BASE/sapi/document/sent?since=2026-10-01T00:00:00Z" -H "Authorization: Bearer $ACCESS" -H "X-Peppol-Participant-Id: 0245:2120000001"
    json
    HTTP/2 202
    { "providerDocumentId": "6a3f…", "status": "ACCEPTED", "peppolMessageId": "f1c7…", "receivedAt": "2026-10-03T12:00:01Z" }
    
    { "documents": [ { "documentId": "6a3f…", "status": "delivered", "sentAt": "2026-10-03T12:00:01Z",
      "deliveredAt": "2026-10-03T12:00:14Z", "hasMls": true, "fsReport": { "state": "reported" } } ] }
Přechod na produkci: vyměňte $BASE za peppol.verteco.digital, vytvořte produkční účet a klíč a nechte klienta vybrat poskytovatele na portálu Finanční správy (firma se aktivuje sama, odesílání odemkne verifikační údaj).

Testovací prostředí (sandbox)

Testovací doklady se po 60 dnech automaticky mažou: prostředí je na zkoušení, ne na archivaci. Ostrého portálu se retence netýká.

Kromě SAPI mock sandboxu (níže) provozujeme i plnohodnotné testovací prostředí, kompletní kopii tohoto portálu s oddělenými daty, kde si celý tok (registrace → firma → odeslání → přijetí → notifikace) vyzkoušíte end-to-end bez jakéhokoli dopadu na ostrý provoz.

Registrace
bez potvrzovacího e-mailu; účet je použitelný okamžitě
Schválení firmy
automatické, přímo v rozhraní nebo přes API (bez výběru na portálu Finanční správy, bez přihlášení na portál FS); hned po vytvoření firmy s IČ DPH můžete odesílat i přijímat
Registrace v síti
automatická do testovací sítě Peppol. Pozor na dvě vrstvy identifikátoru: API a portál používají stejný formát jako produkce (peppolParticipantId = 0245:<číslice DIČ>, váš integrační kód se nemění); do testovacího SMP/SML se firma technicky zapisuje jako 9950:SK<DIČ>, protože schéma 0245 vyžaduje ověřovací kód Finanční správy, který v testu neexistuje. V produkci se registruje 0245:<číslice DIČ> do ostré sítě až po výběru poskytovatele na portálu Finanční správy (přihlášení přes eID nebo přihlašovacími údaji)
Validace
reálná: EN 16931 + Peppol BIS 3.0 pravidla, stejná jako v ostrém provozu
Doručení
reálné přes testovací síť Peppol (AS4, testovací certifikát, testovací SML/SMP): příjemci registrovanému v testovací síti se faktura doručí jako přijatá (včetně e-mailu, PDF a webhooku); do ostré sítě nic neodchází
Doručenka
reálná MLS doručenka z testovací sítě
E-maily
reálně odcházejí (na adresy, které zadáte), s prefixem [TEST]
Simulace chyb
hlavička X-Sandbox-Simulate: 503 (nebo 502, 500, 429) na libovolném volání /sapi/document/* s platným tokenem vrátí odpovídající chybu; nic se nezpracuje ani neuloží. Při 500 (SAPI-PROC-500) a 429 (SAPI-SYS-003 s Retry-After) dostanete chybovou obálku SAPI; 503 a 502 projdou přes okraj sítě (DigitalOcean, Cloudflare) jako HTTP 504 s HTML tělem bez obálky, přesně tak vypadá skutečný výpadek zvenku, takže si ověříte i zpracování odpovědi, která není JSON. Chyby validace vyvoláte nevalidním XML, 429 i překročením 300 volání za minutu. V produkci se hlavička ignoruje
Cena
zdarma, bez limitů na zkoušení

Funguje tam všechno co tady: portál, REST API, SAPI-SK 1.0, e-shop pluginy i webhooky. Stačí v integraci vyměnit doménu za test.peppol.verteco.digital a použít tokeny vytvořené v testovacím prostředí. Ideální pro vývoj integrace, CI testy a zaškolení účetních před ostrým nasazením. Zkušební doklady patří jen tam: v ostrém provozu se každý domácí doklad mezi plátci DPH hlásí Finanční správě a hlášení se nedá vzít zpět. V ostrém portálu zkoušejte pouze tlačítkem „Poslat zkušební fakturu“ (0,00 €); od 1. 1. 2027 ostrý provoz čísla TEST-/VITAJTE- odmítne (test_document_in_production).

Pozn.: edge ochrana testovací domény blokuje generické hlavičky User-Agent: Python-urllib a User-Agent: Java/1.8.x (předvolený User-Agent HttpsURLConnection v Javě 8) odpovědí HTTP 403 „error code: 1010“ ještě před naším API; ostrá doména peppol.verteco.digital je propouští. Stačí nastavit vlastní User-Agent: v Javě buď parametrem JVM -Dhttp.agent=moje-app/1.0 (beze změny kódu; Java připojí „Java/1.8“, výsledný „moje-app/1.0 Java/1.8.0_xxx“ ochrana propouští, blokuje jen hlavičku začínající na „Java/1.8“), nebo na spojení conn.setRequestProperty("User-Agent", "moje-app/1.0"). Běžní klienti (requests, httpx, Java 11+, Apache HttpClient, okhttp, axios, Go, PHP, curl) fungují beze změny.

Proč se firmy schvalují automaticky

Finanční správa nemá testovací prostředí portálu VPDS: výběr poskytovatele na vpds.financnasprava.sk běží jen v produkci a ověřuje se přihlášením na portál FS (eID nebo přihlašovací údaje PFS), takže v ostrém provozu si nemůžete „vybrat“ libovolnou cizí firmu. Abyste přesto uměli integraci otestovat, v testovacím prostředí tento krok simulujeme: každá firma, kterou vytvoříte, se schválí automaticky (bez výběru na FS), takže si umíte založit odesílatele i příjemce a projít celý tok.

Pro testování FS webhooků (výběr poskytovatele) máme vlastní obdobu nástroje Finanční správy: test.peppol.verteco.digital/sandbox-nastroje. Vygenerujete si tam platný verifikační token (verifikační údaj) ve stylu FS a odešlete kompletní webhook na svůj endpoint, přesně jako to dělá portál FS při reálném výběru. Firmy vytvořené pro testování umíte zase odregistrovat (z portálu i z testovacího SMP), právě kvůli chybějícímu testovacímu režimu na straně Finanční správy.

Testovací prostředí není součástí ostré sítě Peppol: firmy se registrují do oddělené testovací sítě (testovací SMP/SML), nic neodchází na reálné endpointy a data v něm mohou být kdykoli promazána. Nepoužívejte ho na reálné faktury; na ty je ostrý provoz na peppol.verteco.digital, kde registraci do ostré sítě odemyká výběr poskytovatele na portálu Finanční správy potvrzený přihlášením (eID nebo přihlašovací údaje PFS).

Autentizace

Integrace se autentizuje API tokenem v hlavičce Authorization: Bearer vpt_…. Token vytvoříte v portálu (API tokeny); má formát vpt_ + 40 hex znaků, ukládáme jen jeho SHA-256 hash a má stejný přístup jako váš účet. Otestujte ho přes /auth/me:

curl
curl https://peppol.verteco.digital/api/v1/auth/me -H 'Authorization: Bearer vpt_8f2a…'
# 200 → { "id": "…", "email": "vy(at)firma.sk" }   (token funguje)

Při chybějícím nebo neplatném tokenu API vrátí:

json
// 401 Unauthorized
{ "error": "unauthorized", "message": "Authentication required" }
Portál (prohlížeč) používá interní session cookie (portal_session, JWT, 7 dní); při server-to-server integraci ji nepotřebujete. Veřejné bez auth jsou /ping, /openapi.json a endpointy pod /public/* (ověření peppol-check, validátor peppol-validate, detail v sekci Veřejné nástroje, a stav služby status); všechno ostatní vyžaduje session nebo Bearer token.

Konvence & formáty

TypFormátPříklad
idUUID (string)08dd6c1e-…
časové značkyISO-8601 Instant (UTC)2026-06-03T09:40:27Z
issueDatedatum (YYYY-MM-DD)2026-06-03
totalAmountdesetinné číslo120.00
chybějící hodnotynull (ne vynechané pole)"dic": null

Stránkování & idempotence

/companies a /companies/{id}/documents podporují volitelné ?page&limit (odpověď zůstává JSON pole; celkový počet najdete v hlavičkách X-Total-Count / X-Total-Pages). Bez parametrů vrátí celé pole, doklady seřazené createdAt sestupně; /tokens vrací vždy celé pole. Hlavičku Idempotency-Key podporuje národní rozhraní SAPI-SK na POST /sapi/document/send; pro programové odesílání použijte právě to.

Verzování a zpětná kompatibilita

  • Kontrakt jen roste: nová pole (vynechaná, když jsou null), nové volitelné parametry, nové endpointy a události. Existující názvy polí, hodnoty enumů a stavové kódy se nemění.
  • Nový enum nebo událost webhooku může přibýt kdykoli; klient ignoruje, co nezná, a na neznámou událost odpoví 2xx.
  • Časová razítka jsou ISO 8601 v UTC s proměnlivým počtem desetinných míst; parsujte je, neporovnávejte jako text. Částky přicházejí jako řetězce se dvěma desetinnými místy.
  • Pokud by změna nemohla být aditivní, oznámíme ji v changelogu (odběr e-mailem) nejméně 90 dnů předem a starý tvar ponecháme během přechodného období.
  • Bezpečnostní model API klíče (od 3. 10. 2026): klíč čte a odesílá doklady, spravuje firmy, notifikace a webhooky. Správu účtu a klíčů (vytvoření, rozsah a zrušení klíče, MFA, heslo, relace, pozvánky, převod firmy, podpisy smluv) provede jen přihlášená osoba; klíč tam dostane 403 token_not_allowed. GET /api/v1/tokens zůstává klíči dostupný.
  • Odregistrace ze sítě (POST /api/v1/companies/{id}/deregister) zůstává pro klíč zavřená (403 token_not_allowed) s jednou výjimkou od 19. 10. 2026: firmu pod značkou zprostředkovatele (whiteLabel: true), kterou integrace sama založila, odregistruje klíč vlastníka s důkazem webhook secretem firmy. Hlavičky X-Company-Proof-Timestamp (unix sekundy, server přijme rozdíl nejvýše 300 s) a X-Company-Proof = lowercase hex HMAC-SHA256(klíč = aktuální webhook secret firmy, zpráva = "deregister:" + companyId + ":" + timestamp). Příklad: secret vpt_0123456789abcdef0123456789abcdef01234567, companyId 9fa8fd81-2c4e-4b7a-9d3e-5f6a7b8c9d0e, timestamp 1760000000 → X-Company-Proof e7e21ebd72506453b95c4cbb87c5556a21d93a5539cc7de6b32a29b9d7090901. Nesprávný, expirovaný nebo neuplatnitelný důkaz = 403 company_proof_invalid bez bližšího důvodu; každá odregistrace má řádek v evidenci nastavení firmy.
  • Verze kontraktu je v openapi.json (info.version) a každá změna má řádek v changelogu s tagem API nebo Webhooky.

/changelog · /changelog/odber · openapi.json

Chyby

Slovník chyb ke stažení: tentýž slovník, kterým portál překládá detail odmítnutí (identifikátory pravidel EN 16931 a Peppol BIS, vzory síťových chyb, kódy statusReason z GET /sapi/document/sent), je k dispozici jako JSON na /docs/peppol-errors.json (sk, en, de, hu). Hodí se na tabulku běžných chyb v účetním programu: identifikátor pravidla hledejte v detailu kdekoli, neznámé pravidlo zobrazte i s jeho identifikátorem. Od 7. 10. 2026 má každá JSON odpověď hlavičku Content-Type: application/json;charset=UTF-8.

Chyby mají jednotný tvar s machine-readable error kódem. Validační chyby přidávají mapu fields (první chyba na pole).

json
// business chyba
{ "error": "invalid_credentials", "message": "Invalid email or password" }

// validační chyba (400)
{ "error": "validation_failed", "message": "Some fields are invalid",
"fields": { "ico": "IČO musí byť 8 číslic" } }

HTTP stavy

200 / 201 / 204
úspěch (OK / vytvořeno / bez obsahu)
400
neplatný vstup (viz error / fields)
401
chybějící nebo neplatná autentizace
403
nedostatečné oprávnění (role)
404
zdroj neexistuje nebo k němu nemáte přístup
405
nepodporovaná HTTP metoda pro danou cestu
409
konflikt (IČO / e-mail už existuje)
415
nepodporovaný Content-Type (XML endpointy očekávají application/xml)
429
překročený rate limit (hlavičky RateLimit-* a Retry-After, tělo JSON rate_limited)
Naše API odpovídá vždy JSONem s polem error. Pokud dostanete odpověď bez JSON těla (HTML nebo text jako error code: 1010 se stavem 403, případně 502/504 při nasazování), nepřišla z API, ale z infrastruktury před ním (edge ochrana, brána). Typická příčina 403/1010 je generický User-Agent knihovny (Python-urllib, Java/1.8.x na testovací doméně), řešení je v sekci Testovací prostředí.

Nejčastější chybové kódy

KódHTTPKdy
validation_failed400tělo nesplnilo validaci (viz fields)
unauthorized401chybí nebo neplatný API token
forbidden403akce vyžaduje roli owner/admin
company_not_found404firma neexistuje nebo nejste jejím členem
ico_taken409firma s tímto IČO už existuje
ico_immutable400IČO se nedá změnit
company_dic_missing400ověření odesílání bez DIČ firmy
token_invalid400verifikační údaj (podpis) nesedí
document_not_found404doklad neexistuje
token_not_found404API token neexistuje / není váš
rate_limited429příliš mnoho requestů

Výpadek přístupového bodu a opakování

  • Pokud API odpoví 502, 503 nebo 504, případně neodpoví vůbec, doklad jsme nepřevzali: zopakujte volání později se stejným Idempotency-Key, nic se neodešle dvakrát.
  • Doklad, který API přijalo (202 ACCEPTED, i s retrying: true), odejde po obnově sám: přístupový bod doručení opakuje a stav vidíte přes GET /sapi/document/sent nebo webhook; pokud doručení nakonec vzdá, doklad skončí jako selhaný a stejný klíč ho pošle znovu.
  • Příjem na úrovni sítě na portálu nezávisí: doručení, které během výpadku portálu neprošlo, odesílající přístupový bod podle pravidel Peppol zopakuje a doklad se v portálu objeví po obnově. Hlášení Finanční správě, která kvůli výpadku neodešla, doplní automatický obnovovací běh (přenosové selhání se opakuje, obsahové odmítnutí ne).
  • Stav a historii dostupnosti najdete na /status; výpadek si v testovacím prostředí nasimulujete hlavičkou X-Sandbox-Simulate (sekce Testovací prostředí).

Kódy SAPI-SK (pole error.code)

KódVýznam
SAPI-AUTH-001neplatné client_id/client_secret nebo zablokovaný účet (401)
SAPI-AUTH-002chybějící nebo neplatná hlavička Authorization: Bearer (401)
SAPI-AUTH-003klíč není oprávněn pro daného účastníka, odesílání není odemčeno nebo je pozastaveno (403)
SAPI-AUTH-004IP adresa není na allowlistu klíče (403)
SAPI-VAL-001neplatné tělo požadavku (400)
SAPI-VAL-002chybí X-Peppol-Participant-Id (400)
SAPI-PROC-001dočasný stav: odeslání s tímto klíčem právě probíhá, zopakujte za chvíli (502, retryable)
SAPI-PROC-002doklad odmítnut před odesláním (422 s Prefer: handling=strict)
SAPI-PROC-003bez Idempotency-Key: pod tímto číslem už byl odeslán jiný doklad (409, details: documentId, status)
SAPI-RES-001doklad neexistuje nebo nepatří účastníkovi (404)
SAPI-RES-002obsah dokladu už není uložen (retence firmy) nebo nebyl archivován (404, kód zůstává kvůli kompatibilitě)
SAPI-RES-003 / 004příloha nebo doručenka MLS zatím neexistuje (404)
SAPI-SYS-001 / 002dočasná chyba infrastruktury nebo validátoru (503/502, retryable)
SAPI-SYS-003překročený rate limit (429, Retry-After)
SAPI-PROC-500neočekávaná chyba, correlation_id pošlete podpoře (500)

Kompletní katalog chyb portálového API (329)

Všechny kódy, které backend vrací v poli error, s textem, který zobrazuje portál (do doplnění českého slovníku ve slovenštině). Seznam se generuje z téhož slovníku, který používá rozhraní, takže nemůže zastarat.

Kompletní katalog chyb portálového API
account_existsPre tento e-mail už účet existuje. Prihláste sa a pozvánku prijmite v portáli.
account_inactiveVáš účet nie je aktívny. Kontaktujte nás, prosím.
account_under_reviewVáš účet práve overujeme. Zavolajte nám alebo napíšte na [email protected].
acknowledge_requiredPotvrďte, že rozumiete rizikám sťahovania bez autorizácie.
acknowledgement_requiredPotvrďte, že rozumiete dôsledkom ukončenia zmluvy.
address_book_fullAdresár je plný. Odstráňte nepoužívaných klientov a skúste znova.
admin_email_unverifiedPrístup do administrácie vyžaduje potvrdený e-mail. Kliknite na odkaz v správe, ktorú sme vám poslali pri registrácii.
admin_mfa_requiredPrístup do administrácie vyžaduje zapnuté dvojfaktorové overenie. Zapnite si ho v Nastaveniach.
ai_budgetRozpočet na AI návrhy je vyčerpaný alebo ste dosiahli denný limit. Odpoveď napíšte ručne.
ai_failedNávrh odpovede sa nepodarilo vygenerovať. Skúste to znova.
ai_unavailableAI návrhy odpovedí momentálne nie sú k dispozícii.
already_completedPrevod firmy už bol dokončený.
already_memberTento používateľ už má prístup (je členom firmy alebo vášho tímu).
attachment_externalTáto príloha je uložená u odosielateľa ako odkaz, nie priamo vo faktúre.
attachment_invalidNiektorú prílohu nebolo možné odoslať (nepovolený typ, poškodený obsah alebo prekročená veľkosť). Skontrolujte prílohy a skúste znova.
attachment_not_foundPríloha sa nenašla.
attachment_not_readablePrílohu sa nepodarilo prečítať.
billing_unconfiguredPlatby predplatného zatiaľ nie sú k dispozícii.
blockedNa túto adresu nemôžeme testovací webhook poslať (lokálne alebo interné adresy nie sú povolené).
body_requiredNapíšte, prosím, text správy.
body_too_longSpráva môže mať najviac 4000 znakov.
cannot_change_selfVlastnú rolu si nemôžete zmeniť. Požiadajte druhého správcu firmy.
cannot_invite_selfNemôžete pozvať sami seba ani prijať vlastnú pozvánku.
cannot_release_to_selfFirma už je pod týmto účtom.
cannot_remove_ownerVlastníka firmy nemožno odstrániť. Vlastníctvo sa mení prevodom firmy.
cannot_restrict_adminÚčet správcu portálu sa takto obmedziť nedá.
cannot_transfer_selfFirma už patrí tomuto e-mailu.
captcha_failedOverenie proti robotom zlyhalo. Skúste to znova.
captcha_requiredOverenie proti robotom zlyhalo, obnovte stránku a skúste znova.
channel_unknownStarý záznam bez známeho kanála sa nedá zopakovať. Použite ručný re-POST na správny endpoint.
chat_not_foundKonverzácia sa nenašla alebo je prázdna.
client_not_foundFirma nepatrí pod tento partnerský účet.
client_not_removableFirmu sa nedá odstrániť: je overená Finančnou správou, aktívna, registrovaná v SMP alebo má doklady. Použite odpojenie (release).
company_activeAktívnu firmu nie je možné odstrániť.
company_address_requiredPred odoslaním faktúry doplňte sídlo firmy (ulica, mesto, PSČ) v detaile firmy.
company_already_activeFirma je už aktívna, pokyny na aktiváciu nie sú potrebné.
company_dic_missingNajprv doplňte DIČ firmy, potom skúste overenie znova.
company_incompletePred podpisom doplňte údaje firmy: obchodné meno, Peppol identifikátor a úplné sídlo.
company_limitDosiahli ste maximálny počet firiem na účet. Kontaktujte podporu, limit vám zvýšime.
company_name_mismatchObchodné meno sa nezhoduje s oficiálnym registrom (ŽR/OR SR) pre zadané IČO.
company_not_activeMigračný kód možno vydať len aktívnej firme zaregistrovanej v sieti Peppol.
company_not_foundFirma sa nenašla.
company_not_registeredFirma ešte nie je aktivovaná: dokončite výber Verteco na portáli Finančnej správy, potom môžete odosielať.
company_not_verifiedMigrácia je možná až po výbere Verteco na portáli Finančnej správy (firma musí byť aktívna a overená).
company_proof_invalidDôkaz firmy (X-Company-Proof) nie je platný. Cez API sa dá odregistrovať len firma pod značkou sprostredkovateľa, s platným webhook secretom a časovou pečiatkou do 5 minút.
company_verified_lockedObchodné meno overenej firmy sa dá zmeniť len podľa oficiálneho registra. Najprv doplňte IČO alebo nám napíšte.
confirm_name_mismatchZadaný názov sa nezhoduje s názvom zapísaného sprostredkovateľa.
confirmation_requiredPodpis vyžaduje potvrdenie vášho oprávnenia a súhlasu so znením.
conflictTakýto záznam už existuje.
content_unavailableObsah tohto dokladu už nie je uložený alebo sa nedá prečítať ako faktúra.
contract_pendingZmluvný vzťah vzniká prvým vstupom do portálu (čl. 4 VOP); pri tejto firme sme ho zatiaľ nezaznamenali, vyhotovenie zmluvy preto ešte nie je možné.
country_invalidKrajina musí byť dvojpísmenový kód ISO (SK, CZ, AT, DE…), nie názov.
country_outside_euOnline žiadosť prijímame od subjektov so sídlom v členskom štáte EÚ. Subjekt mimo EÚ nám napíše na [email protected].
current_ip_missingZoznam musí obsahovať aj vašu aktuálnu IP adresu, inak by ste sa po odhlásení zamkli.
daily_limitDosiahli ste denný limit správ. Skúste to zajtra alebo nám napíšte na [email protected].
delivery_failedTestovací webhook sa nepodarilo doručiť, váš endpoint neodpovedal.
delivery_not_foundZáznam o doručení webhooku sa nenašiel.
deregister_cooldownZ jednej IP adresy možno odstrániť najviac jednu firmu za 60 sekúnd. Skúste to o chvíľu.
dic_immutablePeppol identifikátor sa nedá zmeniť: je to identita firmy v sieti Peppol.
dic_requiredZadajte DIČ firmy (SK + 10 číslic).
dic_takenFirma s týmto DIČ už v portáli existuje.
directory_unavailableCentrálne SMP momentálne neodpovedá alebo zmenu neprijalo. Skúste to o chvíľu znova.
document_no_xmlUložené originálne XML už neexistuje, hlásenie sa nedá znova vytvoriť.
document_not_foundDoklad sa nenašiel.
document_too_largeDokument je príliš veľký (limit 3 MB).
domestic_subjectSlovenský subjekt podáva žiadosť po prihlásení na stránke /sprostredkovatel/ziadost.
duplicate_invoice_numberDoklad s týmto číslom už bol odoslaný. Nový doklad musí mať iné číslo; rovnaký doklad sa druhýkrát neodosiela.
email_change_cooldownPotvrdzovací e-mail sme už poslali. Ďalší môžete vyžiadať o 10 minút.
email_invalidZadajte platnú e-mailovú adresu.
email_not_verifiedNajprv potvrďte svoj e-mail. Odkaz sme vám poslali.
email_send_company_not_activePrijímanie na e-mail sa dá zapnúť až pre aktívnu firmu s Peppol identifikátorom.
email_send_unavailablePrijímanie faktúr e-mailom nie je v tomto prostredí zapnuté.
email_takenTúto e-mailovú adresu už používa iný účet.
email_unchangedToto je vaša súčasná e-mailová adresa.
empty_documentVložte XML faktúry.
empty_ideaNapíšte, prosím, čo by sme mali zlepšiť.
empty_messageSpráva je prázdna.
empty_replyOdpoveď je prázdna.
entry_not_foundKlient v adresári sa nenašiel.
export_format_unknownNeznámy formát exportu.
export_too_largeJeden export obsiahne najviac 10 000 dokladov. Zúžte obdobie alebo si nastavte pravidelný export na záložke Notifikácie.
forbiddenNa túto akciu nemáte oprávnenie.
forwarder_unreachableSlužba spracovania dokladov neodpovedá. Skúste to o chvíľu.
fs_change_already_sentŽiadosť už odišla Finančnej správe, zrušiť sa nedá. Ak treba, podajte novú.
fs_change_confirm_requiredPotvrďte, že žiadate o všetky zmeny naraz.
fs_change_cooldownĎalšiu žiadosť o zmenu môžete podať až 48 hodín po poslednej.
fs_change_field_readonlyIČO a DIČ sa meniť nedajú; zmena identity subjektu je nový zápis.
fs_change_no_changesNezadali ste žiadnu zmenu oproti údajom u Finančnej správy.
fs_change_not_foundŽiadosť o zmenu sa nenašla.
fs_change_not_openŽiadosť je už uzavretá.
fs_change_not_queuedOdoslať hneď sa dá len žiadosť, ktorá čaká na odoslanie.
fs_change_pendingJedna žiadosť o zmenu už čaká alebo je u Finančnej správy. Ďalšiu podáte po jej vybavení.
fs_secret_invalidKľúč má 32 znakov (číslice a písmená a až f). Skopírujte celý obsah súboru .txt zo zipu od Finančnej správy.
fs_secret_mismatchKľúč nesedí s podpisom volaní, ktoré Finančná správa na váš endpoint už poslala. Skontrolujte zip a skopírovaný kľúč; ak vaša proxy telo volania mení, napíšte nám.
has_documentsFirma má doklady v archíve, jej odstránenie je zablokované (zákonná archivácia).
holding_unavailableOdpojenie klienta momentálne nie je možné. Kontaktujte podporu.
iban_invalidIBAN nemá platný tvar. Skontrolujte číslo účtu (dve písmená krajiny, dve kontrolné číslice a číslo účtu, napríklad SK31 1200 0000 1987 4263 7541).
ico_immutableIČO sa nedá zmeniť.
ico_requiredIČO je povinné (8 číslic).
ico_takenFirma s týmto IČO už existuje pod iným účtom. Prihláste sa ním alebo nám napíšte.
instructions_cooldownPokyny k tejto firme sme už poslali. Znova ich možno poslať po 24 hodinách.
integration_not_foundNeznáma integrácia.
internalNastala neočakávaná chyba. Skúste to znova.
internal_errorNastala neočakávaná chyba na serveri. Skúste to znova, chybu sme zaznamenali.
invalid_actionNeznáma akcia.
invalid_afterParameter after musí byť dátum a čas v tvare ISO 8601 (napr. 2026-09-05T10:00:00Z).
invalid_amountSuma musí byť číslo.
invalid_billing_modelNeznámy fakturačný model. Vyberte jeden z ponúkaných modelov.
invalid_countryVyberte krajinu sídla.
invalid_credentialsNesprávny e-mail alebo heslo.
invalid_current_passwordAktuálne heslo nie je správne.
invalid_dateDátum musí byť v tvare RRRR-MM-DD.
invalid_default_companyPredvolená firma musí byť jedna z vašich firiem.
invalid_dicZadajte platné DIČ (10 číslic, prípadne s predponou SK) alebo IČ DPH.
invalid_directionSmer dokladov musí byť „odoslané“ alebo „prijaté“.
invalid_due_daysSplatnosť musí byť 0 až 365 dní.
invalid_emailZadajte platnú e-mailovú adresu.
invalid_feed_urlAdresa feedu musí začínať https://.
invalid_icoZadajte platné IČO (8 číslic) alebo registračné číslo spoločnosti.
invalid_idZadajte slovenské IČ DPH alebo DIČ (napr. SK2121358349), alebo Peppol ID (napr. 0245:2121358349).
invalid_idsZoznam dokladov nie je platný.
invalid_invitePozvánka je neplatná alebo už bola použitá.
invalid_ip_entryZoznam obsahuje neplatnú položku. Povolené sú IP adresy (napr. 185.76.8.211) a rozsahy CIDR (napr. 185.76.8.0/24).
invalid_keyKľúč sprostredkovateľa musí mať 3 až 40 znakov: malé písmená, číslice a pomlčky.
invalid_limitLimit musí byť aspoň 1, alebo prázdny (predvolená hodnota).
invalid_linkPrihlasovací odkaz je neplatný alebo už vypršal. Vyžiadajte si nový.
invalid_localeNepodporovaný jazyk.
invalid_monthMesiac musí byť v tvare RRRR-MM.
invalid_notification_emailJedna z adries nie je platný e-mail:
invalid_notify_eventNeznáma udalosť notifikácie.
invalid_notify_localeJazyk e-mailov musí byť slovenčina, angličtina, nemčina alebo maďarčina.
invalid_notify_modeNeznámy režim notifikácií. Vyberte: každá udalosť, denný súhrn, týždenný súhrn alebo žiadne.
invalid_passwordNesprávne heslo.
invalid_patternFormát číslovania musí mať najviac 64 znakov a obsahovať poradové číslo {N}, {NNN} alebo {NNNN} presne raz.
invalid_payloadFaktúra (XML) chýba alebo je príliš veľká.
invalid_personaNeznáma rola účtu.
invalid_phoneTelefón zadajte v tvare +421 9xx xxx xxx (číslice, medzery, prípadne pomlčky).
invalid_prefsNastavenia zobrazenia obsahujú neplatnú hodnotu a nepodarilo sa ich uložiť.
invalid_receiverPríjemca musí mať Peppol identifikátor v tvare schéma:hodnota (napr. 0245:2121358349).
invalid_requestChýbajú povinné údaje (napr. názov firmy, DIČ s 10 číslicami, platný e-mail alebo adresa endpointu).
invalid_roleRola musí byť správca, člen alebo iba na čítanie.
invalid_seqĎalšie poradové číslo musí byť aspoň 1.
invalid_sessionNeplatná konverzácia. Obnovte stránku a skúste znova.
invalid_signatureNotifikáciu o platbe sa nepodarilo overiť.
invalid_signupRegistrácia už nie je platná alebo vypršala. Začnite registráciu znova.
invalid_sortNeznáme triedenie.
invalid_stateNeznámy stav.
invalid_statusNeznámy stav.
invalid_tagŠtítok nemôže byť prázdny.
invalid_tokenOdkaz je neplatný alebo už bol použitý.
invalid_vpds_urlVýberový odkaz musí začínať https://vpds.financnasprava.sk/.
invalid_webWeb musí byť platná adresa (https://...).
invalid_webhook_urlWebhook URL musí byť platná https:// adresa (najviac 512 znakov).
invalid_windowČasové okno nie je platné: začiatok musí byť pred koncom a okno najviac 31 dní.
invalid_xmlXML dokladu sa nedá prečítať (poškodený súbor alebo nepovolená deklarácia DOCTYPE).
invite_email_mismatchTáto pozvánka je určená pre inú e-mailovú adresu. Prihláste sa účtom, na ktorý prišla.
invite_expiredPlatnosť pozvánky vypršala. Požiadajte o novú.
ip_not_allowedPrihlásenie z tejto IP adresy nie je pre tento účet povolené.
lead_no_emailKontakt nemá e-mailovú adresu, nedá sa osloviť.
lead_not_contactableOsloviť možno len kontakt v stave „nový“.
lead_not_foundKontakt sa nenašiel.
link_goneTento odkaz už nie je platný (vypršal, bol zrušený alebo obsah dokladu už nie je uložený).
lookup_unavailableRegister alebo overenie je momentálne nedostupné. Skúste to o chvíľu.
malformed_requestPožiadavka nemá platný tvar. Obnovte stránku a skúste znova.
manager_requiredTúto zmenu môže urobiť len vlastník alebo správca firmy.
member_is_ownerTento používateľ je vlastníkom firmy. Vlastníctvo sa mení prevodom firmy.
member_not_foundČlen sa nenašiel.
members_fullFirma dosiahla maximálny počet členov.
method_not_allowedTáto operácia nie je pre danú adresu podporovaná.
mfa_already_enabledDvojfaktorové overenie už máte zapnuté.
mfa_code_invalidKód nesedí. Skúste aktuálny kód z aplikácie alebo záložný kód.
mfa_not_enabledZáložné kódy patria k dvojfaktorovému overeniu. Najprv ho zapnite.
mfa_not_startedNajprv spustite nastavenie dvojfaktorového overenia.
mfa_requiredZadajte kód z autentifikačnej aplikácie.
migration_code_livePredošlý migračný kód je stále platný. Najprv ho zrušte.
migration_code_noneŽiadna aktívna žiadosť o migračný kód.
migration_code_pendingŽiadosť o migračný kód už prebieha.
migration_code_rejectedSMP migračný kód neprijalo. Overte kód u predchádzajúceho poskytovateľa, kódy sú jednorazové a časovo obmedzené.
migration_code_requiredZadajte migračný kód od predchádzajúceho poskytovateľa.
migration_rejectedCentrálne SMP požiadavku o prevzatie odmietlo. Skúste to znova alebo nám napíšte.
missing_fieldsNázov a e-mail vlastníka sú povinné.
missing_parameterV požiadavke chýba povinný parameter.
mls_not_availablePre tento doklad zatiaľ nie je doručenka (MLS) k dispozícii.
name_requiredZadajte názov (meno klienta alebo obchodné meno).
no_billing_accountZatiaľ nemáte fakturačný účet. Najprv nastavte predplatné.
no_bodyZáznam nemá uložené telo požiadavky, nedá sa zopakovať.
no_contentObsah dokladu už nie je k dispozícii, odkaz sa nedá vydať.
no_dicFirma nemá DIČ.
no_documentsZa zvolené obdobie nie sú žiadne doklady (s uloženým XML).
no_evidencePre tento doklad nie je uložený originál XML ani doručenka.
no_idsVyberte aspoň jeden doklad.
no_ownerFirma nemá vlastníka. Použite priame preradenie.
no_secretPodpisový kľúč zatiaľ neexistuje. Najprv nastavte notifikačnú webhook URL.
no_verification_tokenFirma nemá uložený verifikačný údaj z Finančnej správy, registrácia do SMP ho vyžaduje.
not_a_resellerTento účet nie je vlastníkom zápisu sprostredkovateľa.
not_acceptableServer odpovedá len vo formáte JSON.
not_available_for_white_labelPre firmy pod značkou sprostredkovateľa nie je táto voľba dostupná.
not_failedOpakovať možno len nedoručené webhooky.
not_foundZáznam sa nenašiel.
not_resellerTento účet nie je vlastníkom zápisu sprostredkovateľa.
not_sandbox_rowTento zápis sprostredkovateľa spravuje správca, z účtu sa nedá vypnúť.
note_too_longPoznámka môže mať najviac 200 znakov.
notification_emails_too_longAdresy sú spolu príliš dlhé (najviac 256 znakov).
owner_not_foundÚčet vlastníka s týmto e-mailom neexistuje. Najprv ho vytvorte.
owner_of_companiesPre zmazanie účtu najprv požiadajte o migračný kód alebo firmu odregistrujte zo siete Peppol. Potom budete môcť účet vymazať natrvalo.
owner_requiredTúto akciu môže vykonať len vlastník účtu firmy.
participant_not_registeredFirma zatiaľ nemá záznam v centrálnom SMP pod Verteco; zverejnenie nastavíte po registrácii.
partner_managedZmluvný vzťah tejto firmy vedie jej sprostredkovateľ; potvrdenie o zmluve vystavuje on.
party_missing_in_textPodpisované znenie neobsahuje identifikáciu firmy. Obnovte stránku a skúste znova.
password_already_setHeslo už máte nastavené. Použite zmenu hesla.
password_not_setÚčet nemá nastavené heslo. Nastavte si ho v Nastaveniach a skúste znova.
password_requiredNajprv si nastavte heslo (Zabezpečenie), potom môžete túto zmenu potvrdiť.
payment_mismatchPlatbu sa nepodarilo spárovať so žiadosťou. Kontaktujte nás, prosím.
payment_unconfiguredPlatba momentálne nie je dostupná. Skúste neskôr alebo nás kontaktujte.
pdf_unavailableGenerovanie PDF je dočasne nedostupné. Skúste to o chvíľu alebo použite Vytlačiť / PDF.
profile_too_longNiektoré pole prezentácie je príliš dlhé. Skráťte text.
public_link_existsDoklad už má aktívny odkaz. Ak ho chcete nahradiť, zvoľte nahradenie odkazu.
public_links_disabledFirma nemá zapnuté sťahovanie faktúr bez autorizácie. Zapne ho vlastník v detaile firmy (Archív dát).
public_links_unavailableVerejné odkazy na doklady sú momentálne vypnuté.
rate_limitedPríliš veľa požiadaviek. Skúste to o chvíľu.
read_only_memberRola „iba na čítanie“ nemôže meniť stav ani štítky dokladov.
received_onlyVerejný odkaz sa vydáva len na prijaté doklady.
receiving_toggle_cooldownPríjem sa dá prepnúť najviac trikrát za hodinu. Ďalšia zmena bude možná, keď od najstaršej z posledných troch zmien uplynie hodina.
registered_elsewhereÚčastník je stále zaregistrovaný u iného poskytovateľa; kód prevzatie nespustil.
renderer_unavailableNáhľad sa teraz nedá vykresliť (vykresľovacia služba sa reštartuje). Skúste to o chvíľu znova; odoslanie faktúry to neblokuje.
reply_already_cancelledTúto odpoveď medzitým zrušil iný pracovník.
reply_already_sentTáto odpoveď už bola odoslaná, nedá sa zrušiť ani poslať znova.
reply_not_foundNaplánovaná odpoveď sa nenašla.
reply_to_invalidAdresa pre výsledky nemá tvar e-mailu.
representative_incompleteUveďte meno aj funkciu osoby oprávnenej konať, alebo nechajte obe polia prázdne.
request_rejectedPožiadavka obsahuje nepovolený znak v hlavičke alebo adrese. Ak posielate API kľúč, použite celý client_secret zobrazený pri vytvorení (zoznam kľúčov ukazuje len začiatok s …) a rovné úvodzovky.
reseller_not_foundSprostredkovateľ sa nenašiel.
reseller_ownerVáš účet vlastní zápis sprostredkovateľa. Prenos zápisu dohodnite s podporou, potom budete môcť účet zmazať.
reseller_requiredTáto časť je len pre účet zapísaného sprostredkovateľa.
sbd_not_availableTento doklad nemá uloženú prenosovú obálku (SBDH). Stiahnite XML dokladu.
schedule_not_foundTento pravidelný export už neexistuje.
sender_email_invalidAdresa odosielateľa nemá tvar e-mailu.
sender_email_systemSystémové adresy (noreply, postmaster, mailer-daemon…) nemožno pridať; použite schránku osoby alebo fakturačného systému.
sender_existsTáto adresa už je medzi povolenými odosielateľmi.
sender_limitPovolených odosielateľov môže byť najviac 20.
sending_not_verifiedOdosielanie nie je povolené: firma ešte nemá overený výber poskytovateľa na portáli Finančnej správy.
sending_pausedOdosielanie je pre túto firmu pozastavené jej spravujúcim účtom. Príjem faktúr beží ďalej.
service_unavailableSlužba je dočasne nedostupná. Skúste to, prosím, o chvíľu.
session_fullTáto konverzácia je príliš dlhá. Obnovte stránku a začnite novú.
session_not_foundZariadenie sa nenašlo.
shoptet_feed_blockedAdresa smeruje na neverejnú sieť. Vložte verejnú adresu vášho e-shopu.
shoptet_feed_httpShoptet adresu odmietol. Skontrolujte hash v adrese a či export nie je obmedzený na konkrétnu IP adresu.
shoptet_feed_invalid_xmlOdpoveď exportu nie je platné XML. Skontrolujte adresu v Shoptete.
shoptet_feed_not_configuredPrepojenie so Shoptetom ešte nie je nastavené.
shoptet_feed_not_orders_xmlToto nie je export objednávok zo Shoptetu: adresa musí končiť na /export/orders.xml.
shoptet_feed_not_system_xmlVložte adresu systémového exportu „Systémový Shoptet XML“ (v adrese má patternId=-11). Vlastné šablóny, CSV ani XLS nepodporujeme.
shoptet_feed_too_largeOdpoveď exportu je príliš veľká (nad 10 MB). Objednávky si pýtame po týždňoch, takže taká odpoveď býva export produktov, nie objednávok. Skontrolujte typ exportu.
shoptet_feed_unreachableExport zo Shoptetu neodpovedal. Skúste to o chvíľu znova; Shoptet dovoľuje len jeden export naraz.
sidlo_incompleteSídlo musí obsahovať ulicu, PSČ a mesto, napríklad „Ulica 1, 010 01 Mesto“.
smp_cancel_failedZrušenie kódu v centrálnom SMP sa nepodarilo. Skúste to o chvíľu alebo napíšte na [email protected].
smp_deregister_failedOdregistrácia zo siete Peppol sa nepodarila. Skúste to o chvíľu znova.
smp_held_elsewhereRegistráciu tejto firmy drží iný poskytovateľ. Migračný kód od nás nie je potrebný.
smp_not_testTestovacie prostredie nie je správne prepojené s testovacím SMP. Napíšte nám.
smp_unavailableCentrálne SMP momentálne neodpovedá; skúste to o chvíľu znova.
smtp_fromAddress_requiredZadajte adresu odosielateľa.
smtp_fromAddress_too_longAdresa odosielateľa je príliš dlhá.
smtp_from_forbiddenAdresa odosielateľa nemôže byť na doméne Verteco.
smtp_from_invalidAdresa odosielateľa nemá tvar e-mailu.
smtp_from_not_yoursAdresa odosielateľa musí byť na doméne vašej firmy (ako e-mail vlastníka, člena alebo notifikačný e-mail firmy).
smtp_from_takenTúto adresu odosielateľa už používa iná firma.
smtp_host_blockedServer sa nedá nájsť v DNS alebo nie je verejne dosiahnuteľný (interné adresy nie sú povolené).
smtp_host_invalidZadajte doménové meno servera (napr. smtp.firma.sk), nie IP adresu.
smtp_host_requiredZadajte adresu SMTP servera.
smtp_host_too_longAdresa SMTP servera je príliš dlhá.
smtp_incompleteVyplňte server, port, prihlasovacie meno, heslo a adresu odosielateľa.
smtp_password_invalidHeslo nesmie obsahovať medzery ani nové riadky.
smtp_password_requiredZadajte heslo k SMTP účtu (pri zmene servera ho treba zadať znova).
smtp_port_not_allowedPovolené porty sú 465, 587 a 2525.
smtp_security_invalidZabezpečenie musí byť STARTTLS alebo SSL.
smtp_test_cooldownSkúšobný e-mail možno poslať raz za minútu. Skúste to o chvíľu.
smtp_test_failedSkúšobný e-mail sa nepodarilo odoslať. Skontrolujte nastavenia SMTP servera.
smtp_username_invalidPrihlasovacie meno nesmie obsahovať medzery ani nové riadky.
smtp_username_requiredZadajte prihlasovacie meno k SMTP účtu.
smtp_username_too_longPrihlasovacie meno je príliš dlhé.
state_not_for_directionTento stav nie je možný pre daný smer dokladu (prijatý alebo odoslaný).
stripe_errorPlatobnú bránu sa nepodarilo otvoriť alebo platbu overiť. Skúste to znova.
support_not_on_sandboxPodpora beží na ostrom portáli peppol.verteco.digital, nie v testovacom prostredí.
tag_too_longŠtítok je príliš dlhý.
target_blockedCieľový účet je zablokovaný, prevod naň nie je možný.
team_fullDosiahli ste maximálny počet členov tímu.
termination_confirmedPotvrdenú výpoveď nie je možné zrušiť z aplikácie. Napíšte na [email protected].
termination_pendingŽiadosť o výpoveď už prebieha. Potvrďte ju cez odkaz v e-maile alebo ju zrušte.
terms_not_acceptedNa vytvorenie účtu je potrebné súhlasiť s obchodnými podmienkami.
test_document_in_productionSkúšobné doklady (číslo TEST-… alebo VITAJTE-…) sa od 1. 1. 2027 cez ostrú sieť neodosielajú. Na skúšky použite testovacie prostredie test.peppol.verteco.digital.
ticket_link_expiredPožiadavka je uzavretá dlhšie ako 90 dní, odkaz už nie je platný. Napíšte nám znova na [email protected].
ticket_not_foundPožiadavka sa nenašla alebo odkaz nie je platný.
token_companies_requiredVyberte aspoň jednu firmu, ku ktorej má mať kľúč prístup.
token_company_not_allowedTento API kľúč nemá prístup k tejto firme (bol vytvorený len pre vybrané firmy).
token_company_not_memberKľúč môže mať prístup len k firmám, ktorých je váš účet členom.
token_expiredPlatnosť odkazu vypršala. Vyžiadajte si nový.
token_invalidOdkaz alebo verifikačný údaj je neplatný, prípadne už neplatí.
token_limitMáte príliš veľa aktívnych API kľúčov (max 50). Zrušte nepoužívané a skúste znova.
token_not_allowedToto nastavenie sa mení len po prihlásení v portáli, nie cez API kľúč.
token_not_foundAPI kľúč sa nenašiel.
token_not_revokedTento API kľúč je aktívny, nie je čo obnovovať.
token_restore_expiredKľúč bol zrušený pred viac ako 7 dňami a už sa nedá obnoviť. Vytvorte nový kľúč.
token_scope_invalidRozsah kľúča musí byť „všetky firmy“ alebo „vybrané firmy“.
too_many_idsNaraz možno spracovať najviac 500 dokladov.
too_many_notification_emailsZadajte najviac 5 e-mailových adries.
too_many_schedulesFirma môže mať najviac päť pravidelných exportov. Ak chcete pridať ďalší, najprv niektorý zmažte.
too_many_tagsDoklad má príliš veľa štítkov.
too_many_ticketsMáte príliš veľa otvorených požiadaviek. Počkajte, prosím, na odpoveď.
transfer_canceledPrevod firmy bol zrušený.
transfer_expiredPlatnosť odkazu na prevod vypršala. Požiadajte o nový prevod.
transfer_staleVlastníctvo firmy sa medzičasom zmenilo, prevod bol zrušený.
unauthorizedPrihláste sa znova.
unknown_documentPodpísať možno len dokumenty DPA, SLA a NDA.
unsupported_documentNáhľad vie vykresliť len faktúru alebo dobropis (UBL Invoice alebo CreditNote).
unsupported_media_typeTento typ obsahu server neprijíma. Odošlite údaje vo formáte JSON.
user_not_foundÚčet s týmto e-mailom sa nenašiel. Používateľ sa musí najprv zaregistrovať.
validation_failedNiektoré polia nie sú vyplnené správne.
validator_unavailableValidácia je momentálne nedostupná. Skúste to o chvíľu.
verification_code_rejectedSMP neprijalo verifikačný údaj z výberu na portáli Finančnej správy; zopakujte výber.
verification_token_missingChýba verifikačný údaj z výberu na portáli Finančnej správy; zopakujte výber a skúste znova.
verified_company_requiredŽiadosť môže podať len účet s aspoň jednou overenou firmou.
version_staleZnenie dokumentu sa medzičasom zmenilo. Obnovte stránku a podpíšte aktuálne znenie.
webhook_not_configuredNajprv nastavte a uložte webhook URL.
webhook_url_https_requiredWebhook URL musí v produkcii začínať https:// (doručenie nesie identifikátory zákazníka a podpis).
webhook_url_unreachableWebhook URL musí byť verejne dosiahnuteľná. Localhost a interné siete nie sú z našich serverov dostupné.
white_label_owner_fixedFirmu vedenú cez partnera spravuje partnerský účet. Ďalšieho vlastníka pridá partner uvoľnením firmy alebo výber Verteco na portáli Finančnej správy.
wrong_endpointToto nie je adresa na získanie tokenu. Použite POST /sapi/auth/token s client_id a client_secret.
xml_not_availablePre tento doklad nie je uložené pôvodné XML, obsah už nie je k dispozícii.
xml_requiredChýba XML dokladu, náhľad sa nedá vykresliť.
xml_too_largeDoklad je priveľký na náhľad (najviac 8 MB vrátane príloh).

Rate limity

API je chráněno rate limitingem v 60sekundovém okně (per instance). Limit a zůstatek vracíme v každé odpovědi přes hlavičky; při překročení vrátí 429 Too Many Requests s Retry-After.

Běžná volání
dynamický limit s velkou rezervou, na API token (nebo session, jinak IP); aktuální hodnotu vrací hlavička RateLimit-Limit
Auth (/auth/*)
přísnější limit na IP (anti brute-force; mimo /auth/me a /auth/logout)
RateLimit-Limit
limit v okně
RateLimit-Remaining
kolik ještě zbývá
RateLimit-Reset
sekund do resetu okna
Retry-After
sekund do dalšího pokusu (při 429)
http
HTTP/2 429 Too Many Requests
RateLimit-Limit: <limit v okně>
RateLimit-Remaining: 0
RateLimit-Reset: 37
Retry-After: 37

{ "error": "rate_limited", "message": "Too many requests. Slow down." }
Praktické odpovědi integrátorům:
  • Slevy a zaokrouhlování: pravidla R040 (částka slevy = základ × % / 100) i R120 (částka řádku = množství × cena − slevy řádku) mají toleranci 0,02 €; přesné je pouze R046 pro slevu na úrovni ceny (PriceAmount = BaseAmount − Amount). Jednotková cena (BT-146) ani ceníková cena a sleva z ceny (BT-147, BT-148) nemají omezený počet desetinných míst, všechny ostatní částky mají 2. Pokud váš systém uplatňuje slevu na jednotkovou cenu a zaokrouhluje ji, zapište ji na úrovni ceny: PriceAmount = zaokrouhlená cena po slevě, BaseAmount = ceníková cena, Amount = přesný rozdíl, částka řádku = round(množství × PriceAmount, 2); procento tam uvést nelze (patří do poznámky řádku). Druhá možnost je řádková sleva jen částkou s kódem 95; procento a základ v řádkové slevě uvádějte jen tehdy, když základ = round(množství × exportovaná PriceAmount, 2) a Amount = round(základ × % / 100, 2). Záporné množství s kladnou cenou (vrácené zboží, odpočet zdaněné zálohy) je dovoleno i v dobropisu i ve faktuře. Vzory 11, 15 a 16 na /vzory.
  • Limity jsou vázané na přihlašovací údaj, ne na IP: 300 volání za minutu na API token (SAPI: na access token), auth endpointy 20 za minutu na IP a ochranný strop 600 za minutu na IP pro /api/v1. Serverové integraci za jednou IP to nepřekáží; vyšší limity nastavíme na požádání, napište očekávanou špičku.
  • Kapacita: objem není omezen ceníkem, odesílání je asynchronní (volání doklad předá a doručení běží na pozadí) a dávkové volání přijme až 100 dokladů najednou; při plánované špičce nám předem napište očekávaný objem a zvedneme limit klíče.
  • Polling je plnohodnotná cesta: GET /sapi/document/sent a /receive s ?since a ?until každých 1 až 5 minut; webhooky jsou doplněk, ne podmínka.
  • Časová razítka (§ 76a odst. 2 písm. d): sentAt = předání doručovací službě (tím je podle § 85o odst. 11 splněna povinnost vystavitele), deliveredAt = potvrzení AP příjemce doručenkou MLS, fsReportedAt = hlášení FS; u přijatých dokladů creationDateTime = přijetí. Všechny tři jsou v každém řádku /sapi/document/sent, v detailu /sapi/document/sent/{id} i ve webhoocích (occurredAt navíc).
  • PDF: GET /sapi/document/receive/{id}/pdf a GET /sapi/document/sent/{id}/pdf (odkaz i v links.pdf) vrátí PDF dodavatele, pokud ho doklad nese, jinak PDF vygenerované z XML; tisknutelné HTML je na …/html (portál ?format=html).
  • C#/.NET a jiné jazyky: klienta vygenerujte z OpenAPI (NSwag, Kiota, openapi-generator); vlastní NuGet balíček nedodáváme.
  • Rozsah klíče: při vytváření API klíče (stránka API klíče) zvolíte, zda má přístup ke všem firmám účtu (i těm, které přibudou později) nebo jen k vybraným. Volání s klíčem na jinou firmu vrátí 403 token_company_not_allowed (SAPI-SK: SAPI-AUTH-003); rotace klíče rozsah zachová. Klíč jen pro čtení zatím neexistuje.
  • Základní cesta: všechna volání SAPI-SK včetně našich rozšíření (GET /sapi/document/sent, GET /sapi/document/receive/{id}/pdf, GET /sapi/discovery) jdou pod /sapi s tímtéž access tokenem a hlavičkou X-Peppol-Participant-Id. Odpověď 401 „Authentication required“ bez kódu SAPI-… znamená, že cesta je mimo /sapi (například /api/v1/document/sent); /api/v1 je portálové API a jako Bearer očekává klíč vpt_, ne SAPI access token.
  • Datum vyhotovení (BT-2) nekontrolujeme vůči dni předání k doručení: doklad předáme do sítě v momentu přijetí, proto ho posílejte v den vyhotovení a neřaďte ho do fronty přes půlnoc. Doklad v cizí měně hlásíme Finanční správě s částkou daně v EUR z BT-110 a BT-111 (TaxCurrencyCode EUR), jak ukazuje vzor 03.
  • Datum dodání: v XML ho nese BT-72 (cac:Delivery/cbc:ActualDeliveryDate); doklad k přijaté platbě nese v BT-72 datum přijetí platby (vzor 12). Naše vlastní faktury za službu i doklady z portálu ho uvádějí vždy, i když se shoduje s datem vyhotovení (§ 74 odst. 1 písm. d) zákona o DPH ho vyžaduje jen při rozdílu). Při čtení berte BT-72, pokud chybí tak BT-7 (cbc:TaxPointDate), jinak datum vyhotovení.

Rozpočty rate limitu (aktuální hodnoty)

Okno je 60 sekund. Každá odpověď nese RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset a RateLimit-Policy (limit;w=okno v sekundách), při 429 i Retry-After. Hodnoty se mohou zvýšit bez oznámení; čtěte hlavičky, ne tuto tabulku.

VoláníKlíč rozpočtuLimit
/sapi/* a /api/mcp s tokenemclient_id za tokenem (rotace access tokenu rozpočet neresetuje)300 / min
/api/v1/* s API klíčem nebo sessionklíč (hash) nebo session300 / min
POST /sapi/auth/token, renew, revokeIP60 / min
/api/v1/auth/* (přihlášení, reset)IP20 / min
Veřejné nástroje (/api/v1/public/peppol-check, validator)IP15 / min
Hromadné ověření (/public/peppol-check/batch)IP6 / min
Živé ověření v síti (peppol-check, /sapi/discovery, MCP check_participant)IP nebo klíč; dohromady celý portál40 / hod na volajícího a 150 / hod celkem; nad limit odpovídá noční průzkum (source: index), hromadné ověření není omezeno
Registrace, zapomenuté heslo, kontaktní formulářIP15 / hod
Ochranný strop pro všechno s neověřeným beareremIP600 / min
http
HTTP/2 200
RateLimit-Limit: 300
RateLimit-Remaining: 287
RateLimit-Reset: 41
RateLimit-Policy: 300;w=60
Při 429 na /sapi má tělo kromě error a message i code SAPI-SYS-003, retryable true a correlation_id. Platforma s více klienty za jednou IP: napište nám očekávanou špičku, rozpočet nastavíme individuálně.

API tokeny

Opaque tokeny vpt_… pro server-to-server přístup. Plaintext se zobrazí pouze jednou při vytvoření. Uložte si ho. Ukládáme jen SHA-256 hash a 12znakový prefix pro zobrazení.

GET/tokenssession / token

Seznam vašich aktivních tokenů (bez secretu), createdAt sestupně.

POST/tokenssession / token

Vytvoří token; vrátí plaintext (jedinkrát).

PoleTypPovinnéPopis
namestringanonázev tokenu, max 128
curl
curl -X POST https://peppol.verteco.digital/api/v1/tokens -b cookies.txt \
-H 'Content-Type: application/json' -d '{"name":"moje-aplikace"}'
# 201 Created
{ "id":"…","name":"moje-aplikace","token":"vpt_8f2a…","prefix":"vpt_8f2a3b…","createdAt":"…" }
DELETE/tokens/{id}session / token

Zruší token. Vrátí 204.

Chyby: token_not_found (404)

Firmy

Firmy (IČO / IČ DPH), které spravujete. Přístup je vázán na členství: vidíte jen firmy, jejichž jste členem. Tvůrce firmy se stává jejím owner.

GET/companiessession / token

Seznam firem, jejichž jste členem (s vaší rolí).

POST/companiessession / token

Přidá firmu; stanete se owner, status = pending_verification.

PoleTypPovinnéPopis
icostringanopřesně 8 číslic
dicstringanoIČ DPH ve formátu SK + 10 číslic (např. SK2121358349); neplátce DPH pošle jen 10 číslic DIČ, SK doplníme
legalNamestringanoobchodní jméno, max 500
registeredAddressstringnesídlo, max 1000
curl
curl -X POST https://peppol.verteco.digital/api/v1/companies \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"ico":"53412834","dic":"SK2121358349","legalName":"Verteco digital services, s. r. o."}'

# 201 Created
{ "id":"08dd…","ico":"53412834","dic":"SK2121358349","legalName":"…",
"registeredAddress":null,"peppolParticipantId":null,
"status":"pending_verification","role":"owner","createdAt":"2026-06-03T09:40:27Z" }

Chyby: ico_taken (409) · validation_failed (400)

GET/companies/{id}session / token

Detail firmy (musíte být členem).

PUT/companies/{id}owner / admin

Úprava firmy. IČO je neměnné (musí se rovnat existujícímu).

Chyby: forbidden (403) · ico_immutable (400) · company_not_found (404)

Pole status

pending_verification
po vytvoření; odesílání ještě není odemčeno
active
ověřená, odesílání odemčeno

Role člena

owner
tvůrce firmy (plný přístup)
admin
správce (úpravy, webhooky, ověření)
member
člen (čtení)
viewer
pouze čtení
Akce „owner / admin“ jsou dostupné rolím owner i admin (manažer firmy).

Ověření odesílání (Verifikační údaj)

Před odesíláním je třeba firmu ověřit přes Verifikační údaj (VÚ), podepsaný token od Finanční správy. Po úspěšném ověření se status firmy změní na active a odemkne se odesílání. V běžném toku VÚ nikdo nepřepisuje: Finanční správa ho pošle na náš webhook v momentu, kdy si firma na portálu FS zvolí Verteco (nebo vašeho zprostředkovatele), a ověření proběhne automaticky. Tento endpoint je záložní cesta pro případ, že VÚ máte z e-mailu FS a webhook nedorazil; neregistruje firmu do SMP.

POST/companies/{id}/verificationowner / admin

Self-verify Verifikačního údaje. Po úspěchu nastaví status na active.

PoleTypPovinnéPopis
tokenstringanoVÚ = hex podpis (prod/pPFS 1024 hex, test/tPFS 768 hex)
curl
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/verification \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"token":"<1024-hex VÚ>"}'

# 200 OK
{ "companyId":"08dd…","status":"active","sendingVerified":true,
"verificationMethod":"self","verifiedAt":"2026-06-15T…Z" }

Chyby: company_dic_missing (400) · token_invalid (400) · forbidden (403)

Dokumenty

Log Peppol dokladů (přijatých a odeslaných) za firmu. Naplňuje se, jak přes Access Point tečou faktury. Vázané na členství ve firmě, seřazené createdAt sestupně.

GET/companies/{id}/documentssession / token

Seznam dokladů firmy. Volitelný filtr ?direction=sent|received.

curl
curl 'https://peppol.verteco.digital/api/v1/companies/{id}/documents?direction=received' \
-H 'Authorization: Bearer vpt_8f2a…'
# 200 OK
[ { "id":"…","direction":"received","peppolMessageId":"…","docTypeId":"…",
  "senderId":"0088:7300010000001","receiverId":"0245:2121358349",
  "invoiceNumber":"2026001","issueDate":"2026-06-03",
  "currency":"EUR","totalAmount":120.00,"status":"received","createdAt":"…" } ]
GET/companies/{id}/documents/{docId}session / token

Detail jednoho dokladu.

Chyby: document_not_found (404)

GET/companies/{id}/documents/{docId}/downloadsession / token

Samostatné HTML faktury k tisku. ?inline=1 → zobrazí v prohlížeči, jinak stáhne.

Vrátí text/html, Content-Disposition s názvem faktura-<číslo>.html.

SAPI-SK 1.0 (národní rozhraní)

SAPI-SK je standardizované národní REST rozhraní mezi klientským/ERP systémem a Access Pointem (sapi-sk.sk). Implementujeme ho v plném rozsahu. Díky tomu nejste vázáni na náš proprietární tvar API a integraci napíšete jednou pro kterýkoli SAPI-SK Access Point. Přehled bez technických detailů je v článku SAPI-SK pro vývojáře.

Base URL
https://peppol.verteco.digital/sapi
Autentizace
OAuth2 client_credentials → krátkodobý access token (JWT)
client_id
UUID vašeho API tokenu (seznam v sekci API tokeny / dashboard)
client_secret
samotný vpt_… token z portálu
Verze
1.3 (10 operací: 4× auth, 6× dokumenty)
SAPI access token je podepsaný samostatným klíčem (není to portálový vpt_ token ani session). Zrušení API tokenu v portálu okamžitě zneplatní i /auth/token i /auth/renew.

Sandbox (zkušební prostředí)

Chcete si SAPI-SK vyzkoušet bez registrace a bez rizika? Použijte veřejné sandbox přihlašovací údaje. Sandbox validuje požadavky přesně jako ostrý provoz, ale nikdy nic neodešle do sítě Peppol a nepracuje s reálnými daty; vrátí realistické mock odpovědi. Ideální pro vývoj, CI a onboarding integrace.

client_id
sandbox
client_secret
sandbox
send
plná validace kontraktu + mock 202 (nic se nedoručí)
receive
1 vzorový doklad sandbox-doc-0001 na test parsování a acknowledge
curl
# 1) sandbox token (bez registrace)
curl -X POST https://peppol.verteco.digital/sapi/auth/token \
-H 'Content-Type: application/json' \
-d '{ "client_id": "sandbox", "client_secret": "sandbox",
      "grant_type": "client_credentials" }'

# 2) mock odeslání: zvaliduje se, ale NIC se reálně nedoručí
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer <sandbox access_token>' \
-H 'X-Peppol-Participant-Id: 0245:0000000000' \
-H 'Content-Type: application/json' \
-d '{ "metadata": { "documentId": "TEST-1",
        "documentTypeId": "urn:…::Invoice##…::2.1",
        "senderParticipantId": "0088:sandbox-sender",
        "receiverParticipantId": "0088:sandbox-receiver" },
      "payload": "<Invoice>…</Invoice>", "payloadFormat": "XML" }'
# 202 { "providerDocumentId": "sandbox-…", "status": "ACCEPTED", … }

# 3) vzorová schránka + detail vzorového dokladu
curl https://peppol.verteco.digital/sapi/document/receive \
-H 'Authorization: Bearer <sandbox access_token>'
curl https://peppol.verteco.digital/sapi/document/receive/sandbox-doc-0001 \
-H 'Authorization: Bearer <sandbox access_token>'
Sandbox tokeny jsou izolované: nikdy nedoručí do sítě Peppol a nevidí reálné doklady. Pro ostré odesílání použijte client_id/client_secret z portálu (níže).

Autentizace

POST/sapi/auth/tokenclient_credentials

Vymění client_id + client_secret za access token (15 min) a refresh token (30 dní). Token si uložte a používejte ho celých 15 minut; nový token na každé volání je zbytečná režie (limit požadavků se počítá i na /auth/token).

curl
curl -X POST https://peppol.verteco.digital/sapi/auth/token \
-H 'Content-Type: application/json' \
-d '{ "client_id": "<UUID tokenu>", "client_secret": "vpt_8f2a…",
      "grant_type": "client_credentials" }'
# 200 OK
{ "access_token": "eyJhbGciOi…", "token_type": "Bearer",
"expires_in": 900, "refresh_token": "eyJhbGciOi…" }

Chyby: SAPI-AUTH-001 (401) · SAPI-AUTH-003 (401: IP mimo allowlist klíče) · SAPI-VAL-001 (400)

GET/sapi/auth/token/statusBearer (access)

Platnost a expirace access tokenu; should_refresh = true při < 3 min do konce.

POST/sapi/auth/renewrefresh token

Vystaví nový access + refresh token. Selže, pokud byl podkladový API token zrušen.

json
// body
{ "refresh_token": "eyJhbGciOi…" }
POST/sapi/auth/revokebez auth

Vždy vrátí success (RFC 7009). Trvalý kill-switch = zrušení API tokenu v portálu.

Odeslání dokumentu

POST/sapi/document/sendBearer (access)

Odešle Peppol byznys dokument (UBL / BIS 3.0) příjemci přes náš Access Point. Odesílání je fail-closed: firma musí mít ověřený Verifikační údaj. Odpověď může nést aditivní pole warnings[] se stejnými nezávaznými upozorněními jako /document/validate (číslo TEST-, odběratel z téhož účtu, datum vystavení jiné než den odeslání); upozornění doklad nikdy neblokuje.

Povinné hlavičky:

HlavičkaPopis
AuthorizationBearer <access_token>
X-Peppol-Participant-Idúčastník, za kterého odesíláte (např. 0245:2121358349, číslice DIČ bez „SK“)
Idempotency-Keyjeden klíč na jednu fakturu, odvozený z něčeho stálého (např. váš systém + ID nebo číslo faktury); opakované volání s ním vrátí původní výsledek a nikdy nedoručí dvakrát, nový klíč pro tutéž fakturu tuto ochranu obejde. Klíč platí v rámci firmy (X-Peppol-Participant-Id). Výjimka: pokud první pokus do sítě neodešel (chyba validace, neúplný požadavek, příjemce nepublikuje daný typ dokladu, přístupový bod vzdal opakování, transportní chyba se stavem failed) nebo skončil jako undeliverable, stejný klíč odeslání zopakuje, takže „oprav a pošli znovu“ funguje i pod stejným číslem faktury; postup je v poznámce Oprava a opětovné odeslání níže. Klíč nikdy nevyprší: je uložen u záznamu dokladu, který uchováváme natrvalo (retence maže jen obsah), takže opakování se stejným klíčem vrátí původní výsledek i po měsících.
curl
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer eyJ…' \
-H 'X-Peppol-Participant-Id: 0245:2121358349' \
-H 'Idempotency-Key: 7b1f0e2a-…' \
-H 'Content-Type: application/json' \
-d '{ "metadata": {
        "documentId": "INV-2026-001",
        "documentTypeId": "urn:…::Invoice##…::2.1",
        "processId": "urn:…:bis:billing:3.0",
        "senderParticipantId": "0245:2121358349",
        "receiverParticipantId": "0088:7300010000001",
        "creationDateTime": "2026-06-17T10:00:00Z" },
      "payload": "<Invoice …>…</Invoice>",
      "payloadFormat": "XML" }'
# 202 Accepted
{ "providerDocumentId": "…", "status": "ACCEPTED",
"receivedAt": "2026-06-17T10:00:01Z", "timestamp": "…" }
# při status "REJECTED" nese odpověď i pole "detail"
# s důvodem odmítnutí (validační pravidla, např. BR-CO-15)
metadata vs. UBL: pole v metadata jsou směrovací a technická: documentId je váš interní identifikátor, ne číslo faktury. Obchodní údaje (číslo faktury cbc:ID, datum vystavení, splatnost, datum dodání, měna, částka) si přebíráme přímo z UBL payloadu; nic z toho v metadata neposíláte a UBL je vždy zdroj pravdy pro zobrazení v portálu i webhooky. documentTypeId: úplný identifikátor busdox-docid-qns; holý namespace nebo samotné CustomizationID normalizujeme na typ odvozený z payloadu, typ, který payloadu odporuje, odmítneme chybou SAPI-VAL-001; schéma účastníka musí být ze seznamu EAS.

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400) · SAPI-PROC-001 (502) · SAPI-PROC-002 (503) · SAPI-PROC-500 (500: neopakovat, nahlaste correlation_id)

HTTP kód vs. verdikt. Podle národního kontraktu SAPI-SK odpovídá odeslání vždy 202a verdikt nese tělo (status ACCEPTED nebo REJECTED). Pokud chcete, aby verdikt nesl i HTTP kód, pošlete hlavičku Prefer: handling=strict (RFC 7240): synchronní odmítnutí se vrátí jako 422 se SAPI chybovou obálkou (SAPI-VAL-002 při chybě validace, SAPI-RES-003 když příjemci nejde doručit; details[] nesou providerDocumentId a detail) a odpověď má Preference-Applied: handling=strict. Při ACCEPTED se nic nemění. Před předáním přístupovému bodu děláme stejný SML lookup jako on. Doklad nejprve projde validací: převezmeme a nahlásíme jen platný doklad, nevalidní dostane REJECTED s validation_failed i tehdy, když příjemce v síti není. Příjemce, který v síti Peppol vůbec není, znamená ACCEPTED s undeliverable: true: doklad jsme převzali a nahlásíme ho Finanční správě bez ohledu na doručení (§ 85o odst. 11, FS FAQ 9/DPH/2025/IM, část II, příklad 9), nikomu se však nedoručí; na GET /sapi/document/sent má status undeliverable, webhook dostane invoice.undeliverable, e-mail nikomu neposíláme a stejný Idempotency-Key jde odeslat znovu po opravě identifikátoru příjemce nebo po jeho registraci (postup v poznámce Oprava a opětovné odeslání níže). Příjemce, který v síti je, ale nepublikuje daný typ dokladu, dostane REJECTED okamžitě, bez pokusu o doručení. Pole retrying: true při ACCEPTED znamená, že první pokus o doručení selhal (např. dočasně nedostupné SMP) a přístupový bod ho sám opakuje zpravidla do 20 minut; detail nese důvod a konečný verdikt přijde přes GET /sapi/document/sent nebo webhook.
Oprava a opětovné odeslání. Každý pokus, který API přijme ke zpracování (odpověď 202, při handling=strict i 422), dostane vlastní providerDocumentId, i odmítnutý.
  • REJECTED při naší kontrole před odesláním (chyba validace, neúplný požadavek, příjemce nepublikuje daný typ dokladu, jeho SMP záznam pro typ nemá endpoint, přístupový bod vzdal opakování): do sítě nic neodešlo, nic se nedoručilo a nic se nehlásí Finanční správě. Opravte údaje a pošlete doklad znovu se stejným Idempotency-Key. Nový pokus dostane nové providerDocumentId; první záznam zůstává v seznamu odeslaných jako rejected s důvodem, jen jako stopa neúspěšného pokusu, a smazat se nedá. Fakturu ve vašem systému važte vždy na poslední providerDocumentId. Číslo faktury může zůstat stejné, faktura ještě nebyla vyhotovena ve smyslu zákona. Datum vystavení (BT-2) však musí být den, kdy faktura skutečně odejde: elektronická faktura se považuje za vyhotovenou dnem předání doručovací službě a odeslat ji je třeba nejpozději do 15 dnů od dodání nebo přijetí platby (FS FAQ 9/DPH/2025/IM, část I, příklad 74). Pokud opravenou fakturu posíláte v pozdější den, datum vystavení změňte na tento den.
  • Předané síti (ACCEPTED bez undeliverable: submitted, delivered nebo se opakuje na pozadí; patří sem i doklad, který po přenosu odmítla doručenka MLS příjemce a který opakované volání vrátí jako REJECTED s důvodem): stejný klíč vrátí výsledek tohoto odeslání a nic se neodešle dvakrát. Doručenou fakturu nikdy neposílejte znovu; opravuje se dobropisem (381) nebo vrubopisem (383).
  • undeliverable (příjemce nemá adresu v síti Peppol): faktura byla předána, hlásí se Finanční správě bez ohledu na doručení a povinnost vystavitele je splněna (FS FAQ 9/DPH/2025/IM, část I, příklady 42 a 75). Klíč se uvolní. Pokud byl chybný identifikátor příjemce (například IČO nebo DIČ s překlepem namísto 0245:<10 číslic DIČ>, nebo je příjemce v síti pod jiným identifikátorem), opravte identifikátor a pošlete znovu se stejným klíčem; fakturu nechte stejnou (totéž číslo i datum), už byla předána. 8místné číslo je IČO a v síti se nikdy nenajde. Pokud je identifikátor správný a příjemce jen není registrován, pošlete mu tutéž fakturu jinou cestou, nejlépe její XML e-mailem (PDF jen jako náhled). Podle FS FAQ (část I, příklad 75) jde o opětovné zaslání téže faktury, ne o novou fakturu, proto nevystavujte novou fakturu s jiným číslem. Když se příjemce zaregistruje, tutéž fakturu mu přes Peppol pošlete znovu zopakováním volání se stejným Idempotency-Key.
  • Nesprávný identifikátor odběratele nebo prázdný vlastní: hlavička X-Peppol-Participant-Id jen se schématem (například 0245:, když v nastavení programu chybí DIČ firmy) vrátí při odeslání 403 SAPI-AUTH-003 s vysvětlením a /document/validate s takovou hlavičkou přidá do warnings upozornění ještě před odesláním. Odběratel zadaný jako 0088 (GLN) nebo 0245 s 8 číslicemi (IČO namísto DIČ) se ve slovenské síti nenajde: doklad skončí jako undeliverable a jeho statusReason (detail v odpovědi na send) nese návod, který identifikátor použít: 0245 a 10 číslic DIČ.
  • Předcházejte chybám: před odesláním zavolejte POST /sapi/document/validate (stejná pravidla jako při odeslání, nic neukládá ani neodesílá) a GET /sapi/discovery?receiverId=… (je příjemce v síti a jaké typy dokladů přijímá). Konečný stav zjistíte přes GET /sapi/document/sent?invoiceNumber=…, GET /sapi/document/sent/{id}, POST /sapi/document/sent/status nebo webhooky invoice.delivered, invoice.rejected a invoice.undeliverable.
POST/sapi/document/validateBearer (access)

Ověří dokument bez odeslání: stejná pravidla EN 16931 + Peppol BIS 3.0, jaká přístupový bod uplatňuje před odesláním. Nic se neukládá ani neodesílá; funguje i se sandbox tokenem. Tělo = JSON pár { payload, payloadFormat } jako při /document/send, nebo přímo XML (Content-Type: application/xml). Limit 10 MB. Odpověď nese i pole warnings[] s nezávaznými upozorněními (například číslo TEST-, odběratel, který je jinou firmou téhož účtu, nebo datum vystavení BT-2 jiné než den odeslání); upozornění doklad nikdy neblokuje.

curl
curl -X POST https://peppol.verteco.digital/sapi/document/validate \
-H 'Authorization: Bearer eyJ…' \
-H 'Content-Type: application/xml' \
--data-binary @faktura.xml
# 200 OK
{ "valid": false,
  "errors": [ "BR-CO-15: Invoice total amount with VAT (BT-112) = … " ],
  "warnings": [],
  "checkedAt": "2026-09-10T12:00:00Z" }

Chyby: SAPI-AUTH-002 (401) · SAPI-VAL-001 (400: prázdné tělo, neplatný JSON, payloadFormat jiný než XML, > 10 MB) · SAPI-SYS-002 (502: validátor dočasně nedostupný, opakujte)

Příjem dokumentů

GET/sapi/document/receiveBearer (access)

Seznam přijatých dokumentů (nejstarší první); metadata nesou i invoiceNumber, takže doklad identifikujete bez stahování payloadu. Query: ?pageToken, ?limit (max 200), ?status (filtr: received = pouze doklady, které jste ještě nepotvrdili, acknowledged = pouze potvrzené, bez parametru všechny přijaté doklady; bez ohledu na velikost písmen, jiná hodnota vrátí chybu SAPI-VAL-001), ?invoiceNumber (přesná shoda s cbc:ID), ?since a ?until (ISO-8601 instant; okno podle času přijetí, např. doklady za posledních 5 dní, hromadné stažení na externí archivaci či rekonstrukci účetnictví), ?deliveryDateFrom a ?deliveryDateTo (ISO-8601 datum; filtr podle data dodání z dokladu). Hlavička X-Peppol-Participant-Id povinná.

json
// 200 OK
{ "documents": [ { "documentId":"…","documentTypeId":"…",
  "senderParticipantId":"0088:…","receiverParticipantId":"0245:…",
  "creationDateTime":"2026-06-17T…Z" } ],
"nextPageToken": "50" }
GET/sapi/document/receive/{documentId}Bearer (access)

Detail včetně payloadu (raw XML, jak přišel přes Peppol).

Chyby: SAPI-RES-001 (404) · SAPI-RES-002 (404: payload nearchivovaný)

POST/sapi/document/receive/{documentId}/acknowledgeBearer (access)

Potvrdí převzetí dokumentu vaším systémem. Idempotentní.

GET/sapi/document/receive/{documentId}/xmlBearer (access)

Archivní odkaz (metadata.links.xml): samotný obchodní doklad jako XML soubor, stejný obsah jako payload v detailu.

GET/sapi/document/receive/{documentId}/htmlBearer (access)

Archivní odkaz (metadata.links.html): generický tisknutelný náhled faktury (HTML).

GET/sapi/document/receive/{documentId}/pdfBearer (access)

Archivní odkaz (metadata.links.pdf): PDF dokladu. Pokud dodavatel vložil do XML vlastní PDF faktury (BT-125), vracíme ten originál; jinak PDF vygenerované z uloženého XML na požádání (PDF neukládáme). Hlavička X-Verteco-Pdf-Source: supplier | generated. 404 SAPI-RES-002 po výmazu obsahu, 503 při výpadku rendereru (zkuste později nebo použijte /html).

GET/sapi/document/receive/{documentId}/attachments/{index}Bearer (access)

Archivní odkaz (metadata.links.attachments[].url): bajty jedné přílohy vložené v dokladu, např. PDF originál dodavatele. Vynucené stažení.

POST/sapi/document/receive/{documentId}/public-linkBearer (access)

Odkaz bez přihlášení (volitelné): vydá NOVÝ náhodný klíč k dokladu ({"rotate":true} nahradí existující). Vrátí url (stránka), xmlUrl, htmlUrl, pdfUrl a expiresAt; klíč se zobrazí jen jednou. Firma musí mít zapnuté Stahování faktur bez autorizace (403 SAPI-AUTH-004 jinak). DELETE odkaz zruší.

Archiv namísto kopie: každý přijatý doklad nese v metadatech pole links (xml, html, pdf, přílohy) a retention. Integrátor si k zaúčtovanému dokladu může uložit jen odkaz a doklad stáhnout až při zobrazení; odkazy vyžadují stejný Bearer token a hlavičku X-Peppol-Participant-Id. retention.mode = storage znamená, že firma má pro přijaté doklady zapnutý Archiv dat a originál uchováváme po celou dobu trvání smluvního vztahu (VOP 11a.1). retention.mode = secure znamená, že firma přijaté doklady u nás nearchivuje: obsah se nenávratně vymaže v retention.contentAvailableUntil, což je plánované datum výmazu uložené u každého dokladu (předvoleně 14 dní od přijetí; lhůta je zvlášť pro přijaté a odeslané doklady a každá změna nastavení se pro existující doklady počítá ode dne změny, nikdy dříve), a potom odkazy vracejí SAPI-RES-002; pokud je contentAvailableUntil null při mode secure, obsah zatím držíme z povinnosti (neprovedené daňové hlášení) a datum výmazu neslibujeme. Archiv si vlastník firmy nastavuje na detailu firmy zvlášť pro přijaté a pro vystavené doklady. Odkazy bez autorizace: pokud firma na detailu firmy zapne „Stahování faktur bez autorizace“, POST /sapi/document/receive/{id}/public-link vrátí odkaz s vlastním náhodným klíčem, který otevře doklad bez tokenu (url pro člověka, xmlUrl a htmlUrl pro programy). Klíč je v odpovědi přesně jednou; odkaz platí nejdéle do contentAvailableUntil, dá se zrušit (DELETE) a po vypršení vrací 410 s důvodem, tehdy si vyžádejte nový. Bez zapnutí v portálu odpovídá 403 SAPI-AUTH-004.
Odkazy bez přihlášení: pole links.* vyžadují Bearer vždy (jsou to archivní odkazy). Když má firma zapnuté „Stahování faktur bez autorizace“ (detail firmy → Archiv dat, nebo PUT /companies/{id}/public-links), detail dokladu nese metadata.publicLink s hotovými adresami url, xmlUrl, htmlUrl a pdfUrl: stejná adresa při každém čtení a tatáž, kterou vidí uživatel v portálu u faktury. Uložte si ji k zaúčtovanému dokladu; POST …/public-link potřebujete jen na vynucení nového klíče. Při vypnuté volbě je publicLink.issued=false s reason=public_links_disabled. Odkaz je trvalý: platí, dokud je obsah dokladu uložen (u firmy bez archivace přijatých dokladů do retention.contentAvailableUntil), expiresAt je proto null (v SAPI odpovědi pole chybí); žádné obnovování není potřeba. xmlUrl i links.xml vracejí samotný doklad s kořenem Invoice/CreditNote bez transportní SBDH obálky. pdfUrl i links.pdf vracejí PDF, které dodavatel vložil do XML (BT-125), pokud existuje, jinak PDF vygenerované z XML; hlavička X-Verteco-Pdf-Source říká, které (supplier | generated).

Stav odeslaných dokumentů

GET/sapi/discovery?receiverId=0245:2121358349

Preflight před odesláním: je příjemce registrovaný v síti Peppol a jaké typy dokladů umí přijmout? Stejný SML lookup, jaký dělá Access Point; receiverId přijme Peppol ID, IČ DPH i samotné DIČ. Odpověď: {registered, participantId, smp, documentTypes, checkedAt}. Hlavička X-Peppol-Participant-Id tu není potřebná.

GET/sapi/document/sentBearer (access)

Stav doručení odeslaných dokladů: pending (předáváme síti) → submitted → delivered / rejected (potvrzené doručenkou MLS od AP příjemce); failed = transportní chyba (retry se stejným Idempotency-Key pošle znovu). Query: ?pageToken, ?limit, ?status (pending / submitted / sent / delivered / rejected / failed; bez ohledu na velikost písmen, jiná hodnota vrátí chybu SAPI-VAL-001), ?invoiceNumber (přesná shoda s cbc:ID, stav konkrétní faktury jedním voláním), ?since a ?until (ISO-8601 instant; okno podle času), ?deliveryDateFrom a ?deliveryDateTo (ISO-8601 datum; filtr podle data dodání).

json
// 200 OK
{ "documents": [ {
  "documentId": "…",
  "receiverParticipantId": "0245:1084695645",
  "peppolMessageId": "befc9112-…",
  "status": "delivered",
  "statusDateTime": "2026-07-09T14:52:31Z",
  "creationDateTime": "2026-07-09T14:52:12Z" } ],
"nextPageToken": null }

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400: neplatné since)

Doručenka (MLS) a důkazy doručení

Doručenka MLS (Peppol Message Level Status) je odpověď Access Pointu příjemce na naši zásilku: AP = přijato a doručeno, AB = doručeno bez obchodního potvrzení, RE = odmítnuto s důvodem. Portál ji uloží k odeslanému dokladu a podle ní přepne stav: AP i AB znamenají delivered (při AB začíná statusDetail „MLS AB: “ a mls.responseCode je AB; podle SPOG on MLS je to doručení bez obchodního potvrzení, ne výhrada), RE znamená rejected. Podle § 76a odst. 2 písm. d zákona 222/2004 musí poskytovatel umět prokázat datum a čas odeslání, doručení a přijetí; ty tři časy nese každý řádek GET /sapi/document/sent i webhook: sentAt (předání doručovací službě, tím je podle § 85o odst. 11 splněna povinnost vystavitele), deliveredAt (potvrzení AP příjemce doručenkou) a fsReportedAt (hlášení údajů FS). Zahraniční Access Point doručenku nemusí poslat nikdy: doklad zůstane delivered s detailem as4_receipt_only a bez MLS.

GET/sapi/document/sent/{documentId}Bearer (access)

Detail jednoho odeslaného dokladu: stejný řádek jako v seznamu (včetně sentAt, deliveredAt, fsReportedAt, hasMls, links) plus mls.responseCode (AP/AB/RE), mls.receivedAt a mls.url. mls je null, dokud doručenka nepřijde.

json
// 200 OK
{ "document": {
    "documentId": "…", "peppolMessageId": "befc9112-…", "status": "delivered",
    "sentAt": "2026-09-17T08:00:12Z", "deliveredAt": "2026-09-17T08:00:31Z", "fsReportedAt": null,
    "hasMls": true,
    "links": { "detail": "…/sapi/document/sent/…", "mls": "…/sapi/document/sent/…/mls" } },
  "mls": { "responseCode": "AP", "receivedAt": "2026-09-17T08:00:31Z", "url": "…/sapi/document/sent/…/mls" } }

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-RES-001 (404: cizí nebo přijatý doklad) · SAPI-RES-004 (404: doručenka zatím není)

GET/sapi/document/sent/{documentId}/mlsBearer (access)

Doručenka jako soubor: MLS ApplicationResponse od Access Pointu příjemce, který se odkazuje na peppolMessageId zásilky. Důkaz doručení nebo odmítnutí; vynucené stažení. SAPI-RES-004, dokud doručenka nepřišla.

GET/sapi/document/sent/{documentId}/xmlBearer (access)

Obsah odeslaného dokladu (SAPI 1.8.15): samotné UBL XML, které jsme předali síti (přenosová obálka odstraněna), vynucené stažení. Protějšek odkazů na přijaté doklady: účetní program externího účetního si takto načte i VYSTAVENÉ faktury klienta (MK-soft: „Načítavať aj vystavené faktúry“). Odkazy jsou v každém řádku jako links.xml, links.html a links.pdf. SAPI-RES-002 po výmazu obsahu podle retence firmy.

GET/sapi/document/sent/{documentId}/htmlBearer (access)

Tisková podoba odeslaného dokladu vygenerovaná z uloženého XML (nic se neukládá).

GET/sapi/document/sent/{documentId}/pdfBearer (access)

PDF odeslaného dokladu: vlastní PDF vystavitele vložené v XML (BT-125), pokud ho doklad nese, jinak PDF vygenerované z XML; hlavička X-Verteco-Pdf-Source: supplier | generated. 503 SAPI-PROC-001, dokud je generátor nedostupný (použijte /html).

Zprostředkovatelé: stejná volání s hlavičkou X-Peppol-Participant-Id klienta dávají doručenky všech spravovaných firem jedním tokenem; v portálu je tatáž doručenka na detailu odeslané faktury (Stáhnout doručenku) a v MCP nástroji get_document.

Důkazy hlášení FS, integrita a časová osa (SAPI 1.8.14)

Od verze 1.8.14 nese každý řádek GET /sapi/document/sent i detail a seznam přijatých dokladů objekt fsReport: state = reported (hlášení předáno sběrnému bodu C5, reportedAt = fsReportedAt), pending (hlášení je dlužné, předání selhalo a opakuje se automaticky, reason = c5_unavailable) nebo not_required (hlášení nevzniká; reason vysvětluje proč: cross_border, self_send_test, issuer_without_vat_id, recipient_without_vat_id, not_billing_document, tdd_disabled, before_2026_09_01, not_recorded). Po předání přibude tddMessageId (SBDH InstanceIdentifier hlášení) a po odpovědi C5 c5ResponseCode (AP/AB/RE), c5ResponseAt, c5Detail a shrnutí outcome: accepted (AP), accepted_with_reservations (AB), rejected (RE) nebo null, dokud C5 neodpovědělo. outcome = rejected znamená, že hlášení jsme předali, ale Finanční správa ho odmítla (c5Detail nese porušené pravidlo, například BR-AE-08); state zůstává reported, protože předání proběhlo, a portál opravené hlášení odešle znovu automaticky (po přijetí se outcome změní na accepted). Odeslané řádky mají navíc statusReason (strojový kód za statusDetail: network_retrying, network_retrying_sent, as4_receipt_only, recipient_not_registered, transport_failed, mls_rejected, validation_failed), xmlSha256 (SHA-256 předaného XML, zůstává i po výmazu obsahu), retention a receiptRetention = permanent (doručenka MLS se nikdy nemaže). Doručenka v detailu má mls.sha256 a mls.messageId. Přijaté doklady dostaly peppolMessageId, status (received/acknowledged), receivedAt, acknowledgedAt a xmlSha256 (SHA-256 bajtů obchodního dokladu přesně tak, jak je vydává links.xml, bez přenosové obálky SBDH; počítá se při přijetí a zůstává i po výmazu obsahu). Oba seznamy filtrujete přes ?fsReport=reported|pending|not_required|rejected (rejected = outcome rejected), odeslané i přes ?status=undeliverable. Odpověď POST /sapi/document/send nese peppolMessageId už při převzetí. Všechno je doplněno jako nová pole, existující zůstávají nezměněna.

POST/sapi/document/sent/statusBearer (access)

Stav až 200 odeslaných dokladů jedním voláním: stejné řádky jako v seznamu plus mls, pokud doručenka už přišla. Id, která nejsou odeslanými doklady této firmy, se vrátí v missing; volání kvůli nim neselže. Náhrada za N volání GET /sapi/document/sent/{id} při synchronizaci účetního systému.

json
// POST { "documentIds": ["7c1e…", "9af0…", "neznámé"] }  (max 200)
{ "documents": [ {
    "documentId": "7c1e…", "status": "delivered", "statusReason": null, "peppolMessageId": "befc9112-…",
    "sentAt": "2026-09-21T08:00:12Z", "deliveredAt": "2026-09-21T08:00:31Z", "fsReportedAt": "2026-09-21T08:05:40Z",
    "fsReport": { "state": "reported", "reportedAt": "2026-09-21T08:05:40Z", "reason": null, "outcome": "accepted",
                  "tddMessageId": "3f2a…", "c5ResponseCode": "AP", "c5ResponseAt": "2026-09-21T08:06:02Z", "c5Detail": null },
    "xmlSha256": "9b74…", "retention": { "mode": "storage", "contentAvailableUntil": null }, "receiptRetention": "permanent",
    "hasMls": true, "links": { "detail": "…", "mls": "…" },
    "mls": { "responseCode": "AP", "receivedAt": "2026-09-21T08:00:31Z", "url": "…", "sha256": "e1c0…", "messageId": "mls-…" } } ],
  "missing": ["9af0…", "neznámé"] }

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400: 0 / > 200 id)

GET/sapi/document/sent/{documentId}/eventsBearer (access)

Časová osa dokladu seřazená podle času: submitted, network_retrying, delivered / rejected / undeliverable / failed, mls_received, fs_reported, fs_c5_verdict, content_wiped, webhook_delivered a další (neznámý typ ignorujte). Fáze 1 je odvozena z uložených skutečností dokladu, ne záznam každé mezizměny stavu.

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-RES-001 (404: cizí nebo přijatý doklad)

GET/sapi/document/receive/{documentId}/eventsBearer (access)

Časová osa přijatého dokladu: received, acknowledged, fs_reported, fs_c5_verdict, content_wiped, doručení webhooků.

Webhooky: každá událost invoice.* nese tentýž objekt fsReport; nové události invoice.report_pending (předání hlášení selhalo, zůstává dlužné a opakuje se; jednou za doklad) a invoice.report_rejected (C5 hlášení odmítlo, c5Detail nese důvod). Nové události přijdou jen integracím, které odebírají všechny události; na neznámý typ odpovídejte 2xx. Testovací prostředí vrací fsReport not_required s reason tdd_disabled u vzorového dokladu a prázdný documents při batch volání. Při odmítnutí má fsReport.outcome hodnotu rejected a doklad najdete přes ?fsReport=rejected. Self-billing (kód dokladu 389, fakturu vystavuje odběratel): doklad doručíme, hlášení Finanční správě u něj zatím negarantujeme, protože hlášení se tvoří podle dodavatele uvedeného v dokladu, ne podle odesílatele; fsReport může zůstat pending nebo rejected. Před nasazením self-billingu nám napište.

Hromadné odeslání

POST/sapi/document/batchBearer (access)

Až 100 dokumentů v jednom volání. Každá položka projde plnou logikou jednotlivého odeslání (idempotence přes itemId + idempotencyKey, rezervace, submit, verdikt) a vrátí vlastní výsledek; chyba jedné položky nezastaví ostatní. Položky se zpracovávají sekvenčně; failed položky opakujte se stejným idempotencyKey.

json
// request
{ "documents": [ {
  "itemId": "fa-2026-001",
  "idempotencyKey": "fa-2026-001",
  "metadata": { "documentId": "2026001", "documentTypeId": "…", "processId": "…",
                "senderParticipantId": "0245:2121358349", "receiverParticipantId": "0245:1084695645" },
  "payload": "<Invoice …>", "payloadFormat": "XML" } ] }

// 202 Accepted
{ "total": 2, "accepted": 1, "rejected": 1, "failed": 0,
"results": [
  { "itemId": "fa-2026-001", "ok": true,  "providerDocumentId": "…", "status": "ACCEPTED" },
  { "itemId": "fa-2026-002", "ok": false, "errorCode": "SAPI-AUTH-003", "errorMessage": "…" } ] }

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400: prázdný/příliš velký seznam)

Model chyb

Všechny SAPI chyby mají jednotnou obálku s kategorií, stabilním kódem, příznakem retryable a correlation_id pro podporu. Při chybě přihlášení (SAPI-AUTH-001) nese obálka navíc hint (lidsky čitelné vysvětlení, co patří do Client Id a Client Secret) a docs (odkaz na návod; pro programy MK-soft přímo na /navody/mksoft#prepojenie). Obě pole jsou volitelná a jinde chybí (1.8.20).

json
{ "error": {
  "category": "AUTH",
  "code": "SAPI-AUTH-001",
  "message": "Invalid client credentials.",
  "retryable": false,
  "correlation_id": "b4191dfc-…" } }
Poznámka: při odeslání doručujeme byznys dokument; C2 strana daňového hlášení (TDD) k odeslaným dokladům je v přípravě. Daňové hlášení při příjmu (C3) generujeme a podáváme Finanční správě automaticky.

Notifikace & webhooky

Při přijaté faktuře umíme firmu upozornit e-mailem nebo webhookem (POST na vaši URL). Doručení je durable: ukládá se do výstupní fronty a doručuje asynchronně (15 s timeout); při selhání opakujeme až 12× s exponenciálním backoffem (30 s → max 8 h, celkem přibližně 16 hodin), potom dead-letter. Výpadek vašeho serveru tedy notifikaci neztratí, doručíme ji při dalším pokusu. HTTP 401/403 znamená, že váš endpoint vyžaduje autentizaci, kterou neposíláme; ověřujte podpis webhook-signature a odpovídejte 2xx. SSRF ochrana blokuje loopback/lokální adresy; webhook URL musí být veřejná.

GET/companies/{id}/notificationssession / token

Nastavení notifikací: { webhookUrl, notificationEmail, notificationEmails, hasSecret }.

PUT/companies/{id}/notificationsowner / admin

Nastaví oba kanály (prázdný řetězec = zruší daný kanál).

PoleTypPovinnéPopis
webhookUrlstringneprázdné nebo http(s) URL, max 512
notificationEmailstringnejedna adresa nebo nejvýše 5 oddělených čárkou, max 256; každá dostává e-maily o přijatých fakturách (400 invalid_notification_email / too_many_notification_emails)
GET/companies/{id}/webhooksession / token

Konfigurace webhooku: { url, hasSecret } (bez secretu).

PUT/companies/{id}/webhookowner / admin

Nastaví URL webhooku (auto-vygeneruje podpisový secret, pokud ještě není).

PoleTypPovinnéPopis
urlstringanohttp(s) URL, max 512
curl
curl -X PUT https://peppol.verteco.digital/api/v1/companies/{id}/webhook \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"url":"https://vas-system.sk/peppol/webhook"}'
# 200 OK { "url":"https://vas-system.sk/peppol/webhook", "hasSecret": true }
DELETE/companies/{id}/webhookowner / admin

Zruší webhook URL i secret. Vrátí 204.

POST/companies/{id}/webhook/secretowner / admin

Vygeneruje nový podpisový secret a vrátí ho JEDNOU; uložte si ho na ověřování X-Verteco-Signature.

json
// 200 OK
{ "secret": "vpt_8f2a…" }
POST/companies/{id}/webhook/testowner / admin

Pošle synchronně testovací notifikaci (event webhook.test, podepsanou, SSRF-chráněnou) na uloženou URL a vrátí, CO poslala a CO přišlo zpět. Totéž spustíte tlačítkem Otestovat webhook v detailu firmy.

json
// 200 OK
{
"sent":     { "url": "https://vas-system.sk/peppol/webhook", "event": "webhook.test",
              "signed": true, "payload": "{…}" },
"received": { "status": 200, "body": "OK", "durationMs": 142, "error": null }
}
// 400 webhook_not_configured, pokud není uložená webhook URL

Payload webhooku

Při přijaté (invoice.received) i odeslané (invoice.sent) faktuře pošleme POST s tímto tělem; pole event rozlišuje typ.

Další dvě události oznamují verdikt sítě o faktuře, kterou jste odeslali: invoice.delivered (příjemcův Access Point potvrdil doručení doručenkou MLS) a invoice.rejected (odmítnutá, ať už sítí, nebo při validaci ještě před odesláním); invoice.undeliverable hlásí příjemce bez záznamu v síti Peppol (převzato, nahlášeno FS, nedoručeno). Nesou identifikaci dokladu a firmy (documentId, invoiceNumber, receiverId, peppolMessageId, companyDic, peppolParticipantId) plus status, statusDetail s důvodem odmítnutí a statusDateTime. Pokud první pokus o doručení selhal a přístupový bod ho sám opakuje (zpravidla do hodiny), doklad zůstává submitted a statusDetail začíná předponou network_retrying: ; po doručení přijde delivered, po vzdání rejected s předponou network_gave_up: . Díky nim nemusíte stav odeslaných faktur zjišťovat pollováním.

Událost company.activated přijde, když zákazník dokončí výběr poskytovatele na portálu Finanční správy (tělo: event, companyId, companyDic, peppolParticipantId, status, verifiedAt); company.deactivated zase při odregistrování firmy ze sítě (stejné tělo bez verifiedAt). company.smp_registered_elsewhere přijde, když firma dokončila výběr na portálu FS, ale její záznam v národním SMP drží jiný poskytovatel (tělo jako při company.activated plus action: "migration_code_required" a migrateUrl). Postup pro partnery je v dokumentaci pro zprostředkovatele. Dokud zákazník nevloží migrační kód, síť doručuje starému poskytovateli. Detaily v návodu /saas:

json
{
"event": "invoice.received",
"eventId": "7f1c2d9e-4b1a-4e3d-9c1f-0a2b3c4d5e6f",
"occurredAt": "2026-09-03T15:04:05Z",
"companyId": "08dd…",
"documentId": "…",
"invoiceNumber": "2026001",
"senderId": "0088:7300010000001",
"supplierName": "Dodávateľ s.r.o.",
"receiverId": "0245:2121358349",
"issueDate": "2026-06-03",
"dueDate": "2026-06-17",
"deliveryDate": "2026-06-03",
"currency": "EUR",
"totalAmount": "120.00",
"peppolMessageId": "…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349"
}

Pole companyDic a peppolParticipantId identifikují firmu, které se událost týká (důležité pro partnery, kteří mají jednu webhook URL pro všechny své klienty).

Verdikt sítě o odeslané faktuře:

json
{
"event": "invoice.delivered",          // nebo "invoice.rejected"
"occurredAt": "2026-09-03T15:04:05Z",
"companyId": "08dd…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349",
"documentId": "…",
"invoiceNumber": "2026001",
"receiverId": "0245:2120049096",
"peppolMessageId": "…",
"status": "delivered",                 // nebo "rejected"
"statusDetail": null,                  // při rejected: důvod odmítnutí
"statusDateTime": "2026-06-03T10:15:42Z"
}

Aktivace firmy po výběru na portálu Finanční správy:

json
{
"event": "company.activated",          // company.deactivated má stejné tělo bez verifiedAt
"occurredAt": "2026-09-03T15:04:05Z",
"companyId": "08dd…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349",
"status": "active",
"verifiedAt": "2026-06-03T10:02:11Z"
}

Název události nese i hlavička X-Verteco-Event. Úplný seznam událostí: invoice.received, invoice.sent, invoice.delivered, invoice.rejected, invoice.undeliverable, invoice.reported, invoice.report_pending, invoice.report_rejected, company.activated, company.deactivated, company.smp_registered_elsewhere a testovací webhook.test. Neznámý typ události doporučujeme odložit stranou a zalogovat; nový typ vždy předem ohlásíme. Každá událost nese i occurredAt (čas vzniku události, ISO-8601 UTC), podle kterého události řadíte, a eventId (stejná hodnota i v hlavičce X-Verteco-Delivery-Id): jedinečný pro každou událost a neměnný při jejím opakování, proto je to správný klíč pro deduplikaci (peppolMessageId se opakuje napříč invoice.sent, invoice.delivered a invoice.reported). Události invoice.* nesou i časy sentAt, deliveredAt, receivedAt a fsReportedAt (ISO-8601 UTC, null dokud skutečnost nenastala). invoice.reported přijde, když bylo hlášení Finanční správě (TDD) k dokladu předáno doručovací službě (§ 85o odst. 11), a to i s odstupem dnů při výpadku sběrného bodu C5. Formální schémata všech událostí jsou v sekci webhooks specifikace OpenAPI.

Partnerský notifikační webhook, správa klientů (release, pause-sending) a fakturační model jsou dostupné jen zapsaným zprostředkovatelům a jsou popsané v části Pro zprostředkovatele.

Ověření podpisu

Pokud má firma secret, posíláme hlavičku X-Verteco-Signature ve tvaru sha256=HMAC-SHA256(secret, raw tělo) (lowercase hex). Vždy počítejte HMAC nad přesnými bajty těla:

javascript
import crypto from 'node:crypto';

// rawBody = přesné bajty těla requestu (ne znovu serializovaný JSON)
function verify(rawBody, header, secret) {
const expected = 'sha256=' +
  crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
return crypto.timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}

Hlavičky každého doručení: X-Verteco-Event (název události), X-Verteco-Delivery-Id (= eventId v těle, stejné při každém opakování), X-Verteco-Signature (HMAC výše) a paralelně hlavičky podle standardu Standard Webhooks: webhook-id (= eventId), webhook-timestamp (unix sekundy okamžiku pokusu) a webhook-signature = v1,base64(HMAC-SHA256(secret, id + "." + timestamp + "." + tělo)). Klíčem jsou bajty vašeho secretu v UTF-8; knihovna standardwebhooks ho očekává jako whsec_ + base64(secret). Doporučený postup: ověřte podpis, odmítněte doručení s webhook-timestamp starším než 5 minut (ochrana před přehráním), zpracovávejte idempotentně podle eventId, odpovězte 2xx do 15 sekund a těžší zpracování odložte do vlastní fronty. Neúspěšné doručení opakujeme 12× s odstupem 30 s až 8 h (celkem přibližně 16 hodin); potom skončí jako dead-letter s upozorněním e-mailem a je viditelné v Realtime logu. Produkční webhook URL musí být https://, v testovacím prostředí je dovoleno i http://.

Secret získáte přes POST /companies/{id}/webhook/secret; vrátí ho jednou (rotace vygeneruje nový). Bez secretu hlavičku X-Verteco-Signature neposíláme.

Hromadné nastavení: jeden token, více firem

Jeden API token (vázaný na váš účet/e-mail) spravuje všechny firmy, které vlastní: kdo firmu založí přes POST /companies, stává se jejím ownerem a umí jí nastavit webhook. Webhook je per firma (vlastní URL i secret), takže stejným tokenem napojíte libovolný počet firem:

bash
# 1) seznam vašich firem (stránkovaně, viz Firmy)
curl 'https://peppol.verteco.digital/api/v1/companies?page=0&limit=100' -H 'Authorization: Bearer vpt_8f2a…'

# 2) pro KAŽDOU firmu {id}: nastavte webhook (a/nebo e-mail)
curl -X PUT https://peppol.verteco.digital/api/v1/companies/{id}/notifications \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"webhookUrl":"https://vas-system.sk/peppol/webhook","notificationEmail":"faktury@firma.sk"}'

# 3) vyzvedněte podpisový secret (vrátí se JEN JEDNOU) a uložte si ho pro ověřování podpisu
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/webhook/secret -H 'Authorization: Bearer vpt_8f2a…'
# → { "secret": "…" }
  • Token musí být owner/admin dané firmy; u firmy, kde je jen member/viewer, vrátí 403 forbidden (žádný cross-tenant zásah).
  • Každé firmě můžete dát jinou URL nebo všem stejnou; v payloadu je rozlišíte podle companyId (a receiverId).
  • Při stovkách firem respektujte rate-limit na token (aktuální hodnotu vrací hlavička RateLimit-Limit); dávkujte s backoffem na 429 (hlavička Retry-After).
  • Webhook reálně chodí, až když je firma aktivní v Peppolu (po výběru Verteco jako poskytovatele u Finanční správy) a tedy skutečně přijímá doklady.

Datové modely

Pole objektů vracených API.

Company

PoleTypPovinnéPopis
idUUID–identifikátor firmy
icostring–IČO (8 číslic)
dicstring|null–IČ DPH
legalNamestring–obchodní jméno
registeredAddressstring|null–sídlo
peppolParticipantIdstring|null–účastník v Peppol (po registraci)
statusstring–pending_verification | active
rolestring–owner | admin | member | viewer (vaše role)
createdAtInstant–čas vytvoření

Document

PoleTypPovinnéPopis
idUUID–identifikátor dokladu
directionstring–sent | received
peppolMessageIdstring|null–ID Peppol zprávy
docTypeIdstring|null–typ dokumentu (Peppol)
senderIdstring|null–odesílatel (scheme:id)
receiverIdstring|null–příjemce (scheme:id)
invoiceNumberstring|null–číslo faktury
issueDatedate|null–datum vystavení
currencystring|null–měna (např. EUR)
totalAmountnumber|null–částka
statusstring–stav zpracování
createdAtInstant–čas záznamu

User · Token · Webhook

PoleTypPovinnéPopis
Userobjekt–{ id: UUID, email: string }
Tokenobjekt–{ id, name, prefix, lastUsedAt|null, createdAt }
Webhookobjekt–{ url: string|null, hasSecret: boolean }

Pole se načítají přímo z publikovaného openapi.json, takže tabulky jsou vždy totožné s tím, co API vrací. Popisy jsou v angličtině.

Načítám datové modely z openapi.json…

Slovník pojmů

DIČ
Daňové identifikační číslo (10 číslic). Slovenský Peppol identifikátor je 0245: + číslice DIČ, bez SK.
IČ DPH
Identifikační číslo pro DPH (SK + DIČ). Mají ho jen plátci DPH; neplátce vystavuje s kategorií O.
IČO
Identifikační číslo organizace (8 číslic). V API pole ico, v UBL BT-30.
Verifikační údaj (VÚ)
Podpis Finanční správy, který vznikne výběrem poskytovatele na portálu FS; odemyká odesílání za firmu.
VPDS
Výběr poskytovatele doručovací služby, aplikace Finanční správy, kde si subjekt volí pošťáka (nás).
TDD
Tax Data Document, hlášení údajů o faktuře Finanční správě; sestavujeme a posíláme ho za vás.
C5 / C6
Pátý a šestý roh Peppol modelu: přístupový bod Finanční správy, který TDD přijímá (0242:001180).
MLS
Message Level Status, doručenka od přístupového bodu příjemce (AP = přijato, RE = odmítnuto, AB = potvrzeno).
SBDH
Standard Business Document Header, obálka, v níž doklad cestuje sítí; její InstanceIdentifier je peppolMessageId.
SML / SMP
Adresář sítě: SML najde SMP příjemce, SMP řekne, jaký přístupový bod a jaké typy dokladů příjemce přijímá.

Slovenské konvence z praxe implementátorů

Nad rámec Peppol BIS Billing 3.0 se slovenští výrobci ERP a fakturačních systémů průběžně shodují na společné interpretaci volitelných polí (diskuse probíhá ve Slack kanálu Finanční správy). Níže jsou konvence, které náš portál už dnes respektuje: všechno jsou platné BIS konstrukce, přes naše API procházejí beze změny a přijaté doklady je zobrazují i v lidsky čitelném náhledu a PDF.

  • Odpočet zdaněné zálohy na řádku: záporný řádek s cac:DocumentReference, kde cbc:ID nese číslo daňového dokladu k přijaté platbě a cbc:DocumentTypeCode je 130 (BIS: invoice line object identifier, max. 1 na řádek). Přijatá faktura s takovým řádkem se v našem náhledu zobrazí s poznámkou „odpočet zálohy, daňový doklad č. …“.
  • Daňový doklad k přijaté platbě: podle FAQ Finanční správy se používá InvoiceTypeCode 388 (Tax invoice). Naším API i validací prochází; odpočet neuhrazené (nezdaněné) zálohy se vyjadřuje přes cbc:PrepaidAmount.
  • Storno faktury: dobropis 381 (CreditNote) s cac:BillingReference na původní fakturu, ne záporná faktura 380. Pozor: kód 384 síť pro slovenské strany odmítá (pravidlo PEPPOL-EN16931-P0112 ho povoluje jen mezi německými subjekty); na opravu nahoru slouží vrubopis 383.
  • BT-83 PaymentID: ve slovenské praxi se prosazuje tvar reference plátce /VS…/SS…/KS…; samotný variabilní symbol je také běžný. Naše zpracování hodnotu přenáší beze změny a zobrazuje ji u platebních údajů.
  • Doplňkové údaje položek (šarže, sériová čísla, expirace) přes cac:AdditionalItemProperty s ustálenými názvy jako BatchNumber, SerialNumber, ExpirationDate.
Jde o konvence komunity, ne závazná národní pravidla: přijímající systém musí zvládnout i doklad, který je nepoužívá. Jak se diskuse u Finanční správy uzavře, tuto sekci průběžně aktualizujeme (sledujte /changelog).

Přílohy dokladů (BT-125)

K e-faktuře je možné připojit přílohy (PDF, obrázky) jako base64 v elementu cac:AdditionalDocumentReference (BT-125). U přijatých dokladů zpracujeme přílohy do 25 MB na přílohu; při odesílání musí celé XML včetně base64 příloh zůstat do 10 MB přes SAPI-SK a do 2 MB přes záložku Odeslat souborem v portálu. Peppol jednotný celosíťový limit neurčuje, jednotliví poskytovatelé si ho stanovují sami (FS FAQ 9/DPH/2025/IM, příklad č. 67), takže u velmi velkých příloh si ověřte i limit poskytovatele druhé strany.

Veřejné nástroje (validace, ověření příjemce)

Dva pomocné endpointy bez autentizace: stejné validační jádro a stejný SML lookup, jaké používá náš Access Point. Hodí se do CI i do kontrol před odesláním; platí na ně přísnější veřejný rate limit.

POST/public/peppol-validateveřejné

Validace e-faktury proti schématu UBL 2.1, EN 16931 a Peppol BIS Billing 3.0: totéž, co UI validátor na /validator. Tělo požadavku = přímo UBL 2.1 XML (Invoice / CreditNote, případně celý Peppol SBD), Content-Type application/xml, limit 3 MB.

bash
curl -X POST https://peppol.verteco.digital/api/v1/public/peppol-validate \
-H "Content-Type: application/xml" \
--data-binary @faktura.xml
json
// 200 OK
{
"valid": false,
"errors": [
  "BR-CO-09: [BR-CO-09]-The Seller VAT identifier (BT-31) … shall have a prefix in accordance with ISO code…"
],
"warnings": []
}
// 400 = prázdné tělo (empty_document) nebo dokument nad 3 MB (document_too_large)
GET/public/peppol-check?id=0245:2121358349veřejné

Ověření příjemce v produkční síti Peppol (SML lookup): je registrovaný a jaké typy dokladů umí přijmout? Parametr id přijme Peppol ID (0245:…), IČ DPH (SK…) i samotné DIČ. Autentizovaná obdoba pro ERP pipeline: GET /sapi/discovery.

json
// 200 OK
{
"registered": true,
"participantId": "0245:2121358349",
"smp": "sml.peppol-smp.sk",
"capabilities": ["Faktúra (BIS Billing)", "Dobropis", "Self-billing", "MLS doručenky"],
"lastCheckedAt": "2026-08-31T…Z"
}

MCP server (AI asistenti)

Portál má vlastní server pro Model Context Protocol, otevřený standard, přes který se AI asistenti (Claude Code, Claude Desktop, Cursor, VS Code Copilot a další) připojují k externím systémům. Asistent se přihlásí běžným API klíčem účtu a dostane šest nástrojů; nikdy nevidí víc než ten účet a každé volání je v API logu klíče.

Adresa: https://peppol.verteco.digital/api/mcp. Transport: Streamable HTTP, JSON-RPC 2.0, bezstavově (POST /api/mcp, žádný SSE stream, GET vrátí 405). Přihlášení hlavičkou Authorization: Bearer <API klíč>. Podporované metody: initialize, ping, tools/list, tools/call, resources/list, prompts/list.

Nástroje

  • list_companies: firmy účtu s Peppol ID, stavem a rolí (začátek každé konverzace)
  • list_documents: odeslané/přijaté faktury firmy se stavem doručení a hlášení FS, stránkované
  • get_document: detail faktury včetně doručenky MLS a hlášení FS, volitelně UBL XML (do 1 MB)
  • check_participant: živé ověření příjemce v síti Peppol (SML)
  • validate_document: validace UBL proti EN 16931 + Peppol BIS 3.0
  • send_document: odeslání faktury za firmu, vyžaduje confirm = true a platí brána Verifikačního údaje

Připojení v Claude Code

bash
claude mcp add --transport http verteco-peppol https://peppol.verteco.digital/api/mcp \
  --header "Authorization: Bearer vpt_..."

Claude Desktop (přes most mcp-remote, potřebuje Node.js)

json
{
  "mcpServers": {
    "verteco-peppol": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://peppol.verteco.digital/api/mcp", "--header", "Authorization: Bearer vpt_..."]
    }
  }
}

Odeslání faktury je právně závazné: nástroj bez confirm = true odmítne volání a asistent má v instrukcích serveru pokyn vyžádat si výslovný souhlas uživatele s konkrétní fakturou a příjemcem. Hotové konfigurace pro Cursor a VS Code a tlačítko na vytvoření klíče najdete v portálu: API klíče → záložka MCP server. API klíče → MCP server

Odesílání e-mailem (adresa firmy)

Firma si v portálu zapne vlastní adresu <24 náhodných znaků>@peppol.send.verteco.app. E-mail s přílohou UBL XML poslaný na tuto adresu z povolené schránky odešleme přes síť Peppol stejně, jako kdybyste soubor nahráli na záložce Odeslat souborem; odesílatel dostane jednu odpověď s výsledkem za každou přílohu a doklad je v portálu i v API se stavem doručení, doručenkou MLS a hlášením FS. Nastavení: Propojení a integrace → Odesílání e-mailem (vlastník nebo správce firmy, jen po přihlášení). /dashboard/integrations/email

Pravidla zpracování

  • Přijmeme jen zprávu od adresy na seznamu povolených odesílatelů firmy (nejvýše 20); ostatní zahodíme bez odpovědi.
  • Předvoleně musí doména odesílatele projít ověřením SPF nebo DKIM u doručujícího serveru (sladění jako u DMARC, relaxed). Doručující server navíc odmítá zprávy, které neprošly ani SPF, ani DKIM, a zprávy proti DMARC politice odesílatele. Kontrolu lze vypnout v nastavení, nedoporučujeme.
  • Příloha: UBL 2.1 Invoice nebo CreditNote (Peppol BIS Billing 3.0), přípona .xml, případně v obálce SBDH; nejvýše 10 příloh ve zprávě, 15 MB na přílohu, 200 zpráv na adresu za den. PDF a text zprávy se nezpracovávají.
  • IFS Finvoice 2.0: přílohu .xml se SOAP obálkou IFS (IFSFinvoice) nebo samotný Finvoice převedeme na UBL a dál zpracujeme stejně. Pravidla převodu: INV02 nebo záporná částka = dobropis (381) s kladnými částkami a odkazem na původní fakturu (OriginalInvoiceNumber, u IFS OrderIdentifier); prodejce a odběratel podle slovenského IČ DPH (SellerOrganisationTaxCode, BuyerOrganisationTaxCode → 0245:DIČ), odběratel mimo SR se nepřevádí; rozpis DPH z VatSpecificationDetails, řádky s 0 % jako kategorie E s důvodem z VatFreeText, jinak „Osvobozeno od DPH“; zaokrouhlovací řádky IFS (základ 0,00, DPH 0,01) se vynechají, cena řádku, která nesedí s částkou řádku, se přepočítá; jednotky podle UN/ECE (kg → KGM, pcs → H87, h → HUR, neznámé → C62 s původním textem v poznámce řádku); vložený obraz faktury (InvoiceAttachments, PDF) jde jako příloha dokladu do 5 MB; jen EUR. Výsledek převodu je v odpovědi i v deníku firmy.
  • Adresa pro výsledky: pokud faktury posílá systémová schránka, v nastavení zvolíte jinou adresu, na kterou chodí odpověď s výsledkem (pole replyTo v PUT /companies/{id}/email-send, prázdné = odpovědět odesílateli).
  • Prodejce v XML (EndpointID dodavatele, BT-34) musí být tato firma, jinak zprávu odmítneme (přeposlaná faktura od vašeho dodavatele se nikdy neodešle jako vaše). Odběratel musí mít EndpointID se schématem (BT-49).
  • Stejná zpráva (Message-ID) se zpracuje jednou. Doklad má v API a webhoocích origin = email, aktér = adresa odesílatele.
Adresa je kapacita: kdo ji zná a je na seznamu povolených, odesílá za firmu. Proto ji lze kdykoli vyměnit (tlačítko Vygenerovat novou adresu; stará přestává platit okamžitě) a každé přijetí je v deníku firmy i v bezpečnostním záznamu.

Stav (ping)

Veřejný health-check endpoint, vhodný pro monitoring.

GET/pingveřejné

Stav backendu.

json
// 200 OK
{ "service": "peppol-portal-backend", "status": "ok", "timestamp": "2026-06-17T…Z" }

Živý přehled všech komponent najdete na stránce stavu systémů.

Co je hotové a co připravujeme

Už v produkci (často mylně považované za chybějící)

  • POST /companies/{id}/documents/send je stabilní rozhraní portálu; pro ERP integrace zůstává doporučené SAPI-SK s Idempotency-Key.
  • Registrace do SMP probíhá automaticky po výběru na portálu FS; přechod od jiného pošťáka přes POST /companies/{id}/smp-migrate s migračním kódem.
  • Doručenky MLS, důkazy doručení a hlášení FS (fsReport) v každém řádku /sapi/document/sent; replay webhooků za časové okno.
  • Klíč omezený na vybrané firmy; MCP server pro AI asistenty; vzory UBL na /vzory; veřejný validátor.

Připravujeme (pořadí podle poptávky integrátorů)

  • Asynchronní batch: POST /sapi/document/batch odpoví 202 s odkazem na job a stav po položkách.
  • Změnový kanál GET /sapi/document/changes?since&cursor s kurzorem namísto stránkování offsetem.
  • Expirace a rotace API klíčů v portálu, klíč jen pro čtení.
  • Více webhook endpointů na firmu s filtrem událostí.
Chybí vám něco konkrétního? Napište na [email protected], co a pro kolik dokladů; ovlivní to pořadí.