Začíname — pre podnikateľov
Nemusíte byť technik. Ak ste živnostník, s. r. o. alebo účtovník, stačí vám náš portál v prehliadači — faktúry prijímate aj vystavujete klikaním, bez programovania. Takto to funguje v troch krokoch:
- 1
Zaregistrujte sa (zadarmo)
Vytvorte si účet e-mailom v registrácii. Príjem faktúr je zadarmo (do 1000 mesačne).
- 2
Vyberte si nás na portáli Finančnej správy
Aby vám mohli chodiť e-faktúry, zvoľte si nás ako svojho certifikovaného poskytovateľa (digitálneho poštára) na portáli FS. My vás potom automaticky zaregistrujeme do siete Peppol a pošleme e-mail s prihlásením.
- 3
Prijímajte a vystavujte faktúry
Prijaté faktúry vám prídu do portálu aj e-mailom. Faktúru vystavíte v jednoduchom editore (ako vo Worde) — alebo si existujúcu faktúru duplikujete na pár klikov. Daňové hlásenie na Finančnú správu (TDD) odošleme za vás automaticky.
Podrobné návody (po slovensky, pre začiatočníkov):
E-faktúra 2027
Čo sa mení, koho sa to týka, odkedy.
Čo je Peppol
Sieť, poštári, ako to celé funguje.
Ako si vybrať poštára
Na čo si dať pozor pri výbere poskytovateľa.
Najčastejšie chyby
Čomu sa vyhnúť pri e-fakturácii.
Všetky návody na jednom mieste: Sprievodca e-fakturáciou.
Pre vývojárov
Technická dokumentácia — API
Nasledujúca časť je pre vývojárov, ktorí chcú napojiť vlastný systém (ERP, účtovný softvér, fakturačnú appku) cez REST API. Ak ste podnikateľ a stačí vám portál, túto časť nepotrebujete.
Ú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.
- 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 doklade; validáciu pred odoslaním dopĺňame.
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.
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
Úč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
Vytvorte si účet v portáli
Zaregistrujte sa e-mailom a potvrďte ho odkazom z e-mailu. - 2
Vygenerujte API token
V portáli API tokeny → Vytvoriť. Tokenvpt_…sa zobrazí iba raz — uložte si ho bezpečne. - 3
Urobte prvé volanie
Token použite v hlavičkeAuthorization:javascriptconst res = await fetch('https://peppol.verteco.digital/api/v1/companies', { headers: { Authorization: 'Bearer vpt_8f2a…' }, }); const companies = await res.json();
Návod pre SaaS / platformy
Ak prevádzkujete fakturačnú appku, ERP alebo platformu a chcete cez nás napojiť na Peppol viacero svojich zákazníkov (tenantov), integrujete sa raz a obsluhujete N firiem. Model je proxy: váš backend drží jeden API token (vpt_…) len na serveri (nikdy nie v prehliadači) a každý váš tenant = jedna firma u nás (jeden token → N firiem).
- 1
Jeden token, server-side
Vytvorte si API token a držte ho v zabezpečenom prostredí backendu. Všetky volania robí váš server (Bearer), nie prehliadač zákazníka. - 2
Onboarding tenanta = založenie firmy
Pre každého zákazníkaPOST /companiess jeho IČO/IČ DPH; vráti{ id, status: "pending_verification" }—idsi uložte k tenantovi (detail viď Firmy).bashcurl -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":"Firma s.r.o.", "street":"Príkladná 12","postalCode":"010 01","city":"Žilina","iban":"SK…"}' - 3
Aktivácia v Peppole (krok zákazníka u štátu)
pending_verification ≠ živé v Peppole. Aby firma prijímala, musí si zákazník na portáli Finančnej správy (cez eID) zvoliť Verteco ako poskytovateľa — vtedy ju zaregistrujeme do SMP a stav sa zmení na active. Aby firma mohla odosielať, doložte jej Verifikačný údaj cez Overenie odosielania (POST /companies/{id}/verification). - 4
Príjem faktúr — webhook per tenant
Nastavte webhook (a/alebo e-mail) pre každú firmu a vyzdvihnite podpisový secret:Pri prijatej faktúre vám príde podpísanýbashcurl -X PUT https://peppol.verteco.digital/api/v1/companies/{id}/notifications -H 'Authorization: Bearer vpt_8f2a…' \ -H 'Content-Type: application/json' \ -d '{"webhookUrl":"https://vasa-saas.sk/peppol/webhook","notificationEmail":"…"}' curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/webhook/secret -H 'Authorization: Bearer vpt_8f2a…' # → { "secret": "…" } (uložte na overovanie X-Verteco-Signature)POST(eventinvoice.received), durable s retry/dead-letter. Overenie podpisu, payload aj tlačidlo „Otestovať webhook" viď Notifikácie & webhooky. - 5
Odoslanie faktúr
Faktúru (UBL Peppol BIS 3.0) odošlite cez národné rozhranie SAPI-SK 1.0 —POST /sapi/document/send(OAuth2 client_credentials,client_secret= vášvpt_token). SK daňové hlásenie (TDD/C5) doplníme automaticky. - 6
Škálovanie a robustnosť
Zoznamy stránkujte:GET /companies?page&limitajGET /companies/{id}/documents?page&limit(s hlavičkamiX-Total-Counta i.). Rešpektujte rate-limit 120/min na token — pri hromadnom onboardingu dávkujte s backoffom na 429 (Retry-After) a ošetrite409 ico_taken(idempotentne).
POST /companies/{id}/verification; sending-verified = firma odosiela (po doložení Verifikačného údaja cez API). Webhook o prijatej faktúre chodí, až keď je firma active.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 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:
// 401 Unauthorized
{ "error": "unauthorized", "message": "Authentication required" }portal_session, JWT, 7 dní) — pri server-to-server integrácii ju nepotrebujete. Verejné bez auth sú len /ping, /openapi.json a /public/peppol-check.Konvencie & formáty
| Typ | Formát | Príklad |
|---|---|---|
id | UUID (string) | 08dd6c1e-… |
časové značky | ISO-8601 Instant (UTC) | 2026-06-03T09:40:27Z |
issueDate | dátum (YYYY-MM-DD) | 2026-06-03 |
totalAmount | desatinné číslo | 120.00 |
chýbajúce hodnoty | null (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.Chyby
Chyby majú jednotný tvar s machine-readable error kódom. Validačné chyby pridávajú mapu fields (prvá chyba na pole).
// business chyba
{ "error": "invalid_credentials", "message": "Invalid email or password" }
// validačná chyba (400)
{ "error": "validation_failed", "message": "Some fields are invalid",
"fields": { "ico": "IČO musí byť 8 číslic" } }HTTP stavy
- 200 / 201 / 204
- ú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
- 409
- konflikt (IČO / e-mail už existuje)
- 429
- prekročený rate limit
Kompletný katalóg chýb
| Kód | HTTP | Kedy |
|---|---|---|
validation_failed | 400 | telo nesplnilo validáciu (pozri fields) |
unauthorized | 401 | chýba alebo neplatný API token |
forbidden | 403 | akcia vyžaduje rolu owner/admin |
company_not_found | 404 | firma neexistuje alebo nie ste jej členom |
ico_taken | 409 | firma s týmto IČO už existuje |
ico_immutable | 400 | IČO sa nedá zmeniť |
company_dic_missing | 400 | overenie odosielania bez DIČ firmy |
token_invalid | 400 | verifikačný údaj (podpis) nesedí |
document_not_found | 404 | doklad neexistuje |
token_not_found | 404 | API token neexistuje / nie je váš |
rate_limited | 429 | priveľa requestov |
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
- 120 / min na API token (alebo session, inak IP)
- Auth (/auth/*)
- 20 / min 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/2 429 Too Many Requests
RateLimit-Limit: 120
RateLimit-Remaining: 0
RateLimit-Reset: 37
Retry-After: 37
{ "error": "rate_limited", "message": "Too many requests — slow down" }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.
/tokenssession / tokenZoznam vašich aktívnych tokenov (bez secretu), createdAt zostupne.
/tokenssession / tokenVytvorí token; vráti plaintext (jediný raz).
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
name | string | áno | názov tokenu, max 128 |
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":"…" }/tokens/{id}session / tokenZruší 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.
/companiessession / tokenZoznam firiem, ktorých ste členom (s vašou rolou).
/companiessession / tokenPridá firmu; stanete sa owner, status = pending_verification.
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
ico | string | áno | presne 8 číslic |
dic | string | áno | formát SK + 10 číslic (napr. SK2121358349) |
legalName | string | áno | obchodné meno, max 500 |
registeredAddress | string | nie | sídlo, max 1000 |
curl -X POST https://peppol.verteco.digital/api/v1/companies \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"ico":"53412834","dic":"SK2121358349","legalName":"Verteco digital services, s. r. o."}'
# 201 Created
{ "id":"08dd…","ico":"53412834","dic":"SK2121358349","legalName":"…",
"registeredAddress":null,"peppolParticipantId":null,
"status":"pending_verification","role":"owner","createdAt":"2026-06-03T09:40:27Z" }Chyby: ico_taken (409) · validation_failed (400)
/companies/{id}session / tokenDetail firmy (musíte byť členom).
/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
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.
/companies/{id}/verificationowner / adminSelf-verify Verifikačného údaja. Po úspechu nastaví status na active.
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
token | string | áno | VÚ = hex podpis (prod/pPFS 1024 hex, test/tPFS 768 hex) |
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/verification \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"token":"<1024-hex VÚ>"}'
# 200 OK
{ "companyId":"08dd…","status":"active","sendingVerified":true,
"verificationMethod":"self","verifiedAt":"2026-06-15T…Z" }Chyby: company_dic_missing (400) · token_invalid (400) · forbidden (403)
Dokumenty
Log Peppol 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.
/companies/{id}/documentssession / tokenZoznam dokladov firmy. Voliteľný filter ?direction=sent|received.
curl 'https://peppol.verteco.digital/api/v1/companies/{id}/documents?direction=received' \
-H 'Authorization: Bearer vpt_8f2a…'
# 200 OK
[ { "id":"…","direction":"received","peppolMessageId":"…","docTypeId":"…",
"senderId":"0088:7300010000001","receiverId":"0245:2121358349",
"invoiceNumber":"2026001","issueDate":"2026-06-03",
"currency":"EUR","totalAmount":120.00,"status":"received","createdAt":"…" } ]/companies/{id}/documents/{docId}session / tokenDetail jedného dokladu.
Chyby: document_not_found (404)
/companies/{id}/documents/{docId}/downloadsession / tokenSamostatné 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.
- 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)
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-0001na test parsovania a acknowledge
# 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": "SUBMITTED", … }
# 3) vzorová schránka + detail vzorového dokladu
curl https://peppol.verteco.digital/sapi/document/receive \
-H 'Authorization: Bearer <sandbox access_token>'
curl https://peppol.verteco.digital/sapi/document/receive/sandbox-doc-0001 \
-H 'Authorization: Bearer <sandbox access_token>'client_id/client_secret z portálu (nižšie).Autentifikácia
/sapi/auth/tokenclient_credentialsVymení client_id + client_secret za access token (15 min) a refresh token (30 dní).
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-VAL-001 (400)
/sapi/auth/token/statusBearer (access)Platnosť a expirácia access tokenu; should_refresh = true pri < 3 min do konca.
/sapi/auth/renewrefresh tokenVystaví nový access + refresh token. Zlyhá, ak bol podkladový API token zrušený.
// body
{ "refresh_token": "eyJhbGciOi…" }/sapi/auth/revoke—Vždy vráti success (RFC 7009). Trvalý kill-switch = zrušenie API tokenu v portáli.
Odoslanie dokumentu
/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.
Povinné hlavičky:
| Hlavička | Popis |
|---|---|
Authorization | Bearer <access_token> |
X-Peppol-Participant-Id | účastník, za ktorého odosielate (napr. 0245:2121358349 — číslice DIČ bez „SK“) |
Idempotency-Key | jedinečný kľúč; opakované volanie vráti pôvodný výsledok |
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": "…" }Chyby: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400) · SAPI-PROC-001 (502)
Príjem dokumentov
/sapi/document/receiveBearer (access)Zoznam prijatých dokumentov (najstaršie prvé). Query: ?pageToken, ?limit (max 200), ?status, ?since (ISO-8601 — len doklady po danom čase; inkrementálne sťahovanie / rekonštrukcia účtovníctva). Hlavička X-Peppol-Participant-Id povinná.
// 200 OK
{ "documents": [ { "documentId":"…","documentTypeId":"…",
"senderParticipantId":"0088:…","receiverParticipantId":"0245:…",
"creationDateTime":"2026-06-17T…Z" } ],
"nextPageToken": "50" }/sapi/document/receive/{documentId}Bearer (access)Detail vrátane payloadu (raw XML, ako prišiel cez Peppol).
Chyby: SAPI-RES-001 (404) · SAPI-RES-002 (404 — payload nearchivovaný)
/sapi/document/receive/{documentId}/acknowledgeBearer (access)Potvrdí prevzatie dokumentu vaším systémom. Idempotentné.
Stav odoslaných dokumentov
/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, ?since (ISO-8601).
// 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)
Hromadné odoslanie
/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.
// 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.
{ "error": {
"category": "AUTH",
"code": "SAPI-AUTH-001",
"message": "Invalid client credentials.",
"retryable": false,
"correlation_id": "b4191dfc-…" } }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ž 8× s exponenciálnym backoffom (30 s → max 1 h), potom dead-letter. Výpadok vášho servera teda notifikáciu nestratí, doručíme ju pri ďalšom pokuse. SSRF ochrana blokuje loopback/lokálne adresy — webhook URL musí byť verejná.
/companies/{id}/notificationssession / tokenNastavenia notifikácií: { webhookUrl, notificationEmail, hasSecret }.
/companies/{id}/notificationsowner / adminNastaví oba kanály (prázdny reťazec = zruší daný kanál).
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
webhookUrl | string | nie | prázdne alebo http(s) URL, max 512 |
notificationEmail | string | nie | platný e-mail, max 256 |
/companies/{id}/webhooksession / tokenKonfigurácia webhooku: { url, hasSecret } (bez secretu).
/companies/{id}/webhookowner / adminNastaví URL webhooku (auto-vygeneruje podpisový secret, ak ešte nie je).
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
url | string | áno | http(s) URL, max 512 |
curl -X PUT https://peppol.verteco.digital/api/v1/companies/{id}/webhook \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"url":"https://vas-system.sk/peppol/webhook"}'
# 200 OK { "url":"https://vas-system.sk/peppol/webhook", "hasSecret": true }/companies/{id}/webhookowner / adminZruší webhook URL aj secret. Vráti 204.
/companies/{id}/webhook/secretowner / adminVygeneruje nový podpisový secret a vráti ho JEDENKRÁT — uložte si ho na overovanie X-Verteco-Signature.
// 200 OK
{ "secret": "vpt_8f2a…" }/companies/{id}/webhook/testowner / adminPoš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.
// 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 URLPayload webhooku
Pri prijatej (invoice.received) aj odoslanej (invoice.sent) faktúre pošleme POST s týmto telom — pole event rozlišuje typ:
{
"event": "invoice.received",
"companyId": "08dd…",
"documentId": "…",
"invoiceNumber": "2026001",
"senderId": "0088:7300010000001",
"receiverId": "0245:2121358349",
"issueDate": "2026-06-03",
"currency": "EUR",
"totalAmount": "120.00",
"peppolMessageId": "…"
}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:
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));
}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:
# 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/admindanej firmy; pri firme, kde je len member/viewer, vráti403 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(areceiverId). - Pri stovkách firiem rešpektujte rate-limit 120/min na token — dávkujte s backoffom na
429(hlavičkaRetry-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
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
id | UUID | — | identifikátor firmy |
ico | string | — | IČO (8 číslic) |
dic | string|null | — | IČ DPH |
legalName | string | — | obchodné meno |
registeredAddress | string|null | — | sídlo |
peppolParticipantId | string|null | — | účastník v Peppol (po registrácii) |
status | string | — | pending_verification | active |
role | string | — | owner | admin | member | viewer (vaša rola) |
createdAt | Instant | — | čas vytvorenia |
Document
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
id | UUID | — | identifikátor dokladu |
direction | string | — | sent | received |
peppolMessageId | string|null | — | ID Peppol správy |
docTypeId | string|null | — | typ dokumentu (Peppol) |
senderId | string|null | — | odosielateľ (scheme:id) |
receiverId | string|null | — | príjemca (scheme:id) |
invoiceNumber | string|null | — | číslo faktúry |
issueDate | date|null | — | dátum vystavenia |
currency | string|null | — | mena (napr. EUR) |
totalAmount | number|null | — | suma |
status | string | — | stav spracovania |
createdAt | Instant | — | čas záznamu |
User · Token · Webhook
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
User | objekt | — | { id: UUID, email: string } |
Token | objekt | — | { id, name, prefix, lastUsedAt|null, createdAt } |
Webhook | objekt | — | { url: string|null, hasSecret: boolean } |
Stav (ping)
Verejný health-check endpoint, vhodný na monitoring.
/pingverejnéStav backendu.
// 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.
Pripravujeme
- POST
/companies/{id}/peppol/register— Manuálna registrácia do Peppol SMP cez API — dnes prebieha automaticky pri výbere poskytovateľa na portáli FS.
POST /companies/{id}/documents/send je už dostupný (beta — tvar odpovede sa ešte môže meniť); pre stabilné programové odosielanie odporúčame SAPI-SK POST /sapi/document/send s Idempotency-Key.Chcete skorý prístup k integrácii, sandbox alebo máte otázku? Ozvite sa priamo:
