Ú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.
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
Vytvořte si účet v portálu
Zaregistrujte se e-mailem a potvrďte ho odkazem z e-mailu. - 2
Vygenerujte API token
V portálu API tokeny → Vytvořit. Tokenvpt_…se zobrazí pouze jednou. Uložte si ho bezpečně. - 3
Udělejte první volání
Token použijte v hlavičceAuthorization:javascriptconst res = await fetch('https://peppol.verteco.digital/api/v1/companies', { headers: { Authorization: 'Bearer vpt_8f2a…' }, }); const companies = await res.json(); - 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é.
export BASE=https://test.peppol.verteco.digital # production: https://peppol.verteco.digital
export KEY=vpt_… # step 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
Ověřte klíč
shellcurl -s $BASE/api/v1/auth/me -H "Authorization: Bearer $KEY"json{ "id": "7f1d…", "email": "dev@firma.sk", "emailVerified": true, "persona": "developer" } - 3
Vytvořte firmu
shellcurl -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
SAPI access token
shellcurl -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
Zvalidujte doklad bez odeslání
shellcurl -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
Odešlete a sledujte stav
shellcurl -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"jsonHTTP/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" } } ] }
Testovací prostředí (sandbox)
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 jako9950:SK<DIČ>, protože schéma 0245 vyžaduje ověřovací kód Finanční správy, který v testu neexistuje. V produkci se registruje0245:<čí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(nebo502,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ři500(SAPI-PROC-500) a429(SAPI-SYS-003 sRetry-After) dostanete chybovou obálku SAPI;503a502projdou přes okraj sítě (DigitalOcean, Cloudflare) jakoHTTP 504s 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.
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 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í:
// 401 Unauthorized
{ "error": "unauthorized", "message": "Authentication required" }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
| Typ | Formát | Příklad |
|---|---|---|
id | UUID (string) | 08dd6c1e-… |
časové značky | ISO-8601 Instant (UTC) | 2026-06-03T09:40:27Z |
issueDate | datum (YYYY-MM-DD) | 2026-06-03 |
totalAmount | desetinné číslo | 120.00 |
chybějící hodnoty | null (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.
Chyby
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).
// 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)
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ód | HTTP | Kdy |
|---|---|---|
validation_failed | 400 | tělo nesplnilo validaci (viz fields) |
unauthorized | 401 | chybí nebo neplatný API token |
forbidden | 403 | akce vyžaduje roli owner/admin |
company_not_found | 404 | firma neexistuje nebo nejste jejím členem |
ico_taken | 409 | firma s tímto IČO už existuje |
ico_immutable | 400 | IČO se nedá změnit |
company_dic_missing | 400 | ověření odesílání bez DIČ firmy |
token_invalid | 400 | verifikační údaj (podpis) nesedí |
document_not_found | 404 | doklad neexistuje |
token_not_found | 404 | API token neexistuje / není váš |
rate_limited | 429 | příliš mnoho requestů |
Výpadek přístupového bodu a opakování
- Pokud API odpoví
502,503nebo504, případně neodpoví vůbec, doklad jsme nepřevzali: zopakujte volání později se stejnýmIdempotency-Key, nic se neodešle dvakrát. - Doklad, který API přijalo (
202ACCEPTED, i sretrying: true), odejde po obnově sám: přístupový bod doručení opakuje a stav vidíte přesGET /sapi/document/sentnebo 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ód | Význam |
|---|---|
SAPI-AUTH-001 | neplatné client_id/client_secret nebo zablokovaný účet (401) |
SAPI-AUTH-002 | chybějící nebo neplatná hlavička Authorization: Bearer (401) |
SAPI-AUTH-003 | klíč není oprávněn pro daného účastníka, odesílání není odemčeno nebo je pozastaveno (403) |
SAPI-AUTH-004 | IP adresa není na allowlistu klíče (403) |
SAPI-VAL-001 | neplatné tělo požadavku (400) |
SAPI-VAL-002 | chybí X-Peppol-Participant-Id (400) |
SAPI-PROC-001 | dočasný stav: odeslání s tímto klíčem právě probíhá, zopakujte za chvíli (502, retryable) |
SAPI-PROC-002 | doklad odmítnut před odesláním (422 s Prefer: handling=strict) |
SAPI-PROC-003 | bez Idempotency-Key: pod tímto číslem už byl odeslán jiný doklad (409, details: documentId, status) |
SAPI-RES-001 | doklad neexistuje nebo nepatří účastníkovi (404) |
SAPI-RES-002 | obsah dokladu už není uložen (retence firmy) nebo nebyl archivován (404, kód zůstává kvůli kompatibilitě) |
SAPI-RES-003 / 004 | příloha nebo doručenka MLS zatím neexistuje (404) |
SAPI-SYS-001 / 002 | dočasná chyba infrastruktury nebo validátoru (503/502, retryable) |
SAPI-SYS-003 | překročený rate limit (429, Retry-After) |
SAPI-PROC-500 | neoč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_exists | Pre tento e-mail už účet existuje. Prihláste sa a pozvánku prijmite v portáli. |
account_inactive | Váš účet nie je aktívny. Kontaktujte nás, prosím. |
account_under_review | Váš účet práve overujeme. Zavolajte nám alebo napíšte na [email protected]. |
acknowledge_required | Potvrďte, že rozumiete rizikám sťahovania bez autorizácie. |
acknowledgement_required | Potvrďte, že rozumiete dôsledkom ukončenia zmluvy. |
address_book_full | Adresár je plný. Odstráňte nepoužívaných klientov a skúste znova. |
admin_email_unverified | Prí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_required | Prístup do administrácie vyžaduje zapnuté dvojfaktorové overenie. Zapnite si ho v Nastaveniach. |
ai_budget | Rozpočet na AI návrhy je vyčerpaný alebo ste dosiahli denný limit. Odpoveď napíšte ručne. |
ai_failed | Návrh odpovede sa nepodarilo vygenerovať. Skúste to znova. |
ai_unavailable | AI návrhy odpovedí momentálne nie sú k dispozícii. |
already_completed | Prevod firmy už bol dokončený. |
already_member | Tento používateľ už má prístup (je členom firmy alebo vášho tímu). |
attachment_external | Táto príloha je uložená u odosielateľa ako odkaz, nie priamo vo faktúre. |
attachment_invalid | Niektorú 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_found | Príloha sa nenašla. |
attachment_not_readable | Prílohu sa nepodarilo prečítať. |
billing_unconfigured | Platby predplatného zatiaľ nie sú k dispozícii. |
blocked | Na túto adresu nemôžeme testovací webhook poslať (lokálne alebo interné adresy nie sú povolené). |
body_required | Napíšte, prosím, text správy. |
body_too_long | Správa môže mať najviac 4000 znakov. |
cannot_change_self | Vlastnú rolu si nemôžete zmeniť. Požiadajte druhého správcu firmy. |
cannot_invite_self | Nemôžete pozvať sami seba ani prijať vlastnú pozvánku. |
cannot_release_to_self | Firma už je pod týmto účtom. |
cannot_remove_owner | Vlastní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_self | Firma už patrí tomuto e-mailu. |
captcha_failed | Overenie proti robotom zlyhalo. Skúste to znova. |
captcha_required | Overenie proti robotom zlyhalo, obnovte stránku a skúste znova. |
channel_unknown | Starý záznam bez známeho kanála sa nedá zopakovať. Použite ručný re-POST na správny endpoint. |
chat_not_found | Konverzácia sa nenašla alebo je prázdna. |
client_not_found | Firma nepatrí pod tento partnerský účet. |
client_not_removable | Firmu sa nedá odstrániť: je overená Finančnou správou, aktívna, registrovaná v SMP alebo má doklady. Použite odpojenie (release). |
company_active | Aktívnu firmu nie je možné odstrániť. |
company_address_required | Pred odoslaním faktúry doplňte sídlo firmy (ulica, mesto, PSČ) v detaile firmy. |
company_already_active | Firma je už aktívna, pokyny na aktiváciu nie sú potrebné. |
company_dic_missing | Najprv doplňte DIČ firmy, potom skúste overenie znova. |
company_incomplete | Pred podpisom doplňte údaje firmy: obchodné meno, Peppol identifikátor a úplné sídlo. |
company_limit | Dosiahli ste maximálny počet firiem na účet. Kontaktujte podporu, limit vám zvýšime. |
company_name_mismatch | Obchodné meno sa nezhoduje s oficiálnym registrom (ŽR/OR SR) pre zadané IČO. |
company_not_active | Migračný kód možno vydať len aktívnej firme zaregistrovanej v sieti Peppol. |
company_not_found | Firma sa nenašla. |
company_not_registered | Firma ešte nie je aktivovaná: dokončite výber Verteco na portáli Finančnej správy, potom môžete odosielať. |
company_not_verified | Migrá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_invalid | Dô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_locked | Obchodné meno overenej firmy sa dá zmeniť len podľa oficiálneho registra. Najprv doplňte IČO alebo nám napíšte. |
confirm_name_mismatch | Zadaný názov sa nezhoduje s názvom zapísaného sprostredkovateľa. |
confirmation_required | Podpis vyžaduje potvrdenie vášho oprávnenia a súhlasu so znením. |
conflict | Takýto záznam už existuje. |
content_unavailable | Obsah tohto dokladu už nie je uložený alebo sa nedá prečítať ako faktúra. |
contract_pending | Zmluvný 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_invalid | Krajina musí byť dvojpísmenový kód ISO (SK, CZ, AT, DE…), nie názov. |
country_outside_eu | Online ž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_missing | Zoznam musí obsahovať aj vašu aktuálnu IP adresu, inak by ste sa po odhlásení zamkli. |
daily_limit | Dosiahli ste denný limit správ. Skúste to zajtra alebo nám napíšte na [email protected]. |
delivery_failed | Testovací webhook sa nepodarilo doručiť, váš endpoint neodpovedal. |
delivery_not_found | Záznam o doručení webhooku sa nenašiel. |
deregister_cooldown | Z jednej IP adresy možno odstrániť najviac jednu firmu za 60 sekúnd. Skúste to o chvíľu. |
dic_immutable | Peppol identifikátor sa nedá zmeniť: je to identita firmy v sieti Peppol. |
dic_required | Zadajte DIČ firmy (SK + 10 číslic). |
dic_taken | Firma s týmto DIČ už v portáli existuje. |
directory_unavailable | Centrálne SMP momentálne neodpovedá alebo zmenu neprijalo. Skúste to o chvíľu znova. |
document_no_xml | Uložené originálne XML už neexistuje, hlásenie sa nedá znova vytvoriť. |
document_not_found | Doklad sa nenašiel. |
document_too_large | Dokument je príliš veľký (limit 3 MB). |
domestic_subject | Slovenský subjekt podáva žiadosť po prihlásení na stránke /sprostredkovatel/ziadost. |
duplicate_invoice_number | Doklad s týmto číslom už bol odoslaný. Nový doklad musí mať iné číslo; rovnaký doklad sa druhýkrát neodosiela. |
email_change_cooldown | Potvrdzovací e-mail sme už poslali. Ďalší môžete vyžiadať o 10 minút. |
email_invalid | Zadajte platnú e-mailovú adresu. |
email_not_verified | Najprv potvrďte svoj e-mail. Odkaz sme vám poslali. |
email_send_company_not_active | Prijímanie na e-mail sa dá zapnúť až pre aktívnu firmu s Peppol identifikátorom. |
email_send_unavailable | Prijímanie faktúr e-mailom nie je v tomto prostredí zapnuté. |
email_taken | Túto e-mailovú adresu už používa iný účet. |
email_unchanged | Toto je vaša súčasná e-mailová adresa. |
empty_document | Vložte XML faktúry. |
empty_idea | Napíšte, prosím, čo by sme mali zlepšiť. |
empty_message | Správa je prázdna. |
empty_reply | Odpoveď je prázdna. |
entry_not_found | Klient v adresári sa nenašiel. |
export_format_unknown | Neznámy formát exportu. |
export_too_large | Jeden export obsiahne najviac 10 000 dokladov. Zúžte obdobie alebo si nastavte pravidelný export na záložke Notifikácie. |
forbidden | Na túto akciu nemáte oprávnenie. |
forwarder_unreachable | Služ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_required | Potvrď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_readonly | IČO a DIČ sa meniť nedajú; zmena identity subjektu je nový zápis. |
fs_change_no_changes | Nezadali 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_queued | Odoslať hneď sa dá len žiadosť, ktorá čaká na odoslanie. |
fs_change_pending | Jedna žiadosť o zmenu už čaká alebo je u Finančnej správy. Ďalšiu podáte po jej vybavení. |
fs_secret_invalid | Kľúč 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_mismatch | Kľúč 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_documents | Firma má doklady v archíve, jej odstránenie je zablokované (zákonná archivácia). |
holding_unavailable | Odpojenie klienta momentálne nie je možné. Kontaktujte podporu. |
iban_invalid | IBAN 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_immutable | IČO sa nedá zmeniť. |
ico_required | IČO je povinné (8 číslic). |
ico_taken | Firma s týmto IČO už existuje pod iným účtom. Prihláste sa ním alebo nám napíšte. |
instructions_cooldown | Pokyny k tejto firme sme už poslali. Znova ich možno poslať po 24 hodinách. |
integration_not_found | Neznáma integrácia. |
internal | Nastala neočakávaná chyba. Skúste to znova. |
internal_error | Nastala neočakávaná chyba na serveri. Skúste to znova, chybu sme zaznamenali. |
invalid_action | Neznáma akcia. |
invalid_after | Parameter after musí byť dátum a čas v tvare ISO 8601 (napr. 2026-09-05T10:00:00Z). |
invalid_amount | Suma musí byť číslo. |
invalid_billing_model | Neznámy fakturačný model. Vyberte jeden z ponúkaných modelov. |
invalid_country | Vyberte krajinu sídla. |
invalid_credentials | Nesprávny e-mail alebo heslo. |
invalid_current_password | Aktuálne heslo nie je správne. |
invalid_date | Dátum musí byť v tvare RRRR-MM-DD. |
invalid_default_company | Predvolená firma musí byť jedna z vašich firiem. |
invalid_dic | Zadajte platné DIČ (10 číslic, prípadne s predponou SK) alebo IČ DPH. |
invalid_direction | Smer dokladov musí byť „odoslané“ alebo „prijaté“. |
invalid_due_days | Splatnosť musí byť 0 až 365 dní. |
invalid_email | Zadajte platnú e-mailovú adresu. |
invalid_feed_url | Adresa feedu musí začínať https://. |
invalid_ico | Zadajte platné IČO (8 číslic) alebo registračné číslo spoločnosti. |
invalid_id | Zadajte slovenské IČ DPH alebo DIČ (napr. SK2121358349), alebo Peppol ID (napr. 0245:2121358349). |
invalid_ids | Zoznam dokladov nie je platný. |
invalid_invite | Pozvánka je neplatná alebo už bola použitá. |
invalid_ip_entry | Zoznam obsahuje neplatnú položku. Povolené sú IP adresy (napr. 185.76.8.211) a rozsahy CIDR (napr. 185.76.8.0/24). |
invalid_key | Kľúč sprostredkovateľa musí mať 3 až 40 znakov: malé písmená, číslice a pomlčky. |
invalid_limit | Limit musí byť aspoň 1, alebo prázdny (predvolená hodnota). |
invalid_link | Prihlasovací odkaz je neplatný alebo už vypršal. Vyžiadajte si nový. |
invalid_locale | Nepodporovaný jazyk. |
invalid_month | Mesiac musí byť v tvare RRRR-MM. |
invalid_notification_email | Jedna z adries nie je platný e-mail: |
invalid_notify_event | Neznáma udalosť notifikácie. |
invalid_notify_locale | Jazyk e-mailov musí byť slovenčina, angličtina, nemčina alebo maďarčina. |
invalid_notify_mode | Neznámy režim notifikácií. Vyberte: každá udalosť, denný súhrn, týždenný súhrn alebo žiadne. |
invalid_password | Nesprávne heslo. |
invalid_pattern | Formát číslovania musí mať najviac 64 znakov a obsahovať poradové číslo {N}, {NNN} alebo {NNNN} presne raz. |
invalid_payload | Faktúra (XML) chýba alebo je príliš veľká. |
invalid_persona | Neznáma rola účtu. |
invalid_phone | Telefón zadajte v tvare +421 9xx xxx xxx (číslice, medzery, prípadne pomlčky). |
invalid_prefs | Nastavenia zobrazenia obsahujú neplatnú hodnotu a nepodarilo sa ich uložiť. |
invalid_receiver | Príjemca musí mať Peppol identifikátor v tvare schéma:hodnota (napr. 0245:2121358349). |
invalid_request | Chýbajú povinné údaje (napr. názov firmy, DIČ s 10 číslicami, platný e-mail alebo adresa endpointu). |
invalid_role | Rola musí byť správca, člen alebo iba na čítanie. |
invalid_seq | Ďalšie poradové číslo musí byť aspoň 1. |
invalid_session | Neplatná konverzácia. Obnovte stránku a skúste znova. |
invalid_signature | Notifikáciu o platbe sa nepodarilo overiť. |
invalid_signup | Registrácia už nie je platná alebo vypršala. Začnite registráciu znova. |
invalid_sort | Neznáme triedenie. |
invalid_state | Neznámy stav. |
invalid_status | Neznámy stav. |
invalid_tag | Štítok nemôže byť prázdny. |
invalid_token | Odkaz je neplatný alebo už bol použitý. |
invalid_vpds_url | Výberový odkaz musí začínať https://vpds.financnasprava.sk/. |
invalid_web | Web musí byť platná adresa (https://...). |
invalid_webhook_url | Webhook 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_xml | XML dokladu sa nedá prečítať (poškodený súbor alebo nepovolená deklarácia DOCTYPE). |
invite_email_mismatch | Táto pozvánka je určená pre inú e-mailovú adresu. Prihláste sa účtom, na ktorý prišla. |
invite_expired | Platnosť pozvánky vypršala. Požiadajte o novú. |
ip_not_allowed | Prihlásenie z tejto IP adresy nie je pre tento účet povolené. |
lead_no_email | Kontakt nemá e-mailovú adresu, nedá sa osloviť. |
lead_not_contactable | Osloviť možno len kontakt v stave „nový“. |
lead_not_found | Kontakt sa nenašiel. |
link_gone | Tento odkaz už nie je platný (vypršal, bol zrušený alebo obsah dokladu už nie je uložený). |
lookup_unavailable | Register alebo overenie je momentálne nedostupné. Skúste to o chvíľu. |
malformed_request | Požiadavka nemá platný tvar. Obnovte stránku a skúste znova. |
manager_required | Túto zmenu môže urobiť len vlastník alebo správca firmy. |
member_is_owner | Tento používateľ je vlastníkom firmy. Vlastníctvo sa mení prevodom firmy. |
member_not_found | Člen sa nenašiel. |
members_full | Firma dosiahla maximálny počet členov. |
method_not_allowed | Táto operácia nie je pre danú adresu podporovaná. |
mfa_already_enabled | Dvojfaktorové overenie už máte zapnuté. |
mfa_code_invalid | Kód nesedí. Skúste aktuálny kód z aplikácie alebo záložný kód. |
mfa_not_enabled | Záložné kódy patria k dvojfaktorovému overeniu. Najprv ho zapnite. |
mfa_not_started | Najprv spustite nastavenie dvojfaktorového overenia. |
mfa_required | Zadajte kód z autentifikačnej aplikácie. |
migration_code_live | Predoš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_rejected | SMP migračný kód neprijalo. Overte kód u predchádzajúceho poskytovateľa, kódy sú jednorazové a časovo obmedzené. |
migration_code_required | Zadajte migračný kód od predchádzajúceho poskytovateľa. |
migration_rejected | Centrálne SMP požiadavku o prevzatie odmietlo. Skúste to znova alebo nám napíšte. |
missing_fields | Názov a e-mail vlastníka sú povinné. |
missing_parameter | V požiadavke chýba povinný parameter. |
mls_not_available | Pre tento doklad zatiaľ nie je doručenka (MLS) k dispozícii. |
name_required | Zadajte názov (meno klienta alebo obchodné meno). |
no_billing_account | Zatiaľ nemáte fakturačný účet. Najprv nastavte predplatné. |
no_body | Záznam nemá uložené telo požiadavky, nedá sa zopakovať. |
no_content | Obsah dokladu už nie je k dispozícii, odkaz sa nedá vydať. |
no_dic | Firma nemá DIČ. |
no_documents | Za zvolené obdobie nie sú žiadne doklady (s uloženým XML). |
no_evidence | Pre tento doklad nie je uložený originál XML ani doručenka. |
no_ids | Vyberte aspoň jeden doklad. |
no_owner | Firma nemá vlastníka. Použite priame preradenie. |
no_secret | Podpisový kľúč zatiaľ neexistuje. Najprv nastavte notifikačnú webhook URL. |
no_verification_token | Firma nemá uložený verifikačný údaj z Finančnej správy, registrácia do SMP ho vyžaduje. |
not_a_reseller | Tento účet nie je vlastníkom zápisu sprostredkovateľa. |
not_acceptable | Server odpovedá len vo formáte JSON. |
not_available_for_white_label | Pre firmy pod značkou sprostredkovateľa nie je táto voľba dostupná. |
not_failed | Opakovať možno len nedoručené webhooky. |
not_found | Záznam sa nenašiel. |
not_reseller | Tento účet nie je vlastníkom zápisu sprostredkovateľa. |
not_sandbox_row | Tento zápis sprostredkovateľa spravuje správca, z účtu sa nedá vypnúť. |
note_too_long | Poznámka môže mať najviac 200 znakov. |
notification_emails_too_long | Adresy 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_companies | Pre zmazanie účtu najprv požiadajte o migračný kód alebo firmu odregistrujte zo siete Peppol. Potom budete môcť účet vymazať natrvalo. |
owner_required | Túto akciu môže vykonať len vlastník účtu firmy. |
participant_not_registered | Firma zatiaľ nemá záznam v centrálnom SMP pod Verteco; zverejnenie nastavíte po registrácii. |
partner_managed | Zmluvný vzťah tejto firmy vedie jej sprostredkovateľ; potvrdenie o zmluve vystavuje on. |
party_missing_in_text | Podpisované znenie neobsahuje identifikáciu firmy. Obnovte stránku a skúste znova. |
password_already_set | Heslo 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_required | Najprv si nastavte heslo (Zabezpečenie), potom môžete túto zmenu potvrdiť. |
payment_mismatch | Platbu sa nepodarilo spárovať so žiadosťou. Kontaktujte nás, prosím. |
payment_unconfigured | Platba momentálne nie je dostupná. Skúste neskôr alebo nás kontaktujte. |
pdf_unavailable | Generovanie PDF je dočasne nedostupné. Skúste to o chvíľu alebo použite Vytlačiť / PDF. |
profile_too_long | Niektoré pole prezentácie je príliš dlhé. Skráťte text. |
public_link_exists | Doklad už má aktívny odkaz. Ak ho chcete nahradiť, zvoľte nahradenie odkazu. |
public_links_disabled | Firma nemá zapnuté sťahovanie faktúr bez autorizácie. Zapne ho vlastník v detaile firmy (Archív dát). |
public_links_unavailable | Verejné odkazy na doklady sú momentálne vypnuté. |
rate_limited | Príliš veľa požiadaviek. Skúste to o chvíľu. |
read_only_member | Rola „iba na čítanie“ nemôže meniť stav ani štítky dokladov. |
received_only | Verejný odkaz sa vydáva len na prijaté doklady. |
receiving_toggle_cooldown | Prí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_unavailable | Ná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_cancelled | Túto odpoveď medzitým zrušil iný pracovník. |
reply_already_sent | Táto odpoveď už bola odoslaná, nedá sa zrušiť ani poslať znova. |
reply_not_found | Naplánovaná odpoveď sa nenašla. |
reply_to_invalid | Adresa pre výsledky nemá tvar e-mailu. |
representative_incomplete | Uveďte meno aj funkciu osoby oprávnenej konať, alebo nechajte obe polia prázdne. |
request_rejected | Pož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_found | Sprostredkovateľ sa nenašiel. |
reseller_owner | Váš účet vlastní zápis sprostredkovateľa. Prenos zápisu dohodnite s podporou, potom budete môcť účet zmazať. |
reseller_required | Táto časť je len pre účet zapísaného sprostredkovateľa. |
sbd_not_available | Tento doklad nemá uloženú prenosovú obálku (SBDH). Stiahnite XML dokladu. |
schedule_not_found | Tento pravidelný export už neexistuje. |
sender_email_invalid | Adresa odosielateľa nemá tvar e-mailu. |
sender_email_system | Systémové adresy (noreply, postmaster, mailer-daemon…) nemožno pridať; použite schránku osoby alebo fakturačného systému. |
sender_exists | Táto adresa už je medzi povolenými odosielateľmi. |
sender_limit | Povolených odosielateľov môže byť najviac 20. |
sending_not_verified | Odosielanie nie je povolené: firma ešte nemá overený výber poskytovateľa na portáli Finančnej správy. |
sending_paused | Odosielanie je pre túto firmu pozastavené jej spravujúcim účtom. Príjem faktúr beží ďalej. |
service_unavailable | Služba je dočasne nedostupná. Skúste to, prosím, o chvíľu. |
session_full | Táto konverzácia je príliš dlhá. Obnovte stránku a začnite novú. |
session_not_found | Zariadenie sa nenašlo. |
shoptet_feed_blocked | Adresa smeruje na neverejnú sieť. Vložte verejnú adresu vášho e-shopu. |
shoptet_feed_http | Shoptet adresu odmietol. Skontrolujte hash v adrese a či export nie je obmedzený na konkrétnu IP adresu. |
shoptet_feed_invalid_xml | Odpoveď exportu nie je platné XML. Skontrolujte adresu v Shoptete. |
shoptet_feed_not_configured | Prepojenie so Shoptetom ešte nie je nastavené. |
shoptet_feed_not_orders_xml | Toto nie je export objednávok zo Shoptetu: adresa musí končiť na /export/orders.xml. |
shoptet_feed_not_system_xml | Vlož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_large | Odpoveď 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_unreachable | Export zo Shoptetu neodpovedal. Skúste to o chvíľu znova; Shoptet dovoľuje len jeden export naraz. |
sidlo_incomplete | Sídlo musí obsahovať ulicu, PSČ a mesto, napríklad „Ulica 1, 010 01 Mesto“. |
smp_cancel_failed | Zrušenie kódu v centrálnom SMP sa nepodarilo. Skúste to o chvíľu alebo napíšte na [email protected]. |
smp_deregister_failed | Odregistrácia zo siete Peppol sa nepodarila. Skúste to o chvíľu znova. |
smp_held_elsewhere | Registráciu tejto firmy drží iný poskytovateľ. Migračný kód od nás nie je potrebný. |
smp_not_test | Testovacie prostredie nie je správne prepojené s testovacím SMP. Napíšte nám. |
smp_unavailable | Centrálne SMP momentálne neodpovedá; skúste to o chvíľu znova. |
smtp_fromAddress_required | Zadajte adresu odosielateľa. |
smtp_fromAddress_too_long | Adresa odosielateľa je príliš dlhá. |
smtp_from_forbidden | Adresa odosielateľa nemôže byť na doméne Verteco. |
smtp_from_invalid | Adresa odosielateľa nemá tvar e-mailu. |
smtp_from_not_yours | Adresa odosielateľa musí byť na doméne vašej firmy (ako e-mail vlastníka, člena alebo notifikačný e-mail firmy). |
smtp_from_taken | Túto adresu odosielateľa už používa iná firma. |
smtp_host_blocked | Server sa nedá nájsť v DNS alebo nie je verejne dosiahnuteľný (interné adresy nie sú povolené). |
smtp_host_invalid | Zadajte doménové meno servera (napr. smtp.firma.sk), nie IP adresu. |
smtp_host_required | Zadajte adresu SMTP servera. |
smtp_host_too_long | Adresa SMTP servera je príliš dlhá. |
smtp_incomplete | Vyplňte server, port, prihlasovacie meno, heslo a adresu odosielateľa. |
smtp_password_invalid | Heslo nesmie obsahovať medzery ani nové riadky. |
smtp_password_required | Zadajte heslo k SMTP účtu (pri zmene servera ho treba zadať znova). |
smtp_port_not_allowed | Povolené porty sú 465, 587 a 2525. |
smtp_security_invalid | Zabezpečenie musí byť STARTTLS alebo SSL. |
smtp_test_cooldown | Skúšobný e-mail možno poslať raz za minútu. Skúste to o chvíľu. |
smtp_test_failed | Skúšobný e-mail sa nepodarilo odoslať. Skontrolujte nastavenia SMTP servera. |
smtp_username_invalid | Prihlasovacie meno nesmie obsahovať medzery ani nové riadky. |
smtp_username_required | Zadajte prihlasovacie meno k SMTP účtu. |
smtp_username_too_long | Prihlasovacie meno je príliš dlhé. |
state_not_for_direction | Tento stav nie je možný pre daný smer dokladu (prijatý alebo odoslaný). |
stripe_error | Platobnú bránu sa nepodarilo otvoriť alebo platbu overiť. Skúste to znova. |
support_not_on_sandbox | Podpora beží na ostrom portáli peppol.verteco.digital, nie v testovacom prostredí. |
tag_too_long | Štítok je príliš dlhý. |
target_blocked | Cieľový účet je zablokovaný, prevod naň nie je možný. |
team_full | Dosiahli ste maximálny počet členov tímu. |
termination_confirmed | Potvrdenú 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_accepted | Na vytvorenie účtu je potrebné súhlasiť s obchodnými podmienkami. |
test_document_in_production | Skúš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_expired | Požiadavka je uzavretá dlhšie ako 90 dní, odkaz už nie je platný. Napíšte nám znova na [email protected]. |
ticket_not_found | Požiadavka sa nenašla alebo odkaz nie je platný. |
token_companies_required | Vyberte aspoň jednu firmu, ku ktorej má mať kľúč prístup. |
token_company_not_allowed | Tento API kľúč nemá prístup k tejto firme (bol vytvorený len pre vybrané firmy). |
token_company_not_member | Kľúč môže mať prístup len k firmám, ktorých je váš účet členom. |
token_expired | Platnosť odkazu vypršala. Vyžiadajte si nový. |
token_invalid | Odkaz alebo verifikačný údaj je neplatný, prípadne už neplatí. |
token_limit | Máte príliš veľa aktívnych API kľúčov (max 50). Zrušte nepoužívané a skúste znova. |
token_not_allowed | Toto nastavenie sa mení len po prihlásení v portáli, nie cez API kľúč. |
token_not_found | API kľúč sa nenašiel. |
token_not_revoked | Tento API kľúč je aktívny, nie je čo obnovovať. |
token_restore_expired | Kľúč bol zrušený pred viac ako 7 dňami a už sa nedá obnoviť. Vytvorte nový kľúč. |
token_scope_invalid | Rozsah kľúča musí byť „všetky firmy“ alebo „vybrané firmy“. |
too_many_ids | Naraz možno spracovať najviac 500 dokladov. |
too_many_notification_emails | Zadajte najviac 5 e-mailových adries. |
too_many_schedules | Firma môže mať najviac päť pravidelných exportov. Ak chcete pridať ďalší, najprv niektorý zmažte. |
too_many_tags | Doklad má príliš veľa štítkov. |
too_many_tickets | Máte príliš veľa otvorených požiadaviek. Počkajte, prosím, na odpoveď. |
transfer_canceled | Prevod firmy bol zrušený. |
transfer_expired | Platnosť odkazu na prevod vypršala. Požiadajte o nový prevod. |
transfer_stale | Vlastníctvo firmy sa medzičasom zmenilo, prevod bol zrušený. |
unauthorized | Prihláste sa znova. |
unknown_document | Podpísať možno len dokumenty DPA, SLA a NDA. |
unsupported_document | Náhľad vie vykresliť len faktúru alebo dobropis (UBL Invoice alebo CreditNote). |
unsupported_media_type | Tento 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_failed | Niektoré polia nie sú vyplnené správne. |
validator_unavailable | Validácia je momentálne nedostupná. Skúste to o chvíľu. |
verification_code_rejected | SMP neprijalo verifikačný údaj z výberu na portáli Finančnej správy; zopakujte výber. |
verification_token_missing | Chý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_stale | Znenie dokumentu sa medzičasom zmenilo. Obnovte stránku a podpíšte aktuálne znenie. |
webhook_not_configured | Najprv nastavte a uložte webhook URL. |
webhook_url_https_required | Webhook URL musí v produkcii začínať https:// (doručenie nesie identifikátory zákazníka a podpis). |
webhook_url_unreachable | Webhook URL musí byť verejne dosiahnuteľná. Localhost a interné siete nie sú z našich serverov dostupné. |
white_label_owner_fixed | Firmu 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_endpoint | Toto nie je adresa na získanie tokenu. Použite POST /sapi/auth/token s client_id a client_secret. |
xml_not_available | Pre tento doklad nie je uložené pôvodné XML, obsah už nie je k dispozícii. |
xml_required | Chýba XML dokladu, náhľad sa nedá vykresliť. |
xml_too_large | Doklad 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/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." }- 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
/sapis tímtéž access tokenem a hlavičkouX-Peppol-Participant-Id. Odpověď 401 „Authentication required“ bez kódu SAPI-… znamená, že cesta je mimo/sapi(například /api/v1/document/sent);/api/v1je 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čtu | Limit |
|---|---|---|
/sapi/* a /api/mcp s tokenem | client_id za tokenem (rotace access tokenu rozpočet neresetuje) | 300 / min |
/api/v1/* s API klíčem nebo session | klíč (hash) nebo session | 300 / min |
POST /sapi/auth/token, renew, revoke | IP | 60 / min |
/api/v1/auth/* (přihlášení, reset) | IP | 20 / min |
Veřejné nástroje (/api/v1/public/peppol-check, validator) | IP | 15 / min |
Hromadné ověření (/public/peppol-check/batch) | IP | 6 / min |
Živé ověření v síti (peppol-check, /sapi/discovery, MCP check_participant) | IP nebo klíč; dohromady celý portál | 40 / 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ář | IP | 15 / hod |
Ochranný strop pro všechno s neověřeným bearerem | IP | 600 / min |
HTTP/2 200
RateLimit-Limit: 300
RateLimit-Remaining: 287
RateLimit-Reset: 41
RateLimit-Policy: 300;w=60API 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í.
/tokenssession / tokenSeznam vašich aktivních tokenů (bez secretu), createdAt sestupně.
/tokenssession / tokenVytvoří token; vrátí plaintext (jedinkrát).
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
name | string | ano | název tokenu, max 128 |
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":"…" }/tokens/{id}session / tokenZruší 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.
/companiessession / tokenSeznam firem, jejichž jste členem (s vaší rolí).
/companiessession / tokenPřidá firmu; stanete se owner, status = pending_verification.
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
ico | string | ano | přesně 8 číslic |
dic | string | ano | IČ DPH ve formátu SK + 10 číslic (např. SK2121358349); neplátce DPH pošle jen 10 číslic DIČ, SK doplníme |
legalName | string | ano | obchodní jméno, max 500 |
registeredAddress | string | ne | sídlo, max 1000 |
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)
/companies/{id}session / tokenDetail firmy (musíte být členem).
/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í
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.
/companies/{id}/verificationowner / adminSelf-verify Verifikačního údaje. Po úspěchu nastaví status na active.
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
token | string | ano | VÚ = hex podpis (prod/pPFS 1024 hex, test/tPFS 768 hex) |
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ě.
/companies/{id}/documentssession / tokenSeznam dokladů firmy. Volitelný filtr ?direction=sent|received.
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":"…" } ]/companies/{id}/documents/{docId}session / tokenDetail jednoho dokladu.
Chyby: document_not_found (404)
/companies/{id}/documents/{docId}/downloadsession / tokenSamostatné 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)
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-0001na test parsování a acknowledge
# 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>'client_id/client_secret z portálu (níže).Autentizace
/sapi/auth/tokenclient_credentialsVymě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 -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)
/sapi/auth/token/statusBearer (access)Platnost a expirace access tokenu; should_refresh = true při < 3 min do konce.
/sapi/auth/renewrefresh tokenVystaví nový access + refresh token. Selže, pokud byl podkladový API token zrušen.
// body
{ "refresh_token": "eyJhbGciOi…" }/sapi/auth/revokebez authVždy vrátí success (RFC 7009). Trvalý kill-switch = zrušení API tokenu v portálu.
Odeslání dokumentu
/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čka | Popis |
|---|---|
Authorization | Bearer <access_token> |
X-Peppol-Participant-Id | účastník, za kterého odesíláte (např. 0245:2121358349, číslice DIČ bez „SK“) |
Idempotency-Key | jeden 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 -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 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)
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.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 jakorejecteds 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-Idjen se schématem (například0245:, 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á dowarningsupozorně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 jehostatusReason(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á) aGET /sapi/discovery?receiverId=…(je příjemce v síti a jaké typy dokladů přijímá). Konečný stav zjistíte přesGET /sapi/document/sent?invoiceNumber=…,GET /sapi/document/sent/{id},POST /sapi/document/sent/statusnebo webhookyinvoice.delivered,invoice.rejectedainvoice.undeliverable.
/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 -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ů
/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á.
// 200 OK
{ "documents": [ { "documentId":"…","documentTypeId":"…",
"senderParticipantId":"0088:…","receiverParticipantId":"0245:…",
"creationDateTime":"2026-06-17T…Z" } ],
"nextPageToken": "50" }/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ý)
/sapi/document/receive/{documentId}/acknowledgeBearer (access)Potvrdí převzetí dokumentu vaším systémem. Idempotentní.
/sapi/document/receive/{documentId}/xmlBearer (access)Archivní odkaz (metadata.links.xml): samotný obchodní doklad jako XML soubor, stejný obsah jako payload v detailu.
/sapi/document/receive/{documentId}/htmlBearer (access)Archivní odkaz (metadata.links.html): generický tisknutelný náhled faktury (HTML).
/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).
/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í.
/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ší.
Stav odeslaných dokumentů
/sapi/discovery?receiverId=0245:2121358349Preflight 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á.
/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í).
// 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.
/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.
// 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í)
/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.
/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.
/sapi/document/sent/{documentId}/htmlBearer (access)Tisková podoba odeslaného dokladu vygenerovaná z uloženého XML (nic se neukládá).
/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).
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.
/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.
// 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)
/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)
/sapi/document/receive/{documentId}/eventsBearer (access)Časová osa přijatého dokladu: received, acknowledged, fs_reported, fs_c5_verdict, content_wiped, doručení webhooků.
Hromadné odeslání
/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.
// 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).
{ "error": {
"category": "AUTH",
"code": "SAPI-AUTH-001",
"message": "Invalid client credentials.",
"retryable": false,
"correlation_id": "b4191dfc-…" } }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á.
/companies/{id}/notificationssession / tokenNastavení notifikací: { webhookUrl, notificationEmail, notificationEmails, hasSecret }.
/companies/{id}/notificationsowner / adminNastaví oba kanály (prázdný řetězec = zruší daný kanál).
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
webhookUrl | string | ne | prázdné nebo http(s) URL, max 512 |
notificationEmail | string | ne | jedna 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) |
/companies/{id}/webhooksession / tokenKonfigurace webhooku: { url, hasSecret } (bez secretu).
/companies/{id}/webhookowner / adminNastaví URL webhooku (auto-vygeneruje podpisový secret, pokud ještě není).
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
url | string | ano | http(s) URL, max 512 |
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 }/companies/{id}/webhookowner / adminZruší webhook URL i secret. Vrátí 204.
/companies/{id}/webhook/secretowner / adminVygeneruje nový podpisový secret a vrátí ho JEDNOU; uložte si ho na ověřování X-Verteco-Signature.
// 200 OK
{ "secret": "vpt_8f2a…" }/companies/{id}/webhook/testowner / adminPoš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.
// 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 URLPayload 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:
{
"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:
{
"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:
{
"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.
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:
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://.
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:
# 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/admindané 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(areceiverId). - Při stovkách firem respektujte rate-limit na token (aktuální hodnotu vrací hlavička
RateLimit-Limit); dávkujte s backoffem na429(hlavičkaRetry-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
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
id | UUID | – | identifikátor firmy |
ico | string | – | IČO (8 číslic) |
dic | string|null | – | IČ DPH |
legalName | string | – | obchodní jméno |
registeredAddress | string|null | – | sídlo |
peppolParticipantId | string|null | – | účastník v Peppol (po registraci) |
status | string | – | pending_verification | active |
role | string | – | owner | admin | member | viewer (vaše role) |
createdAt | Instant | – | čas vytvoření |
Document
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
id | UUID | – | identifikátor dokladu |
direction | string | – | sent | received |
peppolMessageId | string|null | – | ID Peppol zprávy |
docTypeId | string|null | – | typ dokumentu (Peppol) |
senderId | string|null | – | odesílatel (scheme:id) |
receiverId | string|null | – | příjemce (scheme:id) |
invoiceNumber | string|null | – | číslo faktury |
issueDate | date|null | – | datum vystavení |
currency | string|null | – | měna (např. EUR) |
totalAmount | number|null | – | částka |
status | string | – | stav zpracování |
createdAt | Instant | – | čas záznamu |
User · Token · Webhook
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
User | objekt | – | { id: UUID, email: string } |
Token | objekt | – | { id, name, prefix, lastUsedAt|null, createdAt } |
Webhook | objekt | – | { 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, kdecbc:IDnese číslo daňového dokladu k přijaté platbě acbc:DocumentTypeCodeje130(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řescbc:PrepaidAmount. - Storno faktury: dobropis
381(CreditNote) scac:BillingReferencena 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:AdditionalItemPropertys ustálenými názvy jakoBatchNumber,SerialNumber,ExpirationDate.
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.
/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.
curl -X POST https://peppol.verteco.digital/api/v1/public/peppol-validate \
-H "Content-Type: application/xml" \
--data-binary @faktura.xml// 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)/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.
// 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.0send_document: odeslání faktury za firmu, vyžaduje confirm = true a platí brána Verifikačního údaje
Připojení v Claude Code
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)
{
"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:INV02nebo záporná částka = dobropis (381) s kladnými částkami a odkazem na původní fakturu (OriginalInvoiceNumber, u IFSOrderIdentifier); prodejce a odběratel podle slovenského IČ DPH (SellerOrganisationTaxCode,BuyerOrganisationTaxCode→0245:DIČ), odběratel mimo SR se nepřevádí; rozpis DPH zVatSpecificationDetails, řádky s 0 % jako kategorie E s důvodem zVatFreeText, 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
replyTovPUT /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.
Stav (ping)
Veřejný health-check endpoint, vhodný pro monitoring.
/pingveřejnéStav backendu.
// 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í.