Dokumentácia

Pre vývojárov: API referencia

REST API portálu a národné rozhranie SAPI-SK 1.0: autentifikácia, firmy, doklady, webhooky, chyby a limity.

Úvod

Verteco API je REST nad HTTPS. Request aj response sú JSON (UTF-8). Začnite vytvorením účtu, potom API tokenu, a urobte prvé volanie do minúty. Všetky cesty sú relatívne voči základnej URL nižšie.

Celé testovacie prostredie nájdete na test.peppol.verteco.digital. Správa sa rovnako ako produkcia, navyše má testovacie nástroje (FS webhook, verifikačný token, odstránenie firmy) a simulovaný výber poskytovateľa namiesto portálu Finančnej správy.

Base URL
https://peppol.verteco.digital/api/v1
Verzia
v1 (v ceste). Spätne nekompatibilné zmeny prídu pod novou verziou.
Protokol
HTTPS only · TLS 1.2+ · TLS A+
Formát
application/json (UTF-8)
Auth
cookie session (portál) alebo Bearer token (server-to-server)
Časy
ISO-8601 (UTC), napr. 2026-06-03T09:40:27Z

Certifikovaný AP

Reálny Peppol Access Point (Seat ID PSK001128), nie reseller. Prešli sme OpenPeppol conformance (19/19), v produkcii.

Validné doklady

Server-side validácia EN 16931 + Peppol BIS 3.0 Schematron pri každom prijatom AJ odosielanom doklade. Doklad si viete overiť aj vopred: verejný validátor beží na /validator (a ako API na POST /api/v1/public/peppol-validate); chyby vraciame s konkrétnym pravidlom (napr. BR-CO-15). Overené vzory pre slovenské situácie (neplatiteľ DPH, cudzia mena, prenesenie daňovej povinnosti, dobropis, zálohy, vložené PDF) sú na /vzory.

Multi-tenant

Jeden účet a jeden token pre N firiem, ideálne pre SaaS, ERP a účtovníkov.

SK TDD automaticky

Daňové hlásenie (corner-5 / TDD) na Finančnú správu generujeme a odosielame za vás.

Strojové rozhranie (OpenAPI 3.1): /api/v1/openapi.json. Importujte do Postman, otvorte v Swagger Editore, alebo si cez openapi-generator vygenerujte typovaného klienta v ľubovoľnom jazyku (TS, Java, PHP, Python…). Pokrýva portálové API aj SAPI-SK.

Rýchly štart

Ktoré rozhranie je pre vás

SAPI-SK 1.0 (/sapi)

Účtovný alebo fakturačný program, ERP, platforma pre viac firiem: národné rozhranie pre odosielanie, príjem, stavy, doručenky a hlásenia FS. Odporúčané pre každú integráciu, ktorá posiela alebo číta doklady.

OAuth2 client credentials: client_id = UUID API kľúča, client_secret = vpt_ kľúč, 15-min access token.

Portal API (/api/v1)

Správa firiem, webhookov, notifikácií, exportov a sťahovania súborov; partnerská konzola (/resellers/me). Dopĺňa SAPI, nenahrádza ho.

Authorization: Bearer vpt_… (API kľúč účtu).

MCP server (/api/mcp)

AI asistent (Claude Code, Cursor, Claude Desktop) má čítať doklady, overovať príjemcov a po výslovnom potvrdení odosielať.

Bearer vpt_… cez MCP klienta.

E-mail do schránky firmy

Bez programovania: XML faktúra ako príloha e-mailu na tajnú adresu firmy; validuje sa a odošle ako z portálu.

Adresa odosielateľa na zozname + SPF/DKIM.

Účet aj API token si vytvoríte v portáli (cez prehliadač). Integrácia potom beží výhradne cez API token. Registráciu, prihlásenie ani heslá vaša appka nerieši.

  1. 1

    Vytvorte si účet v portáli

    Zaregistrujte sa e-mailom a potvrďte ho odkazom z e-mailu.
  2. 2

    Vygenerujte API token

    V portáli API tokeny → Vytvoriť. Token vpt_… sa zobrazí iba raz. Uložte si ho bezpečne.
  3. 3

    Urobte prvé volanie

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

    Výber poskytovateľa na portáli Finančnej správy

    V ostrej prevádzke je výber Verteco na portáli FS (vpds.financnasprava.sk) potrebný aj pri čisto odosielacom použití: odomyká odosielanie (Verifikačný údaj) a firmu aktivuje. Príjem pritom môže ostať u poskytovateľa vášho účtovného programu: príjemcu má firma v sieti práve jedného, odosielateľov môže mať viac.

Rýchly štart cez curl (najprv v testovacom prostredí)

Šesť volaní od účtu po prvú doručenú faktúru. Všetko beží proti test.peppol.verteco.digital, kde je firma aktívna hneď po vytvorení a doklady idú do testovacej siete Peppol. Očakávané odpovede sú skrátené.

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

    Účet a API kľúč

    Zaregistrujte sa na test.peppol.verteco.digital/register (v teste bez potvrdzovacieho e-mailu) a na stránke API kľúče vytvorte kľúč. Zobrazí sa raz a používa sa celý: zoznam kľúčov ukazuje len jeho začiatok (vpt_xxxxxxxx…) a kľúč skopírovaný odtiaľ aj s bodkami API odmietne s chybou 400. Nižšie ako $KEY.

  2. 2

    Overte kľúč

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

    Vytvorte firmu

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

    SAPI access token

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

    Zvalidujte doklad bez odoslania

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

    Odošlite a sledujte stav

    shell
    curl -s -X POST $BASE/sapi/document/send -H "Authorization: Bearer $ACCESS" -H "X-Peppol-Participant-Id: 0245:2120000001" -H "Idempotency-Key: FA-2026-0001" -H "Content-Type: application/json" -d @send.json a potom curl -s "$BASE/sapi/document/sent?since=2026-10-01T00:00:00Z" -H "Authorization: Bearer $ACCESS" -H "X-Peppol-Participant-Id: 0245:2120000001"
    json
    HTTP/2 202
    { "providerDocumentId": "6a3f…", "status": "ACCEPTED", "peppolMessageId": "f1c7…", "receivedAt": "2026-10-03T12:00:01Z" }
    
    { "documents": [ { "documentId": "6a3f…", "status": "delivered", "sentAt": "2026-10-03T12:00:01Z",
      "deliveredAt": "2026-10-03T12:00:14Z", "hasMls": true, "fsReport": { "state": "reported" } } ] }
Prechod na produkciu: vymeňte $BASE za peppol.verteco.digital, vytvorte produkčný účet a kľúč a nechajte klienta vybrať poskytovateľa na portáli Finančnej správy (firma sa aktivuje sama, odosielanie odomkne verifikačný údaj).

Testovacie prostredie (sandbox)

Testovacie doklady sa po 60 dňoch automaticky mažú – prostredie je na skúšanie, nie na archiváciu. Ostrého portálu sa retencia netýka.

Okrem SAPI mock sandboxu (nižšie) prevádzkujeme aj plnohodnotné testovacie prostredie, kompletnú kópiu tohto portálu s oddelenými dátami, kde si celý tok (registrácia → firma → odoslanie → prijatie → notifikácie) vyskúšate end-to-end bez akéhokoľvek dopadu na ostrú prevádzku.

Registrácia
bez potvrdzovacieho e-mailu; účet je použiteľný okamžite
Schválenie firmy
automatické, priamo v rozhraní alebo cez API (bez výberu na portáli Finančnej správy, bez prihlásenia na portál FS); hneď po vytvorení firmy s IČ DPH môžete odosielať aj prijímať
Registrácia v sieti
automatická do testovacej siete Peppol. Pozor na dve vrstvy identifikátora: API a portál používajú rovnaký formát ako produkcia (peppolParticipantId = 0245:<číslice DIČ>, váš integračný kód sa nemení); do testovacieho SMP/SML sa firma technicky zapisuje ako 9950:SK<DIČ>, lebo schéma 0245 vyžaduje overovací kód Finančnej správy, ktorý v teste neexistuje. V produkcii sa registruje 0245:<číslice DIČ> do ostrej siete až po výbere poskytovateľa na portáli Finančnej správy (prihlásenie cez eID alebo prihlasovacími údajmi)
Validácia
reálna: EN 16931 + Peppol BIS 3.0 pravidlá, rovnaké ako v ostrej prevádzke
Doručenie
reálne cez testovaciu sieť Peppol (AS4, testovací certifikát, testovacie SML/SMP): príjemcovi registrovanému v testovacej sieti sa faktúra doručí ako prijatá (vrátane e-mailu, PDF a webhooku); do ostrej siete nič neodchádza
Doručenka
reálna MLS doručenka z testovacej siete
E-maily
reálne odchádzajú (na adresy, ktoré zadáte), s prefixom [TEST]
Simulácia chýb
hlavička X-Sandbox-Simulate: 503 (alebo 502, 500, 429) na ľubovoľnom volaní /sapi/document/* s platným tokenom vráti zodpovedajúcu chybu; nič sa nespracuje ani neuloží. Pri 500 (SAPI-PROC-500) a 429 (SAPI-SYS-003 s Retry-After) dostanete chybovú obálku SAPI; 503 a 502 prejdú cez okraj siete (DigitalOcean, Cloudflare) ako HTTP 504 s HTML telom bez obálky, presne tak vyzerá skutočný výpadok zvonku, takže si overíte aj spracovanie odpovede, ktorá nie je JSON. Chyby validácie vyvoláte nevalidným XML, 429 aj prekročením 300 volaní za minútu. V produkcii sa hlavička ignoruje
Cena
zadarmo, bez limitov na skúšanie

Funguje tam všetko čo tu: portál, REST API, SAPI-SK 1.0, e-shop pluginy aj webhooky. Stačí v integrácii vymeniť doménu za test.peppol.verteco.digital a použiť tokeny vytvorené v testovacom prostredí. Ideálne na vývoj integrácie, CI testy a zaškolenie účtovníkov pred ostrým nasadením. Skúšobné doklady patria len tam: v ostrej prevádzke sa každý domáci doklad medzi platiteľmi DPH hlási Finančnej správe a hlásenie sa nedá vziať späť. V ostrom portáli skúšajte iba tlačidlom „Poslať skúšobnú faktúru“ (0,00 €); od 1. 1. 2027 ostrá prevádzka čísla TEST-/VITAJTE- odmietne (test_document_in_production).

Pozn.: edge ochrana testovacej domény blokuje generické hlavičky User-Agent: Python-urllib a User-Agent: Java/1.8.x (predvolený User-Agent HttpsURLConnection v Jave 8) odpoveďou HTTP 403 „error code: 1010“ ešte pred naším API; ostrá doména peppol.verteco.digital ich prepúšťa. Stačí nastaviť vlastný User-Agent: v Jave buď parametrom JVM -Dhttp.agent=moja-app/1.0 (bez zmeny kódu; Java pripojí „Java/1.8“, výsledný „moja-app/1.0 Java/1.8.0_xxx“ ochrana prepúšťa, blokuje len hlavičku začínajúcu na „Java/1.8“), alebo na spojení conn.setRequestProperty("User-Agent", "moja-app/1.0"). Bežné klienty (requests, httpx, Java 11+, Apache HttpClient, okhttp, axios, Go, PHP, curl) fungujú bez zmeny.

Prečo sa firmy schvaľujú automaticky

Finančná správa nemá testovacie prostredie portálu VPDS: výber poskytovateľa na vpds.financnasprava.sk beží len v produkcii a overuje sa prihlásením na portál FS (eID alebo prihlasovacie údaje PFS), takže v ostrej prevádzke si nemôžete „vybrať" ľubovoľnú cudziu firmu. Aby ste napriek tomu vedeli integráciu otestovať, v testovacom prostredí tento krok simulujeme: každá firma, ktorú vytvoríte, sa schváli automaticky (bez výberu na FS), takže si viete založiť odosielateľa aj príjemcu a prejsť celý tok.

Na testovanie FS webhookov (výber poskytovateľa) máme vlastnú obdobu nástroja Finančnej správy: test.peppol.verteco.digital/sandbox-nastroje. Vygenerujete si tam platný verifikačný token (verifikačný údaj) v štýle FS a odošlete kompletný webhook na svoj endpoint, presne ako to robí portál FS pri reálnom výbere. Firmy vytvorené na testovanie viete zase odregistrovať (z portálu aj z testovacieho SMP), práve pre chýbajúci testovací režim na strane Finančnej správy.

Testovacie prostredie nie je súčasťou ostrej siete Peppol: firmy sa registrujú do oddelenej testovacej siete (testovacie SMP/SML), nič neodchádza na reálne endpointy a dáta v ňom môžu byť kedykoľvek premazané. Nepoužívajte ho na reálne faktúry; na tie je ostrá prevádzka na peppol.verteco.digital, kde registráciu do ostrej siete odomyká výber poskytovateľa na portáli Finančnej správy potvrdený prihlásením (eID alebo prihlasovacie údaje PFS).

Autentifikácia

Integrácia sa autentifikuje API tokenom v hlavičke Authorization: Bearer vpt_…. Token vytvoríte v portáli (API tokeny); má formát vpt_ + 40 hex znakov, ukladáme len jeho SHA-256 hash a má rovnaký prístup ako váš účet. Otestujte ho cez /auth/me:

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

Pri chýbajúcom alebo neplatnom tokene API vráti:

json
// 401 Unauthorized
{ "error": "unauthorized", "message": "Authentication required" }
Portál (prehliadač) používa internú session cookie (portal_session, JWT, 7 dní); pri server-to-server integrácii ju nepotrebujete. Verejné bez auth sú /ping, /openapi.json a endpointy pod /public/* (overenie peppol-check, validátor peppol-validate – detail v sekcii Verejné nástroje – a stav služby status); všetko ostatné vyžaduje session alebo Bearer token.

Konvencie & formáty

TypFormátPríklad
idUUID (string)08dd6c1e-…
časové značkyISO-8601 Instant (UTC)2026-06-03T09:40:27Z
issueDatedátum (YYYY-MM-DD)2026-06-03
totalAmountdesatinné číslo120.00
chýbajúce hodnotynull (nie vynechané pole)"dic": null

Stránkovanie & idempotencia

/companies a /companies/{id}/documents podporujú voliteľné ?page&limit (odpoveď zostáva JSON pole; celkový počet nájdete v hlavičkách X-Total-Count / X-Total-Pages). Bez parametrov vrátia celé pole, doklady zoradené createdAt zostupne; /tokens vracia vždy celé pole. Hlavičku Idempotency-Key podporuje národné rozhranie SAPI-SK na POST /sapi/document/send; pre programové odosielanie použite práve to.

Verzovanie a spätná kompatibilita

  • Kontrakt len rastie: nové polia (vynechané, keď sú null), nové voliteľné parametre, nové endpointy a udalosti. Existujúce názvy polí, hodnoty enumov a stavové kódy sa nemenia.
  • Nový enum alebo udalosť webhooku môže pribudnúť kedykoľvek; klient ignoruje, čo nepozná, a na neznámu udalosť odpovie 2xx.
  • Časové pečiatky sú ISO 8601 v UTC s premenlivým počtom desatinných miest; parsujte ich, neporovnávajte ako text. Sumy prichádzajú ako reťazce s dvoma desatinnými miestami.
  • Ak by zmena nemohla byť aditívna, oznámime ju v changelogu (odber e-mailom) najmenej 90 dní vopred a starý tvar ponecháme počas prechodného obdobia.
  • Bezpečnostný model API kľúča (od 3. 10. 2026): kľúč číta a odosiela doklady, spravuje firmy, notifikácie a webhooky. Správu účtu a kľúčov (vytvorenie, rozsah a zrušenie kľúča, MFA, heslo, relácie, pozvánky, prevod firmy, podpisy zmlúv) vykoná len prihlásená osoba; kľúč tam dostane 403 token_not_allowed. GET /api/v1/tokens ostáva kľúču dostupný.
  • Verzia kontraktu je v openapi.json (info.version) a každá zmena má riadok v changelogu s tagom API alebo Webhooky.

/changelog · /changelog/odber · openapi.json

Chyby

Slovník chýb na stiahnutie: ten istý slovník, ktorým portál prekladá detail odmietnutia do slovenčiny (identifikátory pravidiel EN 16931 a Peppol BIS, vzory sieťových chýb, kódy statusReason z GET /sapi/document/sent), je k dispozícii ako JSON na /docs/peppol-errors.json (sk, en, de, hu). Hodí sa na tabuľku bežných chýb v účtovnom programe: identifikátor pravidla hľadajte v detaile kdekoľvek, neznáme pravidlo zobrazte aj s jeho identifikátorom. Od 7. 10. 2026 má každá JSON odpoveď hlavičku Content-Type: application/json;charset=UTF-8.

Chyby majú jednotný tvar s machine-readable error kódom. Validačné chyby pridávajú mapu fields (prvá chyba na pole).

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

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

HTTP stavy

200 / 201 / 204
úspech (OK / vytvorené / bez obsahu)
400
neplatný vstup (pozri error / fields)
401
chýbajúca alebo neplatná autentifikácia
403
nedostatočné oprávnenie (rola)
404
zdroj neexistuje alebo naň nemáte prístup
405
nepodporovaná HTTP metóda pre danú cestu
409
konflikt (IČO / e-mail už existuje)
415
nepodporovaný Content-Type (XML endpointy očakávajú application/xml)
429
prekročený rate limit (hlavičky RateLimit-* a Retry-After, telo JSON rate_limited)
Naše API odpovedá vždy JSON-om s poľom error. Ak dostanete odpoveď bez JSON tela (HTML alebo text ako error code: 1010 so stavom 403, prípadne 502/504 pri nasadzovaní), neprišla z API, ale z infraštruktúry pred ním (edge ochrana, brána). Typická príčina 403/1010 je generický User-Agent knižnice (Python-urllib, Java/1.8.x na testovacej doméne), riešenie je v sekcii Testovacie prostredie.

Najčastejšie chybové kódy

KódHTTPKedy
validation_failed400telo nesplnilo validáciu (pozri fields)
unauthorized401chýba alebo neplatný API token
forbidden403akcia vyžaduje rolu owner/admin
company_not_found404firma neexistuje alebo nie ste jej členom
ico_taken409firma s týmto IČO už existuje
ico_immutable400IČO sa nedá zmeniť
company_dic_missing400overenie odosielania bez DIČ firmy
token_invalid400verifikačný údaj (podpis) nesedí
document_not_found404doklad neexistuje
token_not_found404API token neexistuje / nie je váš
rate_limited429priveľa requestov

Výpadok prístupového bodu a opakovanie

  • Ak API odpovie 502, 503 alebo 504, prípadne neodpovie vôbec, doklad sme neprevzali: zopakujte volanie neskôr s rovnakým Idempotency-Key, nič sa neodošle dvakrát.
  • Doklad, ktorý API prijalo (202 ACCEPTED, aj s retrying: true), odíde po obnove sám: prístupový bod doručenie opakuje a stav vidíte cez GET /sapi/document/sent alebo webhook; ak doručenie napokon vzdá, doklad skončí ako zlyhaný a rovnaký kľúč ho pošle znova.
  • Príjem na úrovni siete od portálu nezávisí: doručenie, ktoré počas výpadku portálu neprešlo, odosielajúci prístupový bod podľa pravidiel Peppol zopakuje a doklad sa v portáli objaví po obnove. Hlásenia Finančnej správe, ktoré pre výpadok neodišli, doplní automatický obnovovací beh (prenosové zlyhanie sa opakuje, obsahové odmietnutie nie).
  • Stav a históriu dostupnosti nájdete na /status; výpadok si v testovacom prostredí nasimulujete hlavičkou X-Sandbox-Simulate (sekcia Testovacie prostredie).

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

KódVýznam
SAPI-AUTH-001neplatné client_id/client_secret alebo zablokovaný účet (401)
SAPI-AUTH-002chýbajúca alebo neplatná hlavička Authorization: Bearer (401)
SAPI-AUTH-003kľúč nie je oprávnený pre daného účastníka, odosielanie nie je odomknuté alebo je pozastavené (403)
SAPI-AUTH-004IP adresa nie je na allowliste kľúča (403)
SAPI-VAL-001neplatné telo požiadavky (400)
SAPI-VAL-002chýba X-Peppol-Participant-Id (400)
SAPI-PROC-001dočasný stav: odoslanie s týmto kľúčom práve prebieha, zopakujte o chvíľu (502, retryable)
SAPI-PROC-002doklad odmietnutý pred odoslaním (422 s Prefer: handling=strict)
SAPI-PROC-003bez Idempotency-Key: pod týmto číslom už bol odoslaný iný doklad (409, details: documentId, status)
SAPI-RES-001doklad neexistuje alebo nepatrí účastníkovi (404)
SAPI-RES-002obsah dokladu už nie je uložený (retencia firmy) alebo nebol archivovaný (404, kód ostáva kvôli kompatibilite)
SAPI-RES-003 / 004príloha alebo doručenka MLS zatiaľ neexistuje (404)
SAPI-SYS-001 / 002dočasná chyba infraštruktúry alebo validátora (503/502, retryable)
SAPI-SYS-003prekročený rate limit (429, Retry-After)
SAPI-PROC-500neočakávaná chyba, correlation_id pošlite podpore (500)

Kompletný katalóg chýb portálového API (326)

Všetky kódy, ktoré backend vracia v poli error, s textom, ktorý zobrazuje portál. Zoznam sa generuje z toho istého slovníka, ktorý používa rozhranie, takže nemôže zastarať.

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

Rate limity

API je chránené rate limitingom v 60-sekundovom okne (per inštancia). Limit a zostatok vraciame v každej odpovedi cez hlavičky; pri prekročení vráti 429 Too Many Requests s Retry-After.

Bežné volania
dynamický limit s veľkou rezervou, na API token (alebo session, inak IP); aktuálnu hodnotu vracia hlavička RateLimit-Limit
Auth (/auth/*)
prísnejší limit na IP (anti brute-force; mimo /auth/me a /auth/logout)
RateLimit-Limit
limit v okne
RateLimit-Remaining
koľko ešte ostáva
RateLimit-Reset
sekúnd do resetu okna
Retry-After
sekúnd do ďalšieho pokusu (pri 429)
http
HTTP/2 429 Too Many Requests
RateLimit-Limit: <limit v okne>
RateLimit-Remaining: 0
RateLimit-Reset: 37
Retry-After: 37

{ "error": "rate_limited", "message": "Too many requests. Slow down." }
Praktické odpovede integrátorov:
  • Zľavy a zaokrúhľovanie: pravidlá R040 (suma zľavy = základ × % / 100) aj R120 (suma riadku = množstvo × cena − zľavy riadku) majú toleranciu 0,02 €; presné je iba R046 pre zľavu na úrovni ceny (PriceAmount = BaseAmount − Amount). Jednotková cena (BT-146) ani cenníková cena a zľava z ceny (BT-147, BT-148) nemajú obmedzený počet desatinných miest, všetky ostatné sumy majú 2. Ak váš systém uplatňuje zľavu na jednotkovú cenu a zaokrúhľuje ju, zapíšte ju na úrovni ceny: PriceAmount = zaokrúhlená cena po zľave, BaseAmount = cenníková cena, Amount = presný rozdiel, suma riadku = round(množstvo × PriceAmount, 2); percento tam uviesť nemožno (patrí do poznámky riadku). Druhá možnosť je riadková zľava len sumou s kódom 95; percento a základ v riadkovej zľave uvádzajte len vtedy, keď základ = round(množstvo × exportovaná PriceAmount, 2) a Amount = round(základ × % / 100, 2). Záporné množstvo s kladnou cenou (vrátený tovar, odpočet zdanenej zálohy) je dovolené aj v dobropise aj vo faktúre. Vzory 11, 15 a 16 na /vzory.
  • Limity sú viazané na prihlasovací údaj, nie na IP: 300 volaní za minútu na API token (SAPI: na access token), auth endpointy 20 za minútu na IP a ochranný strop 600 za minútu na IP pre /api/v1. Serverovej integrácii za jednou IP to neprekáža; vyššie limity nastavíme na požiadanie, napíšte očakávanú špičku.
  • Kapacita: objem nie je obmedzený cenníkom, odosielanie je asynchrónne (volanie doklad odovzdá a doručenie beží na pozadí) a dávkové volanie prijme až 100 dokladov naraz; pri plánovanej špičke nám vopred napíšte očakávaný objem a zdvihneme limit kľúča.
  • Polling je plnohodnotná cesta: GET /sapi/document/sent a /receive s ?since a ?until každých 1 až 5 minút; webhooky sú doplnok, nie podmienka.
  • Časové pečiatky (§ 76a ods. 2 písm. d): sentAt = odovzdanie doručovacej službe (tým je podľa § 85o ods. 11 splnená povinnosť vystaviteľa), deliveredAt = potvrdenie AP príjemcu doručenkou MLS, fsReportedAt = hlásenie FS; pri prijatých dokladoch creationDateTime = prijatie. Všetky tri sú v každom riadku /sapi/document/sent, v detaile /sapi/document/sent/{id} aj vo webhookoch (occurredAt navyše).
  • PDF: GET /sapi/document/receive/{id}/pdf a GET /sapi/document/sent/{id}/pdf (odkaz aj v links.pdf) vrátia PDF dodávateľa, ak ho doklad nesie, inak PDF vygenerované z XML; tlačiteľné HTML je na …/html (portál ?format=html).
  • C#/.NET a iné jazyky: klienta vygenerujte z OpenAPI (NSwag, Kiota, openapi-generator); vlastný NuGet balík nedodávame.
  • Rozsah kľúča: pri vytváraní API kľúča (stránka API kľúče) zvolíte, či má prístup ku všetkým firmám účtu (aj tým, ktoré pribudnú neskôr) alebo len k vybraným. Volanie s kľúčom na inú firmu vráti 403 token_company_not_allowed (SAPI-SK: SAPI-AUTH-003); rotácia kľúča rozsah zachová. Kľúč len na čítanie zatiaľ neexistuje.
  • Základná cesta: všetky volania SAPI-SK vrátane našich rozšírení (GET /sapi/document/sent, GET /sapi/document/receive/{id}/pdf, GET /sapi/discovery) idú pod /sapi s tým istým access tokenom a hlavičkou X-Peppol-Participant-Id. Odpoveď 401 „Authentication required“ bez kódu SAPI-… znamená, že cesta je mimo /sapi (napríklad /api/v1/document/sent); /api/v1 je portálové API a ako Bearer očakáva kľúč vpt_, nie SAPI access token.
  • Dátum vyhotovenia (BT-2) nekontrolujeme voči dňu odovzdania na doručenie: doklad odovzdáme do siete v momente prijatia, preto ho posielajte v deň vyhotovenia a neraďte ho do fronty cez polnoc. Doklad v cudzej mene nahlasujeme Finančnej správe so sumou dane v EUR z BT-110 a BT-111 (TaxCurrencyCode EUR), ako ukazuje vzor 03.
  • Dátum dodania: v XML ho nesie BT-72 (cac:Delivery/cbc:ActualDeliveryDate); doklad k prijatej platbe nesie v BT-72 dátum prijatia platby (vzor 12). Naše vlastné faktúry za službu aj doklady z portálu ho uvádzajú vždy, aj keď sa zhoduje s dátumom vyhotovenia (§ 74 ods. 1 písm. d) zákona o DPH ho vyžaduje len pri rozdiele). Pri čítaní berte BT-72, ak chýba tak BT-7 (cbc:TaxPointDate), inak dátum vyhotovenia.

Rozpočty rate limitu (aktuálne hodnoty)

Okno je 60 sekúnd. Každá odpoveď nesie RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset a RateLimit-Policy (limit;w=okno v sekundách), pri 429 aj Retry-After. Hodnoty sa môžu zvýšiť bez oznámenia; čítajte hlavičky, nie túto tabuľku.

VolaniaKľúč rozpočtuLimit
/sapi/* a /api/mcp s tokenomclient_id za tokenom (rotácia access tokenu rozpočet neresetuje)300 / min
/api/v1/* s API kľúčom alebo sessionkľúč (hash) alebo session300 / min
POST /sapi/auth/token, renew, revokeIP60 / min
/api/v1/auth/* (prihlásenie, reset)IP20 / min
Verejné nástroje (/api/v1/public/peppol-check, validator)IP15 / min
Hromadné overenie (/public/peppol-check/batch)IP6 / min
Živé overenie v sieti (peppol-check, /sapi/discovery, MCP check_participant)IP alebo kľúč; spolu celý portál40 / hod na volajúceho a 150 / hod spolu; nad limit odpovedá nočný prieskum (source: index), hromadné overenie nie je obmedzené
Registrácia, zabudnuté heslo, kontaktný formulárIP15 / hod
Ochranný strop pre všetko s neovereným beareromIP600 / min
http
HTTP/2 200
RateLimit-Limit: 300
RateLimit-Remaining: 287
RateLimit-Reset: 41
RateLimit-Policy: 300;w=60
Pri 429 na /sapi má telo okrem error a message aj code SAPI-SYS-003, retryable true a correlation_id. Platforma s viacerými klientmi za jednou IP: napíšte nám očakávanú špičku, rozpočet nastavíme individuálne.

API tokeny

Opaque tokeny vpt_… pre server-to-server prístup. Plaintext sa zobrazí iba raz pri vytvorení. Uložte si ho. Ukladáme len SHA-256 hash a 12-znakový prefix na zobrazenie.

GET/tokenssession / token

Zoznam vašich aktívnych tokenov (bez secretu), createdAt zostupne.

POST/tokenssession / token

Vytvorí token; vráti plaintext (jediný raz).

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

Zruší token. Vráti 204.

Chyby: token_not_found (404)

Firmy

Firmy (IČO / IČ DPH), ktoré spravujete. Prístup je viazaný na členstvo: vidíte len firmy, ktorých ste členom. Tvorca firmy sa stáva jej owner.

GET/companiessession / token

Zoznam firiem, ktorých ste členom (s vašou rolou).

POST/companiessession / token

Pridá firmu; stanete sa owner, status = pending_verification.

PoleTypPovinnéPopis
icostringánopresne 8 číslic
dicstringánoIČ DPH vo formáte SK + 10 číslic (napr. SK2121358349); neplatiteľ DPH pošle len 10 číslic DIČ, SK doplníme
legalNamestringánoobchodné meno, max 500
registeredAddressstringniesídlo, max 1000
curl
curl -X POST https://peppol.verteco.digital/api/v1/companies \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"ico":"53412834","dic":"SK2121358349","legalName":"Verteco digital services, s. r. o."}'

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

Chyby: ico_taken (409) · validation_failed (400)

GET/companies/{id}session / token

Detail firmy (musíte byť členom).

PUT/companies/{id}owner / admin

Úprava firmy. IČO je nemenné (musí sa rovnať existujúcemu).

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

Pole status

pending_verification
po vytvorení; odosielanie ešte nie je odomknuté
active
overená, odosielanie odomknuté

Rola člena

owner
tvorca firmy (plný prístup)
admin
správca (úpravy, webhooky, overenie)
member
člen (čítanie)
viewer
iba čítanie
Akcie „owner / admin" sú dostupné rolám owner aj admin (manažér firmy).

Overenie odosielania (Verifikačný údaj)

Pred odosielaním treba firmu overiť cez Verifikačný údaj (VÚ), podpísaný token od Finančnej správy. Po úspešnom overení sa status firmy zmení na active a odomkne sa odosielanie. V bežnom toku VÚ nikto neprepisuje: Finančná správa ho pošle na náš webhook v momente, keď si firma na portáli FS zvolí Verteco (alebo vášho sprostredkovateľa), a overenie prebehne automaticky. Tento endpoint je záložná cesta pre prípad, že VÚ máte z e-mailu FS a webhook nedorazil; neregistruje firmu do SMP.

POST/companies/{id}/verificationowner / admin

Self-verify Verifikačného údaja. Po úspechu nastaví status na active.

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

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

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

Dokumenty

Log Peppol dokladov (prijatých a odoslaných) za firmu. Napĺňa sa, ako cez Access Point tečú faktúry. Viazané na členstvo vo firme, zoradené createdAt zostupne.

GET/companies/{id}/documentssession / token

Zoznam dokladov firmy. Voliteľný filter ?direction=sent|received.

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

Detail jedného dokladu.

Chyby: document_not_found (404)

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

Samostatné HTML faktúry na tlač. ?inline=1 → zobrazí v prehliadači, inak stiahne.

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

SAPI-SK 1.0 (národné rozhranie)

SAPI-SK je štandardizované národné REST rozhranie medzi klientskym/ERP systémom a Access Pointom (sapi-sk.sk). Implementujeme ho v plnom rozsahu. Vďaka tomu nie ste viazaní na náš proprietárny tvar API a integráciu napíšete raz pre ktorýkoľvek SAPI-SK Access Point. Prehľad bez technických detailov je v článku SAPI-SK pre vývojárov.

Base URL
https://peppol.verteco.digital/sapi
Autentifikácia
OAuth2 client_credentials → krátkodobý access token (JWT)
client_id
UUID vášho API tokenu (zoznam v sekcii API tokeny / dashboard)
client_secret
samotný vpt_… token z portálu
Verzia
1.3 (10 operácií: 4× auth, 6× dokumenty)
SAPI access token je podpísaný samostatným kľúčom (nie je to portálový vpt_ token ani session). Zrušenie API tokenu v portáli okamžite zneplatní aj /auth/token aj /auth/renew.

Sandbox (skúšobné prostredie)

Chcete si SAPI-SK vyskúšať bez registrácie a bez rizika? Použite verejné sandbox prihlasovacie údaje. Sandbox validuje požiadavky presne ako ostrá prevádzka, ale nikdy nič neodošle na Peppol sieť a nepracuje s reálnymi dátami; vráti realistické mock odpovede. Ideálne na vývoj, CI a onboarding integrácie.

client_id
sandbox
client_secret
sandbox
send
plná validácia kontraktu + mock 202 (nič sa nedoručí)
receive
1 vzorový doklad sandbox-doc-0001 na test parsovania a acknowledge
curl
# 1) sandbox token (bez registrácie)
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 odoslanie: zvaliduje sa, ale NIČ sa reálne nedoručí
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer <sandbox access_token>' \
-H 'X-Peppol-Participant-Id: 0245:0000000000' \
-H 'Content-Type: application/json' \
-d '{ "metadata": { "documentId": "TEST-1",
        "documentTypeId": "urn:…::Invoice##…::2.1",
        "senderParticipantId": "0088:sandbox-sender",
        "receiverParticipantId": "0088:sandbox-receiver" },
      "payload": "<Invoice>…</Invoice>", "payloadFormat": "XML" }'
# 202 { "providerDocumentId": "sandbox-…", "status": "ACCEPTED", … }

# 3) vzorová schránka + detail vzorového dokladu
curl https://peppol.verteco.digital/sapi/document/receive \
-H 'Authorization: Bearer <sandbox access_token>'
curl https://peppol.verteco.digital/sapi/document/receive/sandbox-doc-0001 \
-H 'Authorization: Bearer <sandbox access_token>'
Sandbox tokeny sú izolované: nikdy nedoručia na Peppol a nevidia reálne doklady. Na ostré odosielanie použite client_id/client_secret z portálu (nižšie).

Autentifikácia

POST/sapi/auth/tokenclient_credentials

Vymení client_id + client_secret za access token (15 min) a refresh token (30 dní). Token si uložte a používajte ho celých 15 minút - nový token na každé volanie je zbytočná réžia (limit požiadaviek sa počíta aj na /auth/token).

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

Chyby: SAPI-AUTH-001 (401) · SAPI-AUTH-003 (401: IP mimo allowlistu kľúča) · SAPI-VAL-001 (400)

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

Platnosť a expirácia access tokenu; should_refresh = true pri < 3 min do konca.

POST/sapi/auth/renewrefresh token

Vystaví nový access + refresh token. Zlyhá, ak bol podkladový API token zrušený.

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

Vždy vráti success (RFC 7009). Trvalý kill-switch = zrušenie API tokenu v portáli.

Odoslanie dokumentu

POST/sapi/document/sendBearer (access)

Odošle Peppol biznis dokument (UBL / BIS 3.0) príjemcovi cez náš Access Point. Odosielanie je fail-closed: firma musí mať overený Verifikačný údaj. Odpoveď môže niesť aditívne pole warnings[] s rovnakými nezáväznými upozorneniami ako /document/validate (číslo TEST-, odberateľ z toho istého účtu, dátum vystavenia iný než deň odoslania); upozornenie doklad nikdy neblokuje.

Povinné hlavičky:

HlavičkaPopis
AuthorizationBearer <access_token>
X-Peppol-Participant-Idúčastník, za ktorého odosielate (napr. 0245:2121358349, číslice DIČ bez „SK“)
Idempotency-Keyjeden kľúč na jednu faktúru, odvodený z niečoho stáleho (napr. váš systém + ID alebo číslo faktúry); opakované volanie s ním vráti pôvodný výsledok a nikdy nedoručí dvakrát, nový kľúč pre tú istú faktúru túto ochranu obíde. Kľúč platí v rámci firmy (X-Peppol-Participant-Id). Výnimka: ak prvý pokus do siete neodišiel (chyba validácie, neúplná požiadavka, príjemca nepublikuje daný typ dokladu, prístupový bod vzdal opakovanie, transportná chyba so stavom failed) alebo skončil ako undeliverable, rovnaký kľúč odoslanie zopakuje, takže „oprav a pošli znova“ funguje aj pod rovnakým číslom faktúry; postup je v poznámke Oprava a opätovné odoslanie nižšie. Kľúč nikdy nevyprší: je uložený pri zázname dokladu, ktorý uchovávame natrvalo (retencia maže len obsah), takže opakovanie s rovnakým kľúčom vráti pôvodný výsledok aj po mesiacoch.
curl
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer eyJ…' \
-H 'X-Peppol-Participant-Id: 0245:2121358349' \
-H 'Idempotency-Key: 7b1f0e2a-…' \
-H 'Content-Type: application/json' \
-d '{ "metadata": {
        "documentId": "INV-2026-001",
        "documentTypeId": "urn:…::Invoice##…::2.1",
        "processId": "urn:…:bis:billing:3.0",
        "senderParticipantId": "0245:2121358349",
        "receiverParticipantId": "0088:7300010000001",
        "creationDateTime": "2026-06-17T10:00:00Z" },
      "payload": "<Invoice …>…</Invoice>",
      "payloadFormat": "XML" }'
# 202 Accepted
{ "providerDocumentId": "…", "status": "ACCEPTED",
"receivedAt": "2026-06-17T10:00:01Z", "timestamp": "…" }
# pri status "REJECTED" nesie odpoveď aj pole "detail"
# s dôvodom odmietnutia (validačné pravidlá, napr. BR-CO-15)
metadata vs. UBL: polia v metadata sú smerovacie a technické: documentId je váš interný identifikátor, nie číslo faktúry. Obchodné údaje (číslo faktúry cbc:ID, dátum vystavenia, splatnosť, dátum dodania, mena, suma) si preberáme priamo z UBL payloadu; nič z toho v metadata neposielate a UBL je vždy zdroj pravdy pre zobrazenie v portáli aj webhooky. documentTypeId: úplný identifikátor busdox-docid-qns; holý namespace alebo samotné CustomizationID normalizujeme na typ odvodený z payloadu, typ, ktorý payloadu odporuje, odmietneme chybou SAPI-VAL-001; schéma účastníka musí byť zo zoznamu 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: neopakovať, nahláste correlation_id)

HTTP kód vs. verdikt. Podľa národného kontraktu SAPI-SK odpovedá odoslanie vždy 202a verdikt nesie telo (status ACCEPTED alebo REJECTED). Ak chcete, aby verdikt niesol aj HTTP kód, pošlite hlavičku Prefer: handling=strict (RFC 7240): synchrónne odmietnutie sa vráti ako 422 so SAPI chybovou obálkou (SAPI-VAL-002 pri chybe validácie, SAPI-RES-003 keď príjemcovi nejde doručiť; details[] nesú providerDocumentId a detail) a odpoveď má Preference-Applied: handling=strict. Pri ACCEPTED sa nič nemení. Pred odovzdaním prístupovému bodu robíme rovnaký SML lookup ako on. Doklad najprv prejde validáciou: prevezmeme a nahlásime len platný doklad, nevalidný dostane REJECTED s validation_failed aj vtedy, keď príjemca v sieti nie je. Príjemca, ktorý v sieti Peppol vôbec nie je, znamená ACCEPTED s undeliverable: true: doklad sme prevzali a nahlásime ho Finančnej správe bez ohľadu na doručenie (§ 85o ods. 11, FS FAQ 9/DPH/2025/IM, časť II, príklad 9), nikomu sa však nedoručí; na GET /sapi/document/sent má status undeliverable, webhook dostane invoice.undeliverable, e-mail nikomu neposielame a rovnaký Idempotency-Key ide odoslať znova po oprave identifikátora príjemcu alebo po jeho registrácii (postup v poznámke Oprava a opätovné odoslanie nižšie). Príjemca, ktorý v sieti je, ale nepublikuje daný typ dokladu, dostane REJECTED okamžite, bez pokusu o doručenie. Pole retrying: true pri ACCEPTED znamená, že prvý pokus o doručenie zlyhal (napr. dočasne nedostupné SMP) a prístupový bod ho sám opakuje spravidla do 20 minút; detail nesie dôvod a konečný verdikt príde cez GET /sapi/document/sent alebo webhook.
Oprava a opätovné odoslanie. Každý pokus, ktorý API prijme na spracovanie (odpoveď 202, pri handling=strict aj 422), dostane vlastné providerDocumentId, aj odmietnutý.
  • REJECTED pri našej kontrole pred odoslaním (chyba validácie, neúplná požiadavka, príjemca nepublikuje daný typ dokladu, jeho SMP záznam pre typ nemá endpoint, prístupový bod vzdal opakovanie): do siete nič neodišlo, nič sa nedoručilo a nič sa nehlási Finančnej správe. Opravte údaje a pošlite doklad znova s rovnakým Idempotency-Key. Nový pokus dostane nové providerDocumentId; prvý záznam ostáva v zozname odoslaných ako rejected s dôvodom, len ako stopa neúspešného pokusu, a zmazať sa nedá. Faktúru vo vašom systéme viažte vždy na posledné providerDocumentId. Číslo faktúry môže ostať rovnaké, faktúra ešte nebola vyhotovená v zmysle zákona. Dátum vystavenia (BT-2) však musí byť deň, keď faktúra skutočne odíde: elektronická faktúra sa považuje za vyhotovenú dňom odovzdania doručovacej službe a odoslať ju treba najneskôr do 15 dní od dodania alebo prijatia platby (FS FAQ 9/DPH/2025/IM, časť I, príklad 74). Ak opravenú faktúru posielate v neskorší deň, dátum vystavenia zmeňte na tento deň.
  • Odovzdané sieti (ACCEPTED bez undeliverable: submitted, delivered alebo sa opakuje na pozadí; patrí sem aj doklad, ktorý po prenose odmietla doručenka MLS príjemcu a ktorý opakované volanie vráti ako REJECTED s dôvodom): rovnaký kľúč vráti výsledok tohto odoslania a nič sa neodošle dvakrát. Doručenú faktúru nikdy neposielajte znova; opravuje sa dobropisom (381) alebo ťarchopisom (383).
  • undeliverable (príjemca nemá adresu v sieti Peppol): faktúra bola odovzdaná, hlási sa Finančnej správe bez ohľadu na doručenie a povinnosť vystaviteľa je splnená (FS FAQ 9/DPH/2025/IM, časť I, príklady 42 a 75). Kľúč sa uvoľní. Ak bol chybný identifikátor príjemcu (napríklad IČO alebo DIČ s preklepom namiesto 0245:<10 číslic DIČ>, alebo je príjemca v sieti pod iným identifikátorom), opravte identifikátor a pošlite znova s rovnakým kľúčom; faktúru nechajte rovnakú (to isté číslo aj dátum), už bola odovzdaná. 8-miestne číslo je IČO a v sieti sa nikdy nenájde. Ak je identifikátor správny a príjemca len nie je registrovaný, pošlite mu tú istú faktúru inou cestou, najlepšie jej XML e-mailom (PDF len ako náhľad). Podľa FS FAQ (časť I, príklad 75) ide o opätovné zaslanie tej istej faktúry, nie o novú faktúru, preto nevystavujte novú faktúru s iným číslom. Keď sa príjemca zaregistruje, tú istú faktúru mu cez Peppol pošlete znova zopakovaním volania s rovnakým Idempotency-Key.
  • Nesprávny identifikátor odberateľa alebo prázdny vlastný: hlavička X-Peppol-Participant-Id len so schémou (napríklad 0245:, keď v nastavení programu chýba DIČ firmy) vráti pri odoslaní 403 SAPI-AUTH-003 s vysvetlením a /document/validate s takou hlavičkou pridá do warnings upozornenie ešte pred odoslaním. Odberateľ zadaný ako 0088 (GLN) alebo 0245 s 8 číslicami (IČO namiesto DIČ) sa v slovenskej sieti nenájde: doklad skončí ako undeliverable a jeho statusReason (detail v odpovedi na send) nesie návod, ktorý identifikátor použiť: 0245 a 10 číslic DIČ.
  • Predchádzajte chybám: pred odoslaním zavolajte POST /sapi/document/validate (rovnaké pravidlá ako pri odoslaní, nič neukladá ani neodosiela) a GET /sapi/discovery?receiverId=… (je príjemca v sieti a aké typy dokladov prijíma). Konečný stav zistíte cez GET /sapi/document/sent?invoiceNumber=…, GET /sapi/document/sent/{id}, POST /sapi/document/sent/status alebo webhooky invoice.delivered, invoice.rejected a invoice.undeliverable.
POST/sapi/document/validateBearer (access)

Overí dokument bez odoslania: rovnaké pravidlá EN 16931 + Peppol BIS 3.0, aké prístupový bod uplatňuje pred odoslaním. Nič sa neukladá ani neodosiela; funguje aj so sandbox tokenom. Telo = JSON pár { payload, payloadFormat } ako pri /document/send, alebo priamo XML (Content-Type: application/xml). Limit 10 MB. Odpoveď nesie aj pole warnings[] s nezáväznými upozorneniami (napríklad číslo TEST-, odberateľ, ktorý je inou firmou toho istého účtu, alebo dátum vystavenia BT-2 iný než deň odoslania); upozornenie doklad nikdy neblokuje.

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

Chyby: SAPI-AUTH-002 (401) · SAPI-VAL-001 (400: prázdne telo, neplatný JSON, payloadFormat iný než XML, > 10 MB) · SAPI-SYS-002 (502: validátor dočasne nedostupný, opakujte)

Príjem dokumentov

GET/sapi/document/receiveBearer (access)

Zoznam prijatých dokumentov (najstaršie prvé); metadáta nesú aj invoiceNumber, takže doklad identifikujete bez sťahovania payloadu. Query: ?pageToken, ?limit (max 200), ?status (filter: received = iba doklady, ktoré ste ešte nepotvrdili, acknowledged = iba potvrdené, bez parametra všetky prijaté doklady; bez ohľadu na veľkosť písmen, iná hodnota vráti chybu SAPI-VAL-001), ?invoiceNumber (presná zhoda s cbc:ID), ?since a ?until (ISO-8601 instant; okno podľa času prijatia – napr. doklady za posledných 5 dní, hromadné stiahnutie na externú archiváciu či rekonštrukciu účtovníctva), ?deliveryDateFrom a ?deliveryDateTo (ISO-8601 dátum; filter podľa dátumu dodania z dokladu). Hlavička X-Peppol-Participant-Id povinná.

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

Detail vrátane payloadu (raw XML, ako prišiel cez Peppol).

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

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

Potvrdí prevzatie dokumentu vaším systémom. Idempotentné.

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

Archívny odkaz (metadata.links.xml): samotný obchodný doklad ako XML súbor, rovnaký obsah ako payload v detaile.

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

Archívny odkaz (metadata.links.html): generický tlačiteľný náhľad faktúry (HTML).

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

Archívny odkaz (metadata.links.pdf): PDF dokladu. Ak dodávateľ vložil do XML vlastné PDF faktúry (BT-125), vraciame ten originál; inak PDF vygenerované z uloženého XML na požiadanie (PDF neukladáme). Hlavička X-Verteco-Pdf-Source: supplier | generated. 404 SAPI-RES-002 po výmaze obsahu, 503 pri výpadku renderera (skúste neskôr alebo použite /html).

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

Archívny odkaz (metadata.links.attachments[].url): bajty jednej prílohy vloženej v doklade, napr. PDF originál dodávateľa. Vynútené stiahnutie.

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

Odkaz bez prihlásenia (voliteľné): vydá NOVÝ náhodný kľúč k dokladu ({"rotate":true} nahradí existujúci). Vráti url (stránka), xmlUrl, htmlUrl, pdfUrl a expiresAt; kľúč sa zobrazí len raz. Firma musí mať zapnuté Sťahovanie faktúr bez autorizácie (403 SAPI-AUTH-004 inak). DELETE odkaz zruší.

Archív namiesto kópie: každý prijatý doklad nesie v metadátach pole links (xml, html, pdf, prílohy) a retention. Integrátor si k zaúčtovanému dokladu môže uložiť len odkaz a doklad stiahnuť až pri zobrazení; odkazy vyžadujú rovnaký Bearer token a hlavičku X-Peppol-Participant-Id. retention.mode = storage znamená, že firma má pre prijaté doklady zapnutý Archív dát a originál uchovávame počas celého trvania zmluvného vzťahu (VOP 11a.1). retention.mode = secure znamená, že firma prijaté doklady u nás nearchivuje: obsah sa nenávratne vymaže v retention.contentAvailableUntil, čo je plánovaný dátum výmazu uložený pri každom doklade (predvolene 14 dní od prijatia; lehota je zvlášť pre prijaté a odoslané doklady a každá zmena nastavenia sa pre existujúce doklady počíta odo dňa zmeny, nikdy skôr), a potom odkazy vracajú SAPI-RES-002; ak je contentAvailableUntil null pri mode secure, obsah zatiaľ držíme z povinnosti (nevykonané daňové hlásenie) a dátum výmazu nesľubujeme. Archív si vlastník firmy nastavuje na detaile firmy zvlášť pre prijaté a pre vystavené doklady. Odkazy bez autorizácie: ak firma na detaile firmy zapne „Sťahovanie faktúr bez autorizácie“, POST /sapi/document/receive/{id}/public-link vráti odkaz s vlastným náhodným kľúčom, ktorý otvorí doklad bez tokenu (url pre človeka, xmlUrl a htmlUrl pre programy). Kľúč je v odpovedi presne raz; odkaz platí najviac do contentAvailableUntil, dá sa zrušiť (DELETE) a po vypršaní vracia 410 s dôvodom, vtedy si vyžiadajte nový. Bez zapnutia v portáli odpovedá 403 SAPI-AUTH-004.
Odkazy bez prihlásenia: polia links.* vyžadujú Bearer vždy (sú to archívne odkazy). Keď má firma zapnuté „Sťahovanie faktúr bez autorizácie“ (detail firmy → Archív dát, alebo PUT /companies/{id}/public-links), detail dokladu nesie metadata.publicLink s hotovými adresami url, xmlUrl, htmlUrl a pdfUrl – rovnaká adresa pri každom čítaní a tá istá, ktorú vidí používateľ v portáli pri faktúre. Uložte si ju k zaúčtovanému dokladu; POST …/public-link potrebujete len na vynútenie nového kľúča. Pri vypnutej voľbe je publicLink.issued=false s reason=public_links_disabled. Odkaz je trvalý: platí, kým je obsah dokladu uložený (pri firme bez archivácie prijatých dokladov do retention.contentAvailableUntil), expiresAt je preto null (v SAPI odpovedi pole chýba); žiadne obnovovanie nie je potrebné. xmlUrl aj links.xml vracajú samotný doklad s koreňom Invoice/CreditNote bez transportnej SBDH obálky. pdfUrl aj links.pdf vracajú PDF, ktoré dodávateľ vložil do XML (BT-125), ak existuje, inak PDF vygenerované z XML; hlavička X-Verteco-Pdf-Source hovorí, ktoré (supplier | generated).

Stav odoslaných dokumentov

GET/sapi/discovery?receiverId=0245:2121358349

Preflight pred odoslaním: je príjemca registrovaný v sieti Peppol a aké typy dokladov vie prijať? Rovnaký SML lookup, aký robí Access Point; receiverId prijme Peppol ID, IČ DPH aj samotné DIČ. Odpoveď: {registered, participantId, smp, documentTypes, checkedAt}. Hlavička X-Peppol-Participant-Id tu nie je potrebná.

GET/sapi/document/sentBearer (access)

Stav doručenia odoslaných dokladov: pending (odovzdávame sieti) → submitted → delivered / rejected (potvrdené doručenkou MLS od AP príjemcu); failed = transportná chyba (retry s rovnakým Idempotency-Key pošle znova). Query: ?pageToken, ?limit, ?status (pending / submitted / sent / delivered / rejected / failed; bez ohľadu na veľkosť písmen, iná hodnota vráti chybu SAPI-VAL-001), ?invoiceNumber (presná zhoda s cbc:ID – stav konkrétnej faktúry jedným volaním), ?since a ?until (ISO-8601 instant; okno podľa času), ?deliveryDateFrom a ?deliveryDateTo (ISO-8601 dátum; filter podľa dátumu dodania).

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

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

Doručenka (MLS) a dôkazy doručenia

Doručenka MLS (Peppol Message Level Status) je odpoveď Access Pointu príjemcu na našu zásielku: AP = prijaté a doručené, AB = doručené bez obchodného potvrdenia, RE = odmietnuté s dôvodom. Portál ju uloží k odoslanému dokladu a podľa nej prepne stav: AP aj AB znamenajú delivered (pri AB začína statusDetail „MLS AB: “ a mls.responseCode je AB; podľa SPOG on MLS je to doručenie bez obchodného potvrdenia, nie výhrada), RE znamená rejected. Podľa § 76a ods. 2 písm. d zákona 222/2004 musí poskytovateľ vedieť preukázať dátum a čas odoslania, doručenia a prijatia; tie tri časy nesie každý riadok GET /sapi/document/sent aj webhook: sentAt (odovzdanie doručovacej službe, tým je podľa § 85o ods. 11 splnená povinnosť vystaviteľa), deliveredAt (potvrdenie AP príjemcu doručenkou) a fsReportedAt (hlásenie údajov FS). Zahraničný Access Point doručenku nemusí poslať nikdy: doklad ostane delivered s detailom as4_receipt_only a bez MLS.

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

Detail jedného odoslaného dokladu: rovnaký riadok ako v zozname (vrátane sentAt, deliveredAt, fsReportedAt, hasMls, links) plus mls.responseCode (AP/AB/RE), mls.receivedAt a mls.url. mls je null, kým doručenka nepríde.

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

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-RES-001 (404: cudzí alebo prijatý doklad) · SAPI-RES-004 (404: doručenka zatiaľ nie je)

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

Doručenka ako súbor: MLS ApplicationResponse od Access Pointu príjemcu, ktorý sa odkazuje na peppolMessageId zásielky. Dôkaz doručenia alebo odmietnutia; vynútené stiahnutie. SAPI-RES-004, kým doručenka neprišla.

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

Obsah odoslaného dokladu (SAPI 1.8.15): samotné UBL XML, ktoré sme odovzdali sieti (prenosová obálka odstránená), vynútené stiahnutie. Protipól odkazov na prijaté doklady: účtovný program externého účtovníka si takto načíta aj VYSTAVENÉ faktúry klienta (MK-soft: „Načítavať aj vystavené faktúry“). Odkazy sú v každom riadku ako links.xml, links.html a links.pdf. SAPI-RES-002 po výmaze obsahu podľa retencie firmy.

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

Tlačová podoba odoslaného dokladu vygenerovaná z uloženého XML (nič sa neukladá).

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

PDF odoslaného dokladu: vlastné PDF vystaviteľa vložené v XML (BT-125), ak ho doklad nesie, inak PDF vygenerované z XML; hlavička X-Verteco-Pdf-Source: supplier | generated. 503 SAPI-PROC-001, kým je generátor nedostupný (použite /html).

Sprostredkovatelia: rovnaké volania s hlavičkou X-Peppol-Participant-Id klienta dávajú doručenky všetkých spravovaných firiem jedným tokenom; v portáli je tá istá doručenka na detaile odoslanej faktúry (Stiahnuť doručenku) a v MCP nástroji get_document.

Dôkazy hlásenia FS, integrita a časová os (SAPI 1.8.14)

Od verzie 1.8.14 nesie každý riadok GET /sapi/document/sent aj detail a zoznam prijatých dokladov objekt fsReport: state = reported (hlásenie odovzdané zbernému bodu C5, reportedAt = fsReportedAt), pending (hlásenie je dlžné, odovzdanie zlyhalo a opakuje sa automaticky, reason = c5_unavailable) alebo not_required (hlásenie nevzniká; reason vysvetľuje prečo: 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 odovzdaní pribudne tddMessageId (SBDH InstanceIdentifier hlásenia) a po odpovedi C5 c5ResponseCode (AP/AB/RE), c5ResponseAt, c5Detail a zhrnutie outcome: accepted (AP), accepted_with_reservations (AB), rejected (RE) alebo null, kým C5 neodpovedalo. outcome = rejected znamená, že hlásenie sme odovzdali, ale Finančná správa ho odmietla (c5Detail nesie porušené pravidlo, napríklad BR-AE-08); state ostáva reported, lebo odovzdanie prebehlo, a portál opravené hlásenie odošle znova automaticky (po prijatí sa outcome zmení na accepted). Odoslané riadky majú navyše 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 odovzdaného XML, ostáva aj po výmaze obsahu), retention a receiptRetention = permanent (doručenka MLS sa nikdy nemaže). Doručenka v detaile má mls.sha256 a mls.messageId. Prijaté doklady dostali peppolMessageId, status (received/acknowledged), receivedAt, acknowledgedAt a xmlSha256 (SHA-256 bajtov obchodného dokladu presne tak, ako ich vydáva links.xml, bez prenosovej obálky SBDH; počíta sa pri prijatí a ostáva aj po výmaze obsahu). Oba zoznamy filtrujete cez ?fsReport=reported|pending|not_required|rejected (rejected = outcome rejected), odoslané aj cez ?status=undeliverable. Odpoveď POST /sapi/document/send nesie peppolMessageId už pri prevzatí. Všetko je doplnené ako nové polia, existujúce zostávajú nezmenené.

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

Stav až 200 odoslaných dokladov jedným volaním: rovnaké riadky ako v zozname plus mls, ak doručenka už prišla. Id, ktoré nie sú odoslanými dokladmi tejto firmy, sa vrátia v missing; volanie kvôli nim nezlyhá. Náhrada za N volaní GET /sapi/document/sent/{id} pri synchronizácii účtovného systému.

json
// POST { "documentIds": ["7c1e…", "9af0…", "neznáme"] }  (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áme"] }

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

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

Časová os dokladu zoradená podľa času: submitted, network_retrying, delivered / rejected / undeliverable / failed, mls_received, fs_reported, fs_c5_verdict, content_wiped, webhook_delivered a ďalšie (neznámy typ ignorujte). Fáza 1 je odvodená z uložených skutočností dokladu, nie záznam každej medzizmeny stavu.

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-RES-001 (404: cudzí alebo prijatý doklad)

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

Časová os prijatého dokladu: received, acknowledged, fs_reported, fs_c5_verdict, content_wiped, doručenia webhookov.

Webhooky: každá udalosť invoice.* nesie ten istý objekt fsReport; nové udalosti invoice.report_pending (odovzdanie hlásenia zlyhalo, ostáva dlžné a opakuje sa; raz za doklad) a invoice.report_rejected (C5 hlásenie odmietlo, c5Detail nesie dôvod). Nové udalosti prídu len integráciám, ktoré odoberajú všetky udalosti; na neznámy typ odpovedajte 2xx. Testovacie prostredie vracia fsReport not_required s reason tdd_disabled pri vzorovom doklade a prázdny documents pri batch volaní. Pri odmietnutí má fsReport.outcome hodnotu rejected a doklad nájdete cez ?fsReport=rejected. Self-billing (kód dokladu 389, faktúru vystavuje odberateľ): doklad doručíme, hlásenie Finančnej správe pri ňom zatiaľ negarantujeme, lebo hlásenie sa tvorí podľa dodávateľa uvedeného v doklade, nie podľa odosielateľa; fsReport môže ostať pending alebo rejected. Pred nasadením self-billingu nám napíšte.

Hromadné odoslanie

POST/sapi/document/batchBearer (access)

Až 100 dokumentov v jednom volaní. Každá položka prejde plnou logikou jednotlivého odoslania (idempotencia cez itemId + idempotencyKey, rezervácia, submit, verdikt) a vráti vlastný výsledok; chyba jednej položky nezastaví ostatné. Položky sa spracúvajú sekvenčne; failed položky opakujte s rovnakým idempotencyKey.

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

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

Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400: prázdny/príliš veľký zoznam)

Model chýb

Všetky SAPI chyby majú jednotnú obálku s kategóriou, stabilným kódom, príznakom retryable a correlation_id na podporu. Pri chybe prihlásenia (SAPI-AUTH-001) nesie obálka navyše hint (ľudsky čitateľné vysvetlenie, čo patrí do Client Id a Client Secret) a docs (odkaz na návod; pre programy MK-soft priamo na /navody/mksoft#prepojenie). Obe polia sú voliteľné a inde chýbajú (1.8.20).

json
{ "error": {
  "category": "AUTH",
  "code": "SAPI-AUTH-001",
  "message": "Invalid client credentials.",
  "retryable": false,
  "correlation_id": "b4191dfc-…" } }
Poznámka: pri odoslaní doručujeme biznis dokument; C2-strana daňového hlásenia (TDD) k odoslaným dokladom je v príprave. Daňové hlásenie pri príjme (C3) generujeme a podávame na Finančnú správu automaticky.

Notifikácie & webhooky

Pri prijatej faktúre vieme firmu upozorniť e-mailom alebo webhookom (POST na vašu URL). Doručenie je durable: ukladá sa do výstupnej fronty a doručuje asynchrónne (15 s timeout); pri zlyhaní opakujeme až 12× s exponenciálnym backoffom (30 s → max 8 h, spolu približne 16 hodín), potom dead-letter. Výpadok vášho servera teda notifikáciu nestratí, doručíme ju pri ďalšom pokuse. HTTP 401/403 znamená, že váš endpoint vyžaduje autentifikáciu, ktorú neposielame; overujte podpis webhook-signature a odpovedajte 2xx. SSRF ochrana blokuje loopback/lokálne adresy; webhook URL musí byť verejná.

GET/companies/{id}/notificationssession / token

Nastavenia notifikácií: { webhookUrl, notificationEmail, notificationEmails, hasSecret }.

PUT/companies/{id}/notificationsowner / admin

Nastaví oba kanály (prázdny reťazec = zruší daný kanál).

PoleTypPovinnéPopis
webhookUrlstringnieprázdne alebo http(s) URL, max 512
notificationEmailstringniejedna adresa alebo najviac 5 oddelených čiarkou, max 256; každá dostáva e-maily o prijatých faktúrach (400 invalid_notification_email / too_many_notification_emails)
GET/companies/{id}/webhooksession / token

Konfigurácia webhooku: { url, hasSecret } (bez secretu).

PUT/companies/{id}/webhookowner / admin

Nastaví URL webhooku (auto-vygeneruje podpisový secret, ak ešte nie je).

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

Zruší webhook URL aj secret. Vráti 204.

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

Vygeneruje nový podpisový secret a vráti ho JEDENKRÁT; uložte si ho na overovanie X-Verteco-Signature.

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

Pošle synchrónne testovaciu notifikáciu (event webhook.test, podpísanú, SSRF-chránenú) na uloženú URL a vráti, ČO poslala a ČO prišlo späť. To isté spustíte tlačidlom Otestovať webhook v detaile firmy.

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

Payload webhooku

Pri prijatej (invoice.received) aj odoslanej (invoice.sent) faktúre pošleme POST s týmto telom; pole event rozlišuje typ.

Ďalšie dve udalosti oznamujú verdikt siete o faktúre, ktorú ste odoslali: invoice.delivered (príjemcov Access Point potvrdil doručenie doručenkou MLS) a invoice.rejected (odmietnutá, či už sieťou, alebo pri validácii ešte pred odoslaním); invoice.undeliverable hlási príjemcu bez záznamu v sieti Peppol (prevzaté, nahlásené FS, nedoručené). Nesú identifikáciu dokladu a firmy (documentId, invoiceNumber, receiverId, peppolMessageId, companyDic, peppolParticipantId) plus status, statusDetail s dôvodom odmietnutia a statusDateTime. Ak prvý pokus o doručenie zlyhal a prístupový bod ho sám opakuje (spravidla do hodiny), doklad ostáva submitted a statusDetail začína predponou network_retrying: ; po doručení príde delivered, po vzdaní rejected s predponou network_gave_up: . Vďaka nim nemusíte stav odoslaných faktúr zisťovať polovaním.

Udalosť company.activated príde, keď zákazník dokončí výber poskytovateľa na portáli Finančnej správy (telo: event, companyId, companyDic, peppolParticipantId, status, verifiedAt); company.deactivated zase pri odregistrovaní firmy zo siete (rovnaké telo bez verifiedAt). company.smp_registered_elsewhere príde, keď firma dokončila výber na portáli FS, ale jej záznam v národnom SMP drží iný poskytovateľ (telo ako pri company.activated plus action: "migration_code_required" a migrateUrl). Postup pre partnerov je v dokumentácii pre sprostredkovateľov. Kým zákazník nevloží migračný kód, sieť doručuje starému poskytovateľovi. Detaily v návode /saas:

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

Polia companyDic a peppolParticipantId identifikujú firmu, ktorej sa udalosť týka (dôležité pre partnerov, ktorí majú jednu webhook URL pre všetkých svojich klientov).

Verdikt siete o odoslanej faktúre:

json
{
"event": "invoice.delivered",          // alebo "invoice.rejected"
"occurredAt": "2026-09-03T15:04:05Z",
"companyId": "08dd…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349",
"documentId": "…",
"invoiceNumber": "2026001",
"receiverId": "0245:2120049096",
"peppolMessageId": "…",
"status": "delivered",                 // alebo "rejected"
"statusDetail": null,                  // pri rejected: dôvod odmietnutia
"statusDateTime": "2026-06-03T10:15:42Z"
}

Aktivácia firmy po výbere na portáli Finančnej správy:

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

Názov udalosti nesie aj hlavička X-Verteco-Event. Úplný zoznam udalostí: 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ámy typ udalosti odporúčame odložiť bokom a zalogovať; nový typ vždy vopred ohlásime. Každá udalosť nesie aj occurredAt (čas vzniku udalosti, ISO-8601 UTC), podľa ktorého udalosti radíte, a eventId (rovnaká hodnota aj v hlavičke X-Verteco-Delivery-Id): jedinečný pre každú udalosť a nemenný pri jej opakovaní, preto je to správny kľúč na dedupliáciu (peppolMessageId sa opakuje naprieč invoice.sent, invoice.delivered a invoice.reported). Udalosti invoice.* nesú aj časy sentAt, deliveredAt, receivedAt a fsReportedAt (ISO-8601 UTC, null kým skutočnosť nenastala). invoice.reported príde, keď bolo hlásenie Finančnej správe (TDD) k dokladu odovzdané doručovacej službe (§ 85o ods. 11), a to aj s odstupom dní pri výpadku zberného bodu C5. Formálne schémy všetkých udalostí sú v sekcii webhooks špecifikácie OpenAPI.

Partnerský notifikačný webhook, správa klientov (release, pause-sending) a fakturačný model sú dostupné len zapísaným sprostredkovateľom a sú opísané v časti Pre sprostredkovateľov.

Overenie podpisu

Ak má firma secret, posielame hlavičku X-Verteco-Signature v tvare sha256=HMAC-SHA256(secret, raw telo) (lowercase hex). Vždy počítajte HMAC nad presnými bajtmi tela:

javascript
import crypto from 'node:crypto';

// rawBody = presné bajty tela requestu (nie znova 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čenia: X-Verteco-Event (názov udalosti), X-Verteco-Delivery-Id (= eventId v tele, rovnaké pri každom opakovaní), X-Verteco-Signature (HMAC vyššie) a paralelne hlavičky podľa štandardu Standard Webhooks: webhook-id (= eventId), webhook-timestamp (unix sekundy okamihu pokusu) a webhook-signature = v1,base64(HMAC-SHA256(secret, id + "." + timestamp + "." + telo)). Kľúčom sú bajty vášho secretu v UTF-8; knižnica standardwebhooks ho očakáva ako whsec_ + base64(secret). Odporúčaný postup: overte podpis, odmietnite doručenie s webhook-timestamp starším ako 5 minút (ochrana pred prehratím), spracúvajte idempotentne podľa eventId, odpovedzte 2xx do 15 sekúnd a ťažšie spracovanie odložte do vlastnej fronty. Neúspešné doručenie opakujeme 12× s odstupom 30 s až 8 h (spolu približne 16 hodín); potom skončí ako dead-letter s upozornením e-mailom a je viditeľné v Realtime logu. Produkčná webhook URL musí byť https://, v testovacom prostredí je dovolené aj http://.

Secret získate cez POST /companies/{id}/webhook/secret; vráti ho jedenkrát (rotácia vygeneruje nový). Bez secretu hlavičku X-Verteco-Signature neposielame.

Hromadné nastavenie: jeden token, viac firiem

Jeden API token (viazaný na váš účet/e-mail) spravuje všetky firmy, ktoré vlastní: kto firmu založí cez POST /companies, stáva sa jej ownerom a vie jej nastaviť webhook. Webhook je per firma (vlastná URL aj secret), takže rovnakým tokenom napojíte ľubovoľný počet firiem:

bash
# 1) zoznam vašich firiem (stránkovane, viď Firmy)
curl 'https://peppol.verteco.digital/api/v1/companies?page=0&limit=100' -H 'Authorization: Bearer vpt_8f2a…'

# 2) pre KAŽDÚ firmu {id}: nastavte webhook (a/alebo 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) vyzdvihnite podpisový secret (vráti sa LEN RAZ) a uložte si ho pre overovanie podpisu
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/webhook/secret -H 'Authorization: Bearer vpt_8f2a…'
# → { "secret": "…" }
  • Token musí byť owner/admin danej firmy; pri firme, kde je len member/viewer, vráti 403 forbidden (žiadny cross-tenant zásah).
  • Každej firme môžete dať inú URL alebo všetkým rovnakú; v payloade ich rozlíšite podľa companyId (a receiverId).
  • Pri stovkách firiem rešpektujte rate-limit na token (aktuálnu hodnotu vracia hlavička RateLimit-Limit); dávkujte s backoffom na 429 (hlavička Retry-After).
  • Webhook reálne chodí, až keď je firma aktívna v Peppole (po výbere Verteco ako poskytovateľa u Finančnej správy) a teda skutočne prijíma doklady.

Dátové modely

Polia objektov vracaných API.

Company

PoleTypPovinnéPopis
idUUID–identifikátor firmy
icostring–IČO (8 číslic)
dicstring|null–IČ DPH
legalNamestring–obchodné meno
registeredAddressstring|null–sídlo
peppolParticipantIdstring|null–účastník v Peppol (po registrácii)
statusstring–pending_verification | active
rolestring–owner | admin | member | viewer (vaša rola)
createdAtInstant–čas vytvorenia

Document

PoleTypPovinnéPopis
idUUID–identifikátor dokladu
directionstring–sent | received
peppolMessageIdstring|null–ID Peppol správy
docTypeIdstring|null–typ dokumentu (Peppol)
senderIdstring|null–odosielateľ (scheme:id)
receiverIdstring|null–príjemca (scheme:id)
invoiceNumberstring|null–číslo faktúry
issueDatedate|null–dátum vystavenia
currencystring|null–mena (napr. EUR)
totalAmountnumber|null–suma
statusstring–stav spracovania
createdAtInstant–čas záznamu

User · Token · Webhook

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

Polia sa načítavajú priamo z publikovaného openapi.json, takže tabuľky sú vždy totožné s tým, čo API vracia. Popisy sú v angličtine.

Načítavam dátové modely z openapi.json…

Slovník pojmov

DIČ
Daňové identifikačné číslo (10 číslic). Slovenský Peppol identifikátor je 0245: + číslice DIČ, bez SK.
IČ DPH
Identifikačné číslo pre DPH (SK + DIČ). Majú ho len platitelia DPH; neplatiteľ vystavuje s kategóriou O.
IČO
Identifikačné číslo organizácie (8 číslic). V API pole ico, v UBL BT-30.
Verifikačný údaj (VÚ)
Podpis Finančnej správy, ktorý vznikne výberom poskytovateľa na portáli FS; odomyká odosielanie za firmu.
VPDS
Výber poskytovateľa doručovacej služby, aplikácia Finančnej správy, kde si subjekt volí poštára (nás).
TDD
Tax Data Document, hlásenie údajov o faktúre Finančnej správe; zostavujeme a posielame ho za vás.
C5 / C6
Piaty a šiesty roh Peppol modelu: prístupový bod Finančnej správy, ktorý TDD prijíma (0242:001180).
MLS
Message Level Status, doručenka od prístupového bodu príjemcu (AP = prijaté, RE = odmietnuté, AB = potvrdené).
SBDH
Standard Business Document Header, obálka, v ktorej doklad cestuje sieťou; jej InstanceIdentifier je peppolMessageId.
SML / SMP
Adresár siete: SML nájde SMP príjemcu, SMP povie, aký prístupový bod a aké typy dokladov príjemca prijíma.

Slovenské konvencie z praxe implementátorov

Nad rámec Peppol BIS Billing 3.0 sa slovenskí výrobcovia ERP a fakturačných systémov priebežne zhodujú na spoločnej interpretácii voliteľných polí (diskusia prebieha v Slack kanáli Finančnej správy). Nižšie sú konvencie, ktoré náš portál už dnes rešpektuje – všetko sú platné BIS konštrukcie, cez naše API prechádzajú bez zmeny a prijaté doklady ich zobrazujú aj v ľudsky čitateľnom náhľade a PDF.

  • Odpočet zdanenej zálohy na riadku: záporný riadok s cac:DocumentReference, kde cbc:ID nesie číslo daňového dokladu k prijatej platbe a cbc:DocumentTypeCode je 130 (BIS: invoice line object identifier, max. 1 na riadok). Prijatá faktúra s takýmto riadkom sa v našom náhľade zobrazí s poznámkou „odpočet zálohy – daňový doklad č. …".
  • Daňový doklad k prijatej platbe: podľa FAQ Finančnej správy sa používa InvoiceTypeCode 388 (Tax invoice). Naším API aj validáciou prechádza; odpočet neuhradenej (nezdanenej) zálohy sa vyjadruje cez cbc:PrepaidAmount.
  • Storno faktúry: dobropis 381 (CreditNote) s cac:BillingReference na pôvodnú faktúru – nie záporná faktúra 380. Pozor: kód 384 sieť pre slovenské strany odmieta (pravidlo PEPPOL-EN16931-P0112 ho povoľuje len medzi nemeckými subjektmi); na opravu nahor slúži ťarchopis 383.
  • BT-83 PaymentID: v SK praxi sa presadzuje tvar referencie platiteľa /VS…/SS…/KS…; samotný variabilný symbol je tiež bežný. Naše spracovanie hodnotu prenáša bez zmeny a zobrazuje ju pri platobných údajoch.
  • Doplnkové údaje položiek (šarže, sériové čísla, expirácie) cez cac:AdditionalItemProperty s ustálenými názvami ako BatchNumber, SerialNumber, ExpirationDate.
Ide o konvencie komunity, nie záväzné národné pravidlá – prijímajúci systém musí zvládnuť aj doklad, ktorý ich nepoužíva. Ako sa diskusia u Finančnej správy uzavrie, túto sekciu priebežne aktualizujeme (sledujte /changelog).

Prílohy dokladov (BT-125)

K e-faktúre je možné pripojiť prílohy (PDF, obrázky) ako base64 v elemente cac:AdditionalDocumentReference (BT-125). Pri prijatých dokladoch spracujeme prílohy do 25 MB na prílohu; pri odosielaní musí celé XML vrátane base64 príloh zostať do 10 MB cez SAPI-SK a do 2 MB cez záložku Odoslať súborom v portáli. Peppol jednotný celosieťový limit neurčuje, jednotliví poskytovatelia si ho stanovujú sami (FS FAQ 9/DPH/2025/IM, príklad č. 67), takže pri veľmi veľkých prílohách si overte aj limit poskytovateľa druhej strany.

Verejné nástroje (validácia, overenie príjemcu)

Dva pomocné endpointy bez autentifikácie – rovnaké validačné jadro a rovnaký SML lookup, aké používa náš Access Point. Hodia sa do CI aj do predodoslacích kontrol; platí na ne prísnejší verejný rate limit.

POST/public/peppol-validateverejné

Validácia e-faktúry proti schéme UBL 2.1, EN 16931 a Peppol BIS Billing 3.0 – to isté, čo UI validátor na /validator. Telo požiadavky = priamo UBL 2.1 XML (Invoice / CreditNote, prípadne celý Peppol SBD), Content-Type application/xml, limit 3 MB.

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

Overenie príjemcu v produkčnej sieti Peppol (SML lookup): je registrovaný a aké typy dokladov vie prijať? Parameter id prijme Peppol ID (0245:…), IČ DPH (SK…) aj samotné DIČ. Autentifikovaná obdoba pre ERP pipeline: GET /sapi/discovery.

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

MCP server (AI asistenti)

Portál má vlastný server pre Model Context Protocol, otvorený štandard, cez ktorý sa AI asistenti (Claude Code, Claude Desktop, Cursor, VS Code Copilot a ďalší) pripájajú k externým systémom. Asistent sa prihlási bežným API kľúčom účtu a dostane šesť nástrojov; nikdy nevidí viac než ten účet a každé volanie je v API logu kľúča.

Adresa: https://peppol.verteco.digital/api/mcp. Transport: Streamable HTTP, JSON-RPC 2.0, bezstavovo (POST /api/mcp, žiadny SSE stream, GET vráti 405). Prihlásenie hlavičkou Authorization: Bearer <API kľúč>. Podporované metódy: initialize, ping, tools/list, tools/call, resources/list, prompts/list.

Nástroje

  • list_companies: firmy účtu s Peppol ID, stavom a rolou (začiatok každej konverzácie)
  • list_documents: odoslané/prijaté faktúry firmy s stavom doručenia a hlásenia FS, stránkované
  • get_document: detail faktúry vrátane doručenky MLS a hlásenia FS, voliteľne UBL XML (do 1 MB)
  • check_participant: živé overenie príjemcu v sieti Peppol (SML)
  • validate_document: validácia UBL proti EN 16931 + Peppol BIS 3.0
  • send_document: odoslanie faktúry za firmu, vyžaduje confirm = true a platí brána Verifikačného údaja

Pripojenie v Claude Code

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

Claude Desktop (cez most mcp-remote, potrebuje Node.js)

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

Odoslanie faktúry je právne záväzné: nástroj bez confirm = true odmietne volanie a asistent má v inštrukciách servera pokyn vyžiadať si výslovný súhlas používateľa s konkrétnou faktúrou a príjemcom. Hotové konfigurácie pre Cursor a VS Code a tlačidlo na vytvorenie kľúča nájdete v portáli: API kľúče → záložka MCP server. API kľúče → MCP server

Odosielanie e-mailom (adresa firmy)

Firma si v portáli zapne vlastnú adresu <24 náhodných znakov>@peppol.send.verteco.app. E-mail s prílohou UBL XML poslaný na túto adresu z povolenej schránky odošleme cez sieť Peppol rovnako, ako keby ste súbor nahrali na záložke Odoslať súborom; odosielateľ dostane jednu odpoveď s výsledkom za každú prílohu a doklad je v portáli aj v API so stavom doručenia, doručenkou MLS a hlásením FS. Nastavenie: Prepojenia a integrácie → Odosielanie e-mailom (vlastník alebo správca firmy, len po prihlásení). /dashboard/integrations/email

Pravidlá spracovania

  • Prijmeme len správu od adresy na zozname povolených odosielateľov firmy (najviac 20); ostatné zahodíme bez odpovede.
  • Predvolene musí doména odosielateľa prejsť overením SPF alebo DKIM u doručujúceho servera (zladenie ako pri DMARC, relaxed). Doručujúci server navyše odmieta správy, ktoré neprešli ani SPF, ani DKIM, a správy proti DMARC politike odosielateľa. Kontrolu možno vypnúť v nastavení, neodporúčame.
  • Príloha: UBL 2.1 Invoice alebo CreditNote (Peppol BIS Billing 3.0), prípona .xml, prípadne v obálke SBDH; najviac 10 príloh v správe, 15 MB na prílohu, 200 správ na adresu za deň. PDF a text správy sa nespracúvajú.
  • IFS Finvoice 2.0: prílohu .xml so SOAP obálkou IFS (IFSFinvoice) alebo samotný Finvoice prevedieme na UBL a ďalej spracujeme rovnako. Pravidlá prevodu: INV02 alebo záporná suma = dobropis (381) s kladnými sumami a odkazom na pôvodnú faktúru (OriginalInvoiceNumber, u IFS OrderIdentifier); predajca a odberateľ podľa slovenského IČ DPH (SellerOrganisationTaxCode, BuyerOrganisationTaxCode → 0245:DIČ), odberateľ mimo SR sa neprevádza; rozpis DPH z VatSpecificationDetails, riadky s 0 % ako kategória E s dôvodom z VatFreeText, inak „Oslobodené od DPH“; zaokrúhľovacie riadky IFS (základ 0,00, DPH 0,01) sa vynechajú, cena riadku, ktorá nesedí so sumou riadku, sa prepočíta; jednotky podľa UN/ECE (kg → KGM, pcs → H87, h → HUR, neznáme → C62 s pôvodným textom v poznámke riadku); vložený obraz faktúry (InvoiceAttachments, PDF) ide ako príloha dokladu do 5 MB; len EUR. Výsledok prevodu je v odpovedi aj v denníku firmy.
  • Adresa pre výsledky: ak faktúry posiela systémová schránka, v nastavení zvolíte inú adresu, na ktorú chodí odpoveď s výsledkom (pole replyTo v PUT /companies/{id}/email-send, prázdne = odpovedať odosielateľovi).
  • Predajca v XML (EndpointID dodávateľa, BT-34) musí byť táto firma, inak správu odmietneme (preposlaná faktúra od vášho dodávateľa sa nikdy neodošle ako vaša). Odberateľ musí mať EndpointID so schémou (BT-49).
  • Rovnaká správa (Message-ID) sa spracuje raz. Doklad má v API a webhookoch origin = email, aktér = adresa odosielateľa.
Adresa je kapacita: kto ju pozná a je na zozname povolených, odosiela za firmu. Preto ju možno kedykoľvek vymeniť (tlačidlo Vygenerovať novú adresu; stará prestáva platiť okamžite) a každé prijatie je v denníku firmy aj v bezpečnostnom zázname.

Stav (ping)

Verejný health-check endpoint, vhodný na monitoring.

GET/pingverejné

Stav backendu.

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

Živý prehľad všetkých komponentov nájdete na stránke stavu systémov.

Čo je hotové a čo pripravujeme

Už v produkcii (často mylne považované za chýbajúce)

  • POST /companies/{id}/documents/send je stabilné rozhranie portálu; pre ERP integrácie ostáva odporúčané SAPI-SK s Idempotency-Key.
  • Registrácia do SMP prebieha automaticky po výbere na portáli FS; prechod od iného poštára cez POST /companies/{id}/smp-migrate s migračným kódom.
  • Doručenky MLS, dôkazy doručenia a hlásenia FS (fsReport) v každom riadku /sapi/document/sent; replay webhookov za časové okno.
  • Kľúč obmedzený na vybrané firmy; MCP server pre AI asistentov; vzory UBL na /vzory; verejný validátor.

Pripravujeme (poradie podľa dopytu integrátorov)

  • Asynchrónny batch: POST /sapi/document/batch odpovie 202 s odkazom na job a stav po položkách.
  • Zmenový kanál GET /sapi/document/changes?since&cursor s kurzorom namiesto stránkovania offsetom.
  • Expirácia a rotácia API kľúčov v portáli, kľúč len na čítanie.
  • Viac webhook endpointov na firmu s filtrom udalostí.
Chýba vám niečo konkrétne? Napíšte na [email protected], čo a pre koľko dokladov; ovplyvní to poradie.