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 zo zákona fail-closed — 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 — to je 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. Č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. Slovenský zákon vyžaduje, aby si firma svojho poskytovateľa („digitálneho poštára") zvolila sama u štátu. Sú to dva nezávislé kroky:
Príjem faktúr → status active
Zákazník vyberie Verteco na portáli FS (jednorazovo, cez eID)
- Pošlite zákazníka na vpds.financnasprava.sk (výber poskytovateľa — Verteco) — prihlási sa 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-…",
"documentId": "574d4e52-…",
"invoiceNumber": "2027-0142",
"senderId": "0245:2120433843",
"receiverId": "0245:2121358349",
"issueDate": "2027-01-15",
"currency": "EUR",
"totalAmount": "1234.56",
"peppolMessageId": "a0b1c2d3-…"
}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 | až 8 pokusov, exponenciálny backoff 30 s → max 1 h, potom dead-letter |
| 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. 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. 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). 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 / company.activated |
| White-label režim | PUT /companies/{id} s { "whiteLabel": true } — platforma neposiela tenantovi žiadne vlastné e-maily |
| 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-…", "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).
Č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
Zo zákona sa skryť nedá
- · 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 — ide o zákonnú podmienku (nie našu).
- · 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 cez eID; 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 |
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/* | 120 / min | na API token |
| /sapi/auth/* a /api/v1/auth/* | 20 / min | na IP adresu |
| /api/v1/public/** (checker, validátor) | 15 / min | 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 120/min bucket-e na token.) 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 | firma pre participanta neexistuje, nemáte k nej prístup, sender nesedí alebo chýba overený Verifikačný údaj |
| 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 |
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 zadarmo
Každá firma prijíma e-faktúry zadarmo do 1 000 faktúr mesačne — vrátane daňového hlásenia a uchovávania dát v EÚ.
Odosielanie od €2/mes
Platí sa len za aktívne odosielajúce IČO: €2/mes (fakturované ročne vopred, €24/rok). V cene je REST API, webhooky, konektory, viac IČO, B2G aj white-label.
€0,03 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 cez eID (zákonná podmienka). 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,03. 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