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. Je to 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), kde sa prihlási 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-…",
  "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):

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 / invoice.delivered / invoice.rejected / company.activated / company.deactivated / company.smp_registered_elsewhere
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-…",
      "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ľ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/*dynamický, s veľkou rezervouna 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/**)

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-003403 / 401firma 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 / 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
SAPI-PROC-002503dočasná infraštruktúrna chyba (retryable: true); zopakujte s rovnakým Idempotency-Key
SAPI-PROC-500500neočakávaná chyba (retryable: false); neopakujte, nahláste nám correlation_id

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é mesačne spätne za predchádzajúci mesiac (prvá faktúra 1. 2. 2027 za január 2027). V cene je 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.

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,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