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.

Certifikovaný PA SK · EFSK000031Vlastný Peppol AP · Seat PSK001128OpenAPI 3.1 + verejný sandboxNárodné rozhranie SAPI-SK

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ľ
Dva nezávislé „gate-y" pre každú firmu: príjem — zapne sa po výbere Verteco na portáli Finančnej správy (vtedy firmu automaticky registrujeme do centrálneho SK SMP a dostane 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. 1. Vytvorte si účet na /register (e-mail + heslo, zadarmo, bez viazanosti).
  2. 2. V dashboarde otvorte API tokeny (/dashboard/tokens) a vytvorte token. Formát je vpt_ + 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ň OAuth2 client_id pre SAPI-SK.
  3. 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:

bash
curl https://peppol.verteco.digital/api/v1/auth/me -H 'Authorization: Bearer vpt_8f2a…'
# → 200 { "id": "…", "email": "dev@vasa-saas.sk", … }
Rotácia kľúča = vytvoriť nový token a starý zrušiť (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.

bash
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)
PolePravidlá
ico8 číslic; povinné pri založení; nemenné, keď je raz nastavené (400 ico_immutable); duplicita → 409 ico_taken
dicIČ DPH / DIČ vo formáte SK + 10 číslic (u neplatcov DPH „SK" + DIČ); povinné; nemenné po nastavení — je to Peppol identita firmy
legalNamepovinné, max 500 znakov; po overení Finančnou správou sa zamkne (400 company_verified_locked)
street / city / postalCodevoliteľné (max 255 / 128 / 16 znakov)
countryvoliteľné, 2 znaky, default „SK"
ibanvoliteľné, max 34 znakov — predvyplní sa do faktúr vytváraných v našom webovom rozhraní
registeredAddressvoliteľ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):

bash
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" }
Limity účtu: štandardne 10 firiem na účet a 25 členov tímu — SaaS partnerom limit bezplatne zvýšime podľa potreby, stačí napísať. Prekročenie vráti 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)

  1. Pošlite zákazníka na vpds.financnasprava.sk (výber poskytovateľa — Verteco) — prihlási sa eID (slovensko.sk) a potvrdí výber.
  2. Finančná správa nám pošle webhook s kryptograficky podpísaným súhlasom — overíme ho automaticky.
  3. Firma sa prepne na status: "active", dostane peppolParticipantId (formát 0245:<číslice DIČ>) a automaticky ju zaregistrujeme do centrálneho SK SMP — od tej chvíle prijíma e-faktúry.
  4. Vy nerobíte nič — dokončenie zachytíte webhookom company.activated, alebo pollingom GET /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:

bash
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.

Ak zákazník urobí výber na portáli FS, oba kroky sa vybavia naraz — webhook od FS nesie aj Verifikačný údaj, takže firma je hneď 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:

bash
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 raz

Pri prijatej faktúre pošleme na vašu URL POST (event invoice.received; pri odoslanej invoice.sent):

http
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):

javascript
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čovaniaHodnota
Úspechakákoľvek 2xx odpoveď z vašej strany
Retryaž 8 pokusov, exponenciálny backoff 30 s → max 1 h, potom dead-letter
Timeout15 s na pokus; presmerovania sa nenasledujú
URLverejná http(s) adresa — interné/privátne IP blokujeme (SSRF guard)
Deduplikáciaretry posiela identické telo — deduplikujte podľa documentId
TestPOST /companies/{id}/webhook/test — pošle podpísaný event webhook.test s "test": true

B · Pull: SAPI-SK receive (alternatíva alebo doplnok)

bash
# 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)

bash
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áciou

2 · Odoslanie dokladu (UBL 2.1, Peppol BIS Billing 3.0)

bash
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, …)
Idempotencia: hlavička 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)

bash
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:

bash
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…'
Slovenské daňové hlásenie (TDD) k prijatým aj odoslaným dokladom obstarávame automaticky podľa harmonogramu sprístupnenia produkčného C5 rozhrania Finančnej správy — vy ako partner nič navyše neimplementujete. Jednoduchšia alternatíva k SAPI pre odosielanie: portálový endpoint 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 odosielaniaPOST /companies/{id}/verification (Verifikačný údaj)
Predvyplnenie z registraGET /lookup/company?ico= → názov + adresa z RPO
DokladyGET /companies/{id}/documents?direction=received|sent · GET …/documents/{docId} · POST …/documents/send · POST …/documents/send-test
Sťahovanie a exportyGET …/documents/{docId}/download?format=xml|html|mls · GET …/documents/export.csv · GET …/documents/export.zip (?direction&from&to)
Nastavenia faktúrGET/PUT /companies/{id}/invoice-settings — číslovanie ({YYYY}{NNNN}), splatnosť, predvolený IBAN a poznámka
Adresár odberateľovGET/POST /companies/{id}/address-book · DELETE …/address-book/{entryId} (auto-save po úspešnom sende)
Notifikácie a webhookyGET/PUT /companies/{id}/notifications · POST …/webhook/secret · POST …/webhook/test · udalosti invoice.received / invoice.sent / company.activated
White-label režimPUT /companies/{id} s { "whiteLabel": true } — platforma neposiela tenantovi žiadne vlastné e-maily
TímGET /account/team · POST /account/team/invite · POST /account/team/accept
API kľúčeGET/POST /tokens · DELETE /tokens/{id}
Doklady (SAPI-SK)POST /sapi/document/send · POST …/batch · GET …/receive (+detail, acknowledge) · GET …/sent
Jediné, čo za tenanta spraviť nemôžete, je jednorazový výber poskytovateľa na portáli Finančnej správy cez eID — to je zákonná podmienka platná rovnako pre priamych zákazníkov. Všetko ostatné beží programovo. Voliteľný bonus: po výbere na FS tenant dostane magic-link do nášho portálu — môže, ale nemusí ho nikdy použiť.

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. 1 · Zapnite white-label režim na firme

    S whiteLabel: true platforma 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.

    bash
    curl -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. 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 notificationEmail sa ignoruje) — nastavte webhook a o prijatej faktúre sa dozviete cez invoice.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. 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ť:

    http
    POST 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ľom status v tele (posielame ju len pre reálne aktivované firmy; firma pozastavená administrátorom ju nedostane).

Dôležité poradie: firmu založte cez API skôr, než zákazníka pošlete na výber na portál FS. Ak by výber prebehol pre DIČ, ktoré u nás ešte neexistuje, systém firmu automaticky vytvorí ako samoobslužnú — vrátane uvítacieho e-mailu zákazníkovi (mimo white-label režimu). Pri dodržaní poradia „najprv firma, potom výber" žiadny náš e-mail tenantovi neodíde.

Č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žiadavkaAko 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ľomvýber na portáli FS cez eID; FS nám ho doručí podpísaný (RSA-PSS) — overujeme podpis, nie tvrdenie
Ochrana osobných údajovdá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 tenantovprí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.

bash
# 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:

bash
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:

bash
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)
Verejné endpointy majú prísnejší rate limit (15 volaní/min na IP) — sú určené na jednotlivé overenia, nie hromadné skenovanie. Pri integrácii volajte pred odoslaním; výsledky pozitívnych overení krátkodobo cachujeme.

Robustnosť

Rate limity, chybové odpovede a veľkostné limity

Rate limity (pevné 60-sekundové okno)

RozsahLimitKľúč
/api/v1/** (portál) a /sapi/document/*120 / minna API token
/sapi/auth/* a /api/v1/auth/*20 / minna IP adresu
/api/v1/public/** (checker, validátor)15 / minna 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/**)

jsonc
{ "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/**)

json
{ "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ódHTTPVýznam
SAPI-AUTH-001401neplatné / zrušené client credentials
SAPI-AUTH-002401chýbajúci / neplatný / expirovaný Bearer token
SAPI-AUTH-003403firma pre participanta neexistuje, nemáte k nej prístup, sender nesedí alebo chýba overený Verifikačný údaj
SAPI-VAL-001 / 002400neplatné polia / chýbajúca hlavička X-Peppol-Participant-Id
SAPI-RES-001 / 002404doklad neexistuje / originál payload nie je archivovaný
SAPI-PROC-001502dočasné zlyhanie (retryable: true) — zopakujte s rovnakým Idempotency-Key

Veľkostné limity

KdeLimit
SAPI payload (send / batch položka)10 MB na doklad; batch max 100 položiek
Portálový send (pole xml)2 MB
Verejný validátor3 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.

Počas dobrovoľného obdobia (do 1. 1. 2027) je všetko zadarmo — ceny podľa cenníka platia od mandátu. Nechcete integrovať sami? Riadené napojenie vášho systému spravíme od €990 bez DPH jednorazovo. Jedna zákonná povinnosť sa preniesť nedá: každá firma musí mať pred odosielaním overený Verifikačný údaj (fail-closed gate, § 76a zák. 222/2004) a výber poskytovateľa robí firma sama cez eID.

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