Pre SaaS, ERP a platformy
Vstavajte Peppol e-fakturáciu do svojho produktu
Integrujete sa raz a obsluhujete neobmedzene veľa svojich zákazníkov. Vlastný certifikovaný slovenský Peppol Access Point, REST API, podpísané webhooky, verejný sandbox a white-label v cene. Táto stránka je kompletný technický návod: od registrácie cez onboarding firiem až po odosielanie a príjem dokladov.
Architektúra
Model integrácie: jeden token, N vašich zákazníkov
Model je proxy / multi-tenant: váš backend drží jeden API token (vpt_…) výhradne na serveri a každý váš zákazník je u nás jedna firma (tenant). Všetky volania robí váš server. Token nikdy nepatrí do prehliadača ani do mobilnej appky. Ktorú firmu volanie obsluhuje, určíte pri dokladoch hlavičkou X-Peppol-Participant-Id, pri správe firiem priamo ID firmy v ceste.
1 · Portálové REST API
Správa tenantov: založenie firmy, overenie odosielania, webhooky, zoznamy dokladov, sťahovanie XML/PDF/doručeniek, exporty. Auth: Authorization: Bearer vpt_… priamo.
2 · SAPI-SK 1.0
Národné štandardizované rozhranie na samotné doklady: odosielanie (aj dávkové), príjem, stav doručenia. Auth: OAuth2 client_credentials (client_id = UUID tokenu, client_secret = vpt_… token).
3 · Webhooky k vám
Pri prijatej / odoslanej faktúre voláme vašu URL podpísaným HMAC POST-om s retry a dead-letter frontou (per tenant, s vlastným secretom).
váš SaaS (backend) Verteco Peppol AP svet
────────────────── ───────────────── ────
POST /api/v1/companies ──────────────▶ založenie tenanta
zákazník: výber na FS (eID) ─────────▶ Finančná správa SR
◀── FS webhook: firma active + SMP reg.
POST /sapi/document/send ─────────────▶ validácia → AS4 ─────────────────────▶ Peppol sieť (príjemca)
◀── MLS doručenka (delivered/rejected)
◀── webhook invoice.received ────────── prijatá faktúra z Peppol siete ◀────── odosielateľpeppolParticipantId); odosielanie: po overení Verifikačného údaja (firma je sending-verified). Odosielanie je u nás fail-closed (odporúčanie Finančnej správy poskytovateľom, § 76a ods. 2 zákona o DPH): bez overeného Verifikačného údaja API vráti 403 sending_not_verified. Detaily v kroku 2.Krok 0
Účet a API kľúč: registrácia na naše endpointy
- 1. Vytvorte si účet na /register (e-mail + heslo, zadarmo, bez viazanosti).
- 2. V dashboarde otvorte API tokeny (
/dashboard/tokens) a vytvorte token. Formát jevpt_+ 40 hex znakov; plaintext sa zobrazí iba raz pri vytvorení (my ukladáme len SHA-256 hash). Spolu s tokenom si poznačte aj jeho UUID. Je to zároveň OAuth2client_idpre SAPI-SK. - 3. Token má prístup ako váš účet: funguje pre všetky firmy, ktoré spravujete (multi-tenant bez ďalších kľúčov). Zrušenie tokenu v portáli okamžite zastaví portálové volania aj vydávanie nových SAPI tokenov.
Overenie, že kľúč funguje:
curl https://peppol.verteco.digital/api/v1/auth/me -H 'Authorization: Bearer vpt_8f2a…'
# → 200 { "id": "…", "email": "dev@vasa-saas.sk", … }POST /api/v1/tokens → DELETE /api/v1/tokens/{id}). Už vydané SAPI access tokeny dobehnú do expirácie (max 15 minút).Krok 1
Onboarding zákazníka = založenie firmy cez API
Pre každého zákazníka založte firmu jedným volaním. Vrátené id si uložte k svojmu tenantovi. Je to kľúč pre všetky ďalšie volania.
curl -X POST https://peppol.verteco.digital/api/v1/companies \
-H 'Authorization: Bearer vpt_8f2a…' \
-H 'Content-Type: application/json' \
-d '{
"ico": "12345678",
"dic": "SK1234567890",
"legalName": "Firma zákazníka s.r.o.",
"street": "Príkladná 12",
"postalCode": "010 01",
"city": "Žilina",
"iban": "SK31 1200 0000 1987 4263 7541"
}'
# → 201 { "id": "9fa8fd81-…", "status": "pending_verification", "peppolParticipantId": null, … }
# (IČO/DIČ vyššie sú ukážkové, použite reálne údaje zákazníka)| Pole | Pravidlá |
|---|---|
| ico | 8 číslic; povinné pri založení; nemenné, keď je raz nastavené (400 ico_immutable); duplicita → 409 ico_taken |
| dic | IČ DPH / DIČ vo formáte SK + 10 číslic (u neplatcov DPH „SK" + DIČ); povinné; nemenné po nastavení (je to Peppol identita firmy) |
| legalName | povinné, max 500 znakov; po overení Finančnou správou sa zamkne (400 company_verified_locked) |
| street / city / postalCode | voliteľné (max 255 / 128 / 16 znakov) |
| country | voliteľné, 2 znaky, default „SK" |
| iban | voliteľné, max 34 znakov; predvyplní sa do faktúr vytváraných v našom webovom rozhraní |
| registeredAddress | voliteľné, max 1000 znakov (alternatíva k štruktúrovanej adrese) |
Tip: údaje firmy predvyplníte z Registra právnických osôb (rovnaké API používa náš vlastný onboarding formulár):
curl "https://peppol.verteco.digital/api/v1/lookup/company?ico=53412834" -H 'Authorization: Bearer vpt_8f2a…'
# → 200 { "name": "Verteco digital services, s. r. o.",
# "street": "Daniela Dlabača 21", "city": "Žilina", "zip": "010 01" }409 company_limit). Tím má štandardne 25 členov, SaaS partnerom ho bezplatne rozšírime, stačí napísať. Členov tímu (napr. kolegov zo supportu) pridáte cez POST /api/v1/account/team/invite. Zoznamy stránkujte: GET /companies?page=0&limit=100 (hlavičky X-Total-Count, X-Total-Pages).Krok 2
Aktivácia u Finančnej správy: príjem a odosielanie
pending_verification ≠ živé v Peppole. Podľa výkladu Finančnej správy (FAQ k eFaktúre, príklady 36 a 73) si firma poskytovateľa pre príjem zvolí sama na portáli FS (jeden prijímací poštár na DIČ); pre odosielanie výber slúži na získanie verifikačného údaja a firma smie odosielať aj cez viacerých poštárov. Sú to dva nezávislé kroky:
Príjem faktúr → status active
Zákazník vyberie Verteco na portáli FS (jednorazovo, prihlásením cez eID alebo prihlasovacími údajmi PFS)
- Pošlite zákazníka na vpds.financnasprava.sk (výber poskytovateľa: Verteco), kde sa prihlási eID (slovensko.sk) a potvrdí výber.
- Finančná správa nám pošle webhook s kryptograficky podpísaným súhlasom; overíme ho automaticky.
- Firma sa prepne na
status: "active", dostanepeppolParticipantId(formát0245:<číslice DIČ>) a automaticky ju zaregistrujeme do centrálneho SK SMP; od tej chvíle prijíma e-faktúry. - Vy nerobíte nič: dokončenie zachytíte webhookom
company.activated, alebo pollingomGET /companies/{id}, kým sa vyplnípeppolParticipantId(nastavuje sa výhradne touto cestou).
Odosielanie → sending-verified
Doložte Verifikačný údaj cez API
Verifikačný údaj (VÚ) je podpísaný reťazec, ktorý firma dostane od Finančnej správy pri výbere poskytovateľa (e-mailom / v PDS portáli). Zákazník vám ho vloží do vášho UI a vy ho doložíte jedným volaním; my overíme RSA podpis FS:
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/verification \
-H 'Authorization: Bearer vpt_8f2a…' \
-H 'Content-Type: application/json' \
-d '{"token": "<verifikačný údaj, 1024 hex znakov>"}'
# → 200 { "companyId": "…", "status": "active",
# "sendingVerified": true,
# "verificationMethod": "self", "verifiedAt": "…" }Neplatný podpis → 400 token_invalid. Chýbajúce DIČ → 400 company_dic_missing.
active aj sending-verified a zaregistrovaná na príjem. Samostatné doloženie VÚ cez API sprístupní iba odosielanie; registráciu na príjem (SMP) spúšťa až výber na portáli FS. Odporúčaný flow pre SaaS: založiť firmu cez API → poslať zákazníka na výber na FS → hotovo.Krok 3
Príjem faktúr: webhooky s HMAC podpisom alebo pull cez API
A · Push: webhook per tenant (odporúčané)
Každej firme nastavte webhook URL (a voliteľne notifikačný e-mail) a vyzdvihnite podpisový secret (vráti sa iba raz):
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://vasa-saas.sk/peppol/webhook", "notificationEmail": "zakaznik@firma.sk"}'
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/webhook/secret -H 'Authorization: Bearer vpt_8f2a…'
# → 200 { "secret": "vpt_…" } ← uložte, zobrazí sa iba razPri prijatej faktúre pošleme na vašu URL POST (event invoice.received; pri odoslanej invoice.sent):
POST https://vasa-saas.sk/peppol/webhook
Content-Type: application/json
X-Verteco-Event: invoice.received
X-Verteco-Signature: sha256=3f1a9c… ← HMAC-SHA256 nad surovým telom
{
"event": "invoice.received",
"companyId": "9fa8fd81-…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349",
"documentId": "574d4e52-…",
"invoiceNumber": "2027-0142",
"senderId": "0245:2120433843",
"supplierName": "Dodávateľ s.r.o.",
"receiverId": "0245:2121358349",
"issueDate": "2027-01-15",
"dueDate": "2027-01-29",
"deliveryDate": "2027-01-15",
"currency": "EUR",
"totalAmount": "1234.56",
"peppolMessageId": "a0b1c2d3-…"
}Partnerský podpisový kľúč si nastavíte sami (sprostredkovatelia): PUT /api/v1/resellers/me/notification-webhook s telom { "url": "https://…" } uloží URL, na ktorú budeme udalosti všetkých vašich zákazníckych firiem posielať, a pri prvom nastavení vráti podpisový kľúč (secret); zobrazí sa iba raz. Neskoršie zobrazenie vyžaduje heslo účtu (v portáli v detaile firmy, alebo POST …/notification-webhook/reveal s telom { "password": "…" }); každé zobrazenie sa zapisuje do bezpečnostného logu s IP a časom a posledné vidíte v odpovedi GET. Autentifikácia je vaším portálovým účtom (session alebo Bearer token); kľúč nikdy neposielame e-mailom. To, že je firma sprostredkovateľ, vidíte v API na jej zázname ako reseller: true (príznak whiteLabel označuje až firmy vašich zákazníkov).
Overenie podpisu (Node.js):
import crypto from 'node:crypto';
function verifyVertecoWebhook(rawBody, signatureHeader, secret) {
// podpis = "sha256=" + hex( HMAC-SHA256(secret, surové telo requestu) )
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
return signatureHeader?.length === expected.length
&& crypto.timingSafeEqual(Buffer.from(signatureHeader), Buffer.from(expected));
}
// Dôležité: počítajte HMAC nad SUROVÝM telom (raw bytes), nie nad re-serializovaným JSON-om.| Vlastnosť doručovania | Hodnota |
|---|---|
| Úspech | akákoľvek 2xx odpoveď z vašej strany |
| Retry | 12 pokusov s odstupom od 30 sekúnd do 8 hodín (spolu približne 16 hodín), potom dead-letter s možnosťou opakovaného doručenia z portálu |
| Timeout | 15 s na pokus; presmerovania sa nenasledujú |
| URL | verejná http(s) adresa; interné/privátne IP blokujeme (SSRF guard) |
| Deduplikácia | retry posiela identické telo; deduplikujte podľa documentId |
| Test | POST /companies/{id}/webhook/test (pošle podpísaný event webhook.test s "test": true) |
B · Pull: SAPI-SK receive (alternatíva alebo doplnok)
# zoznam prijatých dokladov (inkrementálne cez ?since=)
curl "https://peppol.verteco.digital/sapi/document/receive?since=2027-01-01T00:00:00Z&limit=200" \
-H 'Authorization: Bearer <sapi_access_token>' \
-H 'X-Peppol-Participant-Id: 0245:2121358349'
# → { "documents": [ { "documentId": "…", "documentTypeId": "…",
# "senderParticipantId": "…", "receiverParticipantId": "…", … } ],
# "nextPageToken": "50" }
# detail vrátane originálneho XML presne tak, ako prišlo zo siete
curl https://peppol.verteco.digital/sapi/document/receive/{documentId} \
-H 'Authorization: Bearer <sapi_access_token>' -H 'X-Peppol-Participant-Id: 0245:2121358349'
# → { "metadata": { … }, "payload": "<Invoice …>", "payloadFormat": "XML" }
# potvrdenie spracovania (idempotentné)
curl -X POST https://peppol.verteco.digital/sapi/document/receive/{documentId}/acknowledge \
-H 'Authorization: Bearer <sapi_access_token>' -H 'X-Peppol-Participant-Id: 0245:2121358349'K dokladom sa dostanete aj cez portálové API: GET /companies/{id}/documents?direction=received, sťahovanie …/documents/{docId}/download?format=xml|html|mls, hromadné exporty …/documents/export.csv a …/documents/export.zip (originály XML). E-mailová notifikácia firme (ak ju zapnete) nesie faktúru ako PDF + originál XML v prílohe, odosielateľ nesie meno firmy a Reply-To smeruje na majiteľa účtu (správanie pripravené na white-label).
Krok 4
Odosielanie faktúr cez SAPI-SK: OAuth2, idempotencia, doručenky
1 · Výmena tokenu (OAuth2 client_credentials)
curl -X POST https://peppol.verteco.digital/sapi/auth/token -H 'Content-Type: application/json' \
-d '{
"grant_type": "client_credentials",
"client_id": "<UUID vášho API tokenu>",
"client_secret": "vpt_8f2a…"
}'
# → 200 { "access_token": "eyJ…", "token_type": "Bearer",
# "expires_in": 900, "refresh_token": "eyJ…" }
# access token platí 15 min (obnova cez POST /sapi/auth/renew, refresh 30 dní);
# GET /sapi/auth/token/status vráti should_refresh: true < 3 min pred expiráciou2 · Odoslanie dokladu (UBL 2.1, Peppol BIS Billing 3.0)
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer <sapi_access_token>' \
-H 'X-Peppol-Participant-Id: 0245:2121358349' \
-H 'Idempotency-Key: fa-2027-0142' \
-H 'Content-Type: application/json' \
-d '{
"metadata": {
"documentId": "FA-2027-0142",
"documentTypeId": "busdox-docid-qns::urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1",
"processId": "cenbii-procid-ubl::urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"senderParticipantId": "0245:2121358349",
"receiverParticipantId": "0245:2120433843"
},
"payload": "<?xml version=\"1.0\"?><Invoice …>…</Invoice>",
"payloadFormat": "XML",
"checksum": "<voliteľné: SHA-256 hex payloadu>"
}'
# → 202 { "providerDocumentId": "<UUID u nás>", "status": "ACCEPTED", "receivedAt": "…", "timestamp": "…" }
# pri "REJECTED" (neprešiel validáciou / sieť odmietla) nesie odpoveď aj pole
# "detail" s konkrétnym dôvodom (napr. porušené pravidlá BR-CO-15, …)Idempotency-Key (odporúčame číslo faktúry alebo interné ID) chráni pred duplicitným odoslaním: opakované volanie s rovnakým kľúčom vráti pôvodný výsledok, nový kľúč pre tú istú faktúru ju môže poslať dvakrát. Prebiehajúci send s rovnakým kľúčom → 502 SAPI-PROC-001 (retryable: true, skúste o chvíľu); po transportnom zlyhaní (failed) retry s rovnakým kľúčom doklad reálne pošle znova. Rovnaký kľúč pošle doklad znova aj vtedy, keď ho odmietla naša kontrola pred odoslaním (REJECTED, do siete nič neodišlo) alebo keď skončil ako undeliverable (po oprave identifikátora príjemcu alebo po jeho registrácii); postup vrátane dátumu vystavenia opravenej faktúry je v dokumentácii pre vývojárov. Payload limit: 10 MB. Doklady pred odoslaním validujeme rovnakým EN 16931 + Peppol BIS rulesetom ako pri príjme; nevalidný doklad vráti REJECTED s konkrétnymi pravidlami (napr. BR-CO-15).3 · Dávkové odosielanie (až 100 dokladov)
curl -X POST https://peppol.verteco.digital/sapi/document/batch \
-H 'Authorization: Bearer <sapi_access_token>' -H 'X-Peppol-Participant-Id: 0245:2121358349' \
-H 'Content-Type: application/json' \
-d '{ "documents": [
{ "itemId": "fa-2027-0142", "idempotencyKey": "fa-2027-0142", "metadata": { … }, "payload": "…", "payloadFormat": "XML" },
…
] }'
# (schematický príklad: metadata má rovnaké polia ako pri jednotlivom sende)
# → 202 { "total": 100, "accepted": 98, "rejected": 1, "failed": 1,
# "results": [ { "itemId": "…", "ok": true, "providerDocumentId": "…", "status": "ACCEPTED" }, … ] }
# položky sa spracúvajú sekvenčne; zlyhanie jednej neovplyvní ostatné4 · Stav doručenia a doručenky (MLS)
Životný cyklus odoslaného dokladu: pending → submitted → delivered / rejected (potvrdené doručenkou MLS od Access Pointu príjemcu) alebo failed (transportné zlyhanie; retry s rovnakým Idempotency-Key), prípadne undeliverable (príjemca nemá adresu v sieti Peppol: doklad sme prevzali a nahlásime Finančnej správe, nikomu sa nedoručí). Stavy sledujte inkrementálne:
curl "https://peppol.verteco.digital/sapi/document/sent?since=2027-01-15T00:00:00Z" \
-H 'Authorization: Bearer <sapi_access_token>' -H 'X-Peppol-Participant-Id: 0245:2121358349'
# → { "documents": [ { "documentId": "574d4e52-…", "peppolMessageId": "a0b1c2d3-…",
# "status": "delivered", "statusDateTime": "…", … } ], … }
# documentId = providerDocumentId zo send odpovede (UUID u nás); párujte podľa neho
# alebo podľa peppolMessageId; pri "rejected" riadok nesie aj statusDetail s dôvodom.
# ?since= zachytáva aj ZMENY STAVU (nie len nové doklady); ideálne na polling každých pár minút
# doručenka (MLS ApplicationResponse XML), právny dôkaz o doručení:
curl "https://peppol.verteco.digital/api/v1/companies/{id}/documents/{documentId}/download?format=mls" \
-H 'Authorization: Bearer vpt_8f2a…'POST /companies/{id}/documents/send s telom { "xml": "…", "receiverParticipantId": "0245:…" } (beta: tvar odpovede sa ešte môže meniť).Plná parita
Všetko, čo má priamy zákazník, obslúžite cez API
Váš tenant nemusí nikdy otvoriť náš portál: každá funkcia, ktorú má priamy zákazník v dashboarde, existuje ako REST endpoint pod vaším tokenom. Prehľad celej správcovskej plochy (všetko Authorization: Bearer vpt_…, base /api/v1):
| Oblasť | Endpointy |
|---|---|
| Firmy (tenanti) | GET/POST /companies · GET/PUT /companies/{id} · stránkovanie ?page&limit + X-Total-Count |
| Overenie odosielania | POST /companies/{id}/verification (Verifikačný údaj) |
| Predvyplnenie z registra | GET /lookup/company?ico= → názov + adresa z RPO |
| Doklady | GET /companies/{id}/documents?direction=received|sent · GET …/documents/{docId} · POST …/documents/send · POST …/documents/send-test |
| Sťahovanie a exporty | GET …/documents/{docId}/download?format=xml|html|mls · GET …/documents/export.csv · GET …/documents/export.zip (?direction&from&to) |
| Nastavenia faktúr | GET/PUT /companies/{id}/invoice-settings: číslovanie ({YYYY}{NNNN}), splatnosť, predvolený IBAN a poznámka |
| Adresár odberateľov | GET/POST /companies/{id}/address-book · DELETE …/address-book/{entryId} (auto-save po úspešnom sende) |
| Notifikácie a webhooky | GET/PUT /companies/{id}/notifications · POST …/webhook/secret · POST …/webhook/test · udalosti invoice.received / invoice.sent / invoice.delivered / invoice.rejected / company.activated / company.deactivated / company.smp_registered_elsewhere |
| White-label režim | PUT /companies/{id} s { "whiteLabel": true }; platforma neposiela tenantovi žiadne vlastné e-maily |
| Odregistrácia white-label firmy | POST /companies/{id}/deregister s hlavičkami X-Company-Proof-Timestamp a X-Company-Proof (HMAC-SHA256 webhook secretom firmy, pozri krok 4 nižšie); samoobslužnú firmu odregistruje len prihlásený vlastník |
| Tím | GET /account/team · POST /account/team/invite · POST /account/team/accept |
| API kľúče | GET/POST /tokens · DELETE /tokens/{id} |
| Doklady (SAPI-SK) | POST /sapi/document/send · POST …/batch · GET …/receive (+detail, acknowledge) · GET …/sent |
Neviditeľná infraštruktúra
White-label prevádzka: tenant komunikuje len s vami
Cieľový stav: váš zákazník používa váš produkt, vašu značku a váš support; my sme neviditeľná infraštruktúra. Tri kroky, ktoré to zaistia:
1 · Zapnite white-label režim na firme
S
whiteLabel: trueplatforma neposiela tenantovi žiadne vlastné e-maily (napr. potvrdenie výberu poskytovateľa) a nepreberá si jeho kontaktnú adresu z výberu na FS. Komunikáciu vediete vy, pod vlastnou značkou.bashcurl -X PUT https://peppol.verteco.digital/api/v1/companies/{id} -H 'Authorization: Bearer vpt_8f2a…' \ -H 'Content-Type: application/json' \ -d '{"ico":"12345678","dic":"SK1234567890","legalName":"Firma zákazníka s.r.o.", "street":"Príkladná 12","postalCode":"010 01","city":"Žilina", "iban":"SK31 1200 0000 1987 4263 7541","whiteLabel":true}' # najjednoduchšie je poslať whiteLabel už pri POST /companies (založení firmy); # POZOR: PUT je plná aktualizácia; pošlite všetky voliteľné polia (adresa, IBAN), # vynechané sa vymažú2 · Notifikácie riešte webhookmi, nie našimi e-mailami
V white-label režime platforma neposiela e-maily o faktúrach vôbec (pole
notificationEmailsa ignoruje). Nastavte webhook a o prijatej faktúre sa dozviete cezinvoice.received. Obsah si stiahnete cez API (XML / tlačiteľné HTML) a zákazníkovi pošlete vlastný e-mail z vlastnej domény.3 · Dokončenie výberu na FS zachytíte webhookom company.activated
Keď zákazník dokončí výber poskytovateľa na portáli Finančnej správy, pošleme na webhook firmy udalosť (nemusíte pollovať):
httpPOST https://vasa-saas.sk/peppol/webhook X-Verteco-Event: company.activated X-Verteco-Signature: sha256=… { "event": "company.activated", "companyId": "9fa8fd81-…", "companyDic": "SK2121358349", "peppolParticipantId": "0245:2121358349", "status": "active", "verifiedAt": "2027-01-05T09:12:33Z" }Udalosť znamená: výber kryptograficky overený, firma prepnutá na
status: "active", registrácia do SK SMP odoslaná; tenant je pripravený prijímať aj odosielať (Verifikačný údaj prišiel spolu s výberom). Udalosť je at-least-once; spracujte ju idempotentne a vždy sa riaďte poľomstatusv tele (posielame ju len pre reálne aktivované firmy; firma pozastavená administrátorom ju nedostane).4 · Keď tenant firmu zruší: odregistrácia cez API s dôkazom webhook secretom
Odregistrácia zo siete je nevratná pre doručovanie faktúr firme, preto ju samotný API kľúč nikdy nevykoná (403
token_not_allowed). Pri white-label firme, ktorú ste založili vy, pridáte druhý faktor, ktorý máte len vy: aktuálny webhook secret firmy (odpoveď na POST …/webhook/secret). Časová pečiatka platí ±300 s, companyId je malými písmenami tak, ako ho vracia API. Nesprávny, expirovaný alebo neuplatniteľný dôkaz vráti 403company_proof_invalidbez bližšieho dôvodu; samoobslužnú firmu (bez whiteLabel) odregistruje naďalej len prihlásený vlastník.bash# secret = vpt_0123456789abcdef0123456789abcdef01234567 (webhook secret firmy) # companyId = 9fa8fd81-2c4e-4b7a-9d3e-5f6a7b8c9d0e # timestamp = 1760000000 (unix sekundy, ±300 s) # message = deregister:9fa8fd81-2c4e-4b7a-9d3e-5f6a7b8c9d0e:1760000000 # proof = hex(HMAC-SHA256(secret, message)) # = e7e21ebd72506453b95c4cbb87c5556a21d93a5539cc7de6b32a29b9d7090901 TS=$(date +%s) PROOF=$(printf '%s' "deregister:{id}:$TS" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" | awk '{print $NF}') curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/deregister \ -H 'Authorization: Bearer vpt_8f2a…' \ -H "X-Company-Proof-Timestamp: $TS" \ -H "X-Company-Proof: $PROOF" # 200 → firma v stave pending_verification + webhook company.deactivated; 403 company_proof_invalid → dôkaz nesedí, # vypršal, firma nie je white-label alebo nemá webhook secret (dôvod sa nevracia)
Čo tenant uvidí a čo nie (úprimne)
Neviditeľné pre tenanta
- · celé API, portál, dashboard (tenant ich nikdy nepotrebuje)
- · e-maily: v white-label režime od nás žiadne nechodia
- · technická identita v sieti (náš Access Point certifikát); vidia ju len iné Access Pointy
Krok, ktorý ostáva na firme
- · jednorazový výber poskytovateľa na portáli Finančnej správy: zákazník tam vyberá „Verteco digital services" zo štátneho zoznamu certifikovaných poskytovateľov. Platí to rovnako pre každého poskytovateľa na trhu; pre príjem je to podľa výkladu Finančnej správy povinnosť, pre odosielanie tým firma získa verifikačný údaj (FAQ FS, príklad 73).
- · Verifikačný údaj od FS, ktorý nám (cez vás) firma dokladá pred odosielaním
Aj toto posledné okno sa dá prebrandovať: Finančná správa umožňuje certifikovaným poskytovateľom registrovať partnerov ako sprostredkovateľov doručovacej služby. Po zápise si zákazník na vpds.financnasprava.sk vyberá priamo vašu značku zo zoznamu. Žiadosť o zápis vygenerujete za pár minút na /sprostredkovatel.
Bezpečnosť a zákonné požiadavky
| Požiadavka | Ako je splnená |
|---|---|
| Oprávnenie odosielať (§ 76a ods. 2 písm. b zák. 222/2004) | fail-closed gate: bez kryptograficky overeného Verifikačného údaja od FS vráti každý send 403; nedá sa obísť ani cez API, ani cez batch |
| Súhlas firmy s poskytovateľom | výber na portáli FS (prihlásenie cez eID alebo prihlasovacími údajmi PFS); FS nám ho doručí podpísaný (RSA-PSS); overujeme podpis, nie tvrdenie |
| Ochrana osobných údajov | dáta faktúr v EÚ (Frankfurt); spracúvanie podľa VOP a zásad ochrany údajov (odkazy nižšie); webhooky podpisované HMAC, secrety sa nedajú spätne prečítať |
| Dôkaz o doručení | MLS doručenka (ApplicationResponse) prijatá overeným AS4 kanálom od Access Pointu príjemcu, stiahnuteľná cez API ako právny doklad o doručení |
| Daňové hlásenie (TDD) | obstarávame automaticky podľa harmonogramu sprístupnenia C5 rozhrania FS; partner nič neimplementuje |
| Izolácia tenantov | prístup len cez členstvo vo firme; API token má prísne rovnaké práva ako váš účet; SAPI kontroluje zhodu odosielateľa s autorizovaným participantom |
| ISO/IEC 27001 | certifikát zatiaľ nemusí mať žiadny poskytovateľ (OpenPeppol ho vyžaduje od všetkých od 1. 10. 2027); naša certifikácia ISO/IEC 27001:2022 prebieha u akreditovaného orgánu SKQS, s. r. o., Žilina (SNAS), vybraného v septembri 2026, certifikát plánujeme do 1. 7. 2027 |
Právne dokumenty: obchodné podmienky · ochrana osobných údajov. Zmluvný vzťah máte s nami vy ako partner; voči svojim zákazníkom vystupujete podľa vlastných podmienok.
Vývoj a testovanie
Sandbox: verejný, bez registrácie
Celý SAPI-SK kontrakt si vyskúšate okamžite s verejnými prihlasovacími údajmi client_id = sandbox / client_secret = sandbox. Sandbox validuje požiadavky presne ako produkcia, ale nikdy nič nedoručí a nevidí reálne dáta; izolácia je vynútená priamo v podpísanom tokene.
# 1 · sandbox token
curl -X POST https://peppol.verteco.digital/sapi/auth/token -H 'Content-Type: application/json' \
-d '{"grant_type":"client_credentials","client_id":"sandbox","client_secret":"sandbox"}'
# 2 · mock send: plná validácia kontraktu, nič sa nedoručí
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer <sandbox_token>' -H 'X-Peppol-Participant-Id: 0245:0000000000' \
-H 'Content-Type: application/json' \
-d '{"metadata":{"documentId":"TEST-1","documentTypeId":"…","senderParticipantId":"0088:sandbox-sender","receiverParticipantId":"0088:sandbox-receiver"},"payload":"<Invoice/>","payloadFormat":"XML"}'
# → 202 { "providerDocumentId": "sandbox-…", "status": "ACCEPTED", … }
# 3 · vzorový prijatý doklad
curl "https://peppol.verteco.digital/sapi/document/receive" -H 'Authorization: Bearer <sandbox_token>' -H 'X-Peppol-Participant-Id: 0245:0000000000'
curl "https://peppol.verteco.digital/sapi/document/receive/sandbox-doc-0001" -H 'Authorization: Bearer <sandbox_token>' -H 'X-Peppol-Participant-Id: 0245:0000000000'Doplnky k sandboxu: verejný validátor e-faktúr (rovnaké pravidlá ako produkčný AP), testovací webhook (POST /companies/{id}/webhook/test) a skúšobná faktúra cez reálnu sieť na vlastnú firmu (POST /companies/{id}/documents/send-test).
Bez autentifikácie
Verejné API: overenie príjemcu a validácia dokladu
Overenie príjemcu v sieti Peppol
Pred odoslaním si overte, či je príjemca registrovaný (živý SML/SMP lookup). Berie SK IČ DPH, DIČ aj plné Peppol ID:
curl "https://peppol.verteco.digital/api/v1/public/peppol-check?id=SK2121358349"
# → { "registered": true, "participantId": "0245:2121358349",
# "smp": "…", "capabilities": ["Faktúra (BIS Billing)", …],
# "lastCheckedAt": "…" }Validácia e-faktúry (EN 16931 + Peppol BIS)
Rovnaký ruleset, akým prechádza každý doklad v našom Access Pointe, ideálne do CI alebo do vývoja mapovania:
curl -X POST "https://peppol.verteco.digital/api/v1/public/peppol-validate" \
-H 'Content-Type: application/xml' --data-binary @faktura.xml
# → { "valid": false,
# "errors": ["BR-CO-15: Invoice total amount with VAT …"],
# "warnings": [] } (limit 3 MB)Robustnosť
Rate limity, chybové odpovede a veľkostné limity
Rate limity (pevné 60-sekundové okno)
| Rozsah | Limit | Kľúč |
|---|---|---|
| /api/v1/** (portál) a /sapi/document/* | dynamický, s veľkou rezervou | na API token |
| /sapi/auth/* a /api/v1/auth/* | prísnejší (anti brute-force) | na IP adresu |
| /api/v1/public/** (checker, validátor) | prísnejší | na IP adresu |
Každá odpoveď nesie hlavičky RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset; pri prekročení príde 429 s hlavičkou Retry-After a telom { "error": "rate_limited", "message": "Too many requests. Slow down." }. (Výnimka: /auth/me a /auth/logout idú v bežnom bucket-e na token.) Aktuálne hodnoty limitov čítajte vždy z hlavičiek; sú nastavené tak, aby ich bežná prevádzka vrátane špičiek nikdy nedosiahla. Pri hromadnom onboardingu / batch odosielaní dávkujte s backoffom na 429. Potrebujete vyšší limit? Napíšte nám.
Dva tvary chýb
Portálové API (/api/v1/**)
{ "error": "ico_taken",
"message": "A company with this IČO already exists" }
// pri validácii polí navyše:
{ "error": "validation_failed", "message": "Some fields are invalid",
"fields": { "dic": "IČ DPH musí byť 'SK' a 10 číslic" } }SAPI-SK (/sapi/**)
{ "error": {
"category": "AUTH",
"code": "SAPI-AUTH-003",
"message": "Sending is not enabled for this participant: a verified Verifikačný údaj is required.",
"retryable": false,
"correlation_id": "b4191dfc-…"
} }| SAPI kód | HTTP | Význam |
|---|---|---|
| SAPI-AUTH-001 | 401 | neplatné / zrušené client credentials |
| SAPI-AUTH-002 | 401 | chýbajúci / neplatný / expirovaný Bearer token |
| SAPI-AUTH-003 | 403 / 401 | firma pre participanta neexistuje, nemáte k nej prístup, sender nesedí, chýba overený Verifikačný údaj; alebo (pri /auth/token a /auth/renew, 401) volajúca IP nie je na allowliste API kľúča nastavenom v portáli |
| SAPI-VAL-001 / 002 | 400 | neplatné polia / chýbajúca hlavička X-Peppol-Participant-Id |
| SAPI-RES-001 / 002 | 404 | doklad neexistuje / originál payload nie je archivovaný |
| SAPI-PROC-001 | 502 | dočasné zlyhanie (retryable: true); zopakujte s rovnakým Idempotency-Key |
| SAPI-PROC-002 | 503 | dočasná infraštruktúrna chyba (retryable: true); zopakujte s rovnakým Idempotency-Key |
| SAPI-PROC-500 | 500 | neočakávaná chyba (retryable: false); neopakujte, nahláste nám correlation_id |
Veľkostné limity
| Kde | Limit |
|---|---|
| SAPI payload (send / batch položka) | 10 MB na doklad; batch max 100 položiek |
| Portálový send (pole xml) | 2 MB |
| Verejný validátor | 3 MB |
| Zoznamy (receive / sent / documents) | limit max 200 na stránku, default 50 |
Obchodný model
Prepredaj a white-label: ako sa to počíta
Príjem bez archívu zadarmo
Firma s vypnutým Archívom dát prijíma e-faktúry zadarmo do 1 000 faktúr mesačne, vrátane daňového hlásenia; obsah dokladov sa u nás maže 14 dní po doručení. Firmy pod vašou značkou (white-label) sa zakladajú bez archívu.
Odosielanie a Archív dát od €2/mes
Platí sa za IČO, ktoré v mesiaci odoslalo faktúru alebo malo zapnutý Archív dát (pri nových firmách v portáli predvolene): €2/mes + DPH, strháva sa z vášho predplateného kreditu vždy 1. deň mesiaca za ukončený mesiac (prvé čerpanie 1. 2. 2027 za január 2027). V cene je archív originálov v EÚ (1 GB), REST API, webhooky, konektory, viac IČO, B2G aj white-label.
€0,01 nad limit
Každá faktúra (prijatá alebo odoslaná) nad 1 000 faktúr mesačne; žiadny tvrdý strop, doručenie nikdy neblokujeme.
Vaša marža = vaša vec
Svojim zákazníkom fakturujete vy, podľa vlastného cenníka. Nám platíte podľa verejného cenníka, bez skrytých partnerských poplatkov.
White-label v cene
Riešenie pod vlastnou značkou je súčasť balíka: e-maily o faktúrach nesú meno firmy zákazníka, vaše UI je vaše.
Objemová dohoda
Pri desiatkach a stovkách firiem pripravíme objemovú dohodu a bezplatne zvýšime limity účtu. Napíšte nám.
Go-live
Checklist pred spustením
- ✓Účet + API token vytvorený, token bezpečne uložený na serveri (nikdy vo frontende).
- ✓Onboarding flow: POST /companies + presmerovanie zákazníka na výber poskytovateľa na portáli FS (eID).
- ✓Stavový polling: sledujete peppolParticipantId (signál, že firma prijíma) a príznak verified + status active pred prvým odoslaním.
- ✓Webhook endpoint: overuje X-Verteco-Signature (HMAC-SHA256 nad surovým telom), odpovedá 2xx do 15 s, deduplikuje podľa documentId.
- ✓Odosielanie: Idempotency-Key na každom sende, backoff na 429 a SAPI-PROC-001, polling /sapi/document/sent?since= na stavy doručenia.
- ✓Mapovanie dokladov otestované cez verejný validátor a sandbox; prvý ostrý test cez send-test.
- ✓Ošetrené chybové stavy: 403 sending_not_verified, 409 ico_taken, REJECTED verdikt s dôvodom.
- ✓Limity účtu navýšené podľa počtu firiem (napíšte nám pri >10 firmách).
Otázky partnerov
Časté otázky SaaS a platforiem
- Musí mať každý náš zákazník účet vo vašom portáli?
- Nie. Model je proxy: váš backend drží jeden API token a firmy zákazníkov zakladáte a obsluhujete cez API vo svojom účte. Zákazník robí jediný krok mimo vášho produktu: jednorazový výber poskytovateľa na portáli Finančnej správy (eID alebo prihlasovacie údaje PFS). Podľa výkladu FS je výber povinný pre príjem; pre odosielanie ním firma dodá verifikačný údaj, ktorý pred odoslaním vyžadujeme. Portálový účet u nás je preňho voliteľný bonus, nie podmienka.
- Ako zistíme, že zákazník dokončil výber na Finančnej správe?
- Najjednoduchšie: nastavte firme webhook a počúvajte udalosť company.activated. Pošleme ju hneď po kryptografickom overení výberu, spolu s prideleným peppolParticipantId. Alternatívne polling: GET /api/v1/companies/{id}, kde spoľahlivý signál dokončeného výberu (a teda schopnosti prijímať) je vyplnené pole peppolParticipantId (nastavuje sa výhradne po výbere na portáli FS). Samotný status active nestačí: nastaví ho aj doloženie Verifikačného údaja cez API, ktoré sprístupňuje iba odosielanie.
- Môžeme službu predávať pod vlastnou značkou (white-label)?
- Áno. Riešenie pod vlastnou značkou je súčasťou balíka Odosielanie a príjem, bez osobitných partnerských poplatkov. Firme nastavíte whiteLabel: true a platforma jej neposiela žiadne vlastné e-maily; notifikácie odoberáte webhookmi a komunikujete pod vlastnou značkou. Vy určujete cenu pre svojich zákazníkov a fakturujete im sami; nám platíte podľa verejného cenníka.
- Ako otestujeme integráciu bez reálnych dokladov?
- Tri nástroje: verejný SAPI sandbox (client_id aj client_secret = "sandbox") s plnou validáciou kontraktu, ktorý nikdy nič nedoručí; verejný validátor e-faktúr (POST /api/v1/public/peppol-validate) s rovnakými EN 16931 + Peppol BIS pravidlami ako produkčný Access Point; a testovací webhook (POST /companies/{id}/webhook/test), ktorý pošle podpísanú vzorovú udalosť na vašu URL.
- Čo ak zákazník posiela tisíce faktúr mesačne?
- Žiadny tvrdý strop: nad 1 000 faktúr mesačne je každá ďalšia faktúra €0,01. API podporuje dávkové odosielanie (batch až 100 dokladov na volanie) a inkrementálne sťahovanie cez parameter since. Pri veľkom objeme firiem alebo dokladov pripravíme objemovú dohodu.
- Aké typy dokladov viete prijímať a odosielať?
- Peppol BIS Billing 3.0 faktúry a dobropisy (UBL 2.1) vrátane SK Billing pravidiel, self-billing faktúry a dobropisy a MLS doručenky. Slovenské daňové hlásenie (TDD) k dokladom obstarávame automaticky podľa harmonogramu sprístupnenia rozhrania Finančnej správy.
- Je API verzované a stabilné?
- Áno. Strojovo čitateľná OpenAPI 3.1 špecifikácia je na /api/v1/openapi.json a pokrýva portálové API aj SAPI-SK. SAPI-SK je národné štandardizované rozhranie, nie proprietárny kontrakt, takže integrácia nie je vendor lock-in. Zmeny robíme spätne kompatibilne.
Začnite so sandboxom ešte dnes · ostrý účet máte za minútu
Súvisiace: kompletná API dokumentácia · OpenAPI 3.1 · hotové e-shop pluginy · pre účtovníkov · cenník