SAPI — Standardised Access Point Interface

Štandardizované rozhranie Peppol Access Pointu, na ktorom sa zhodli slovenskí AP operátori. Posielate UBL Peppol BIS 3.0, dostanete UBL od protistrany — žiadne vendor lock-in. SAPI-SK 1.0 špecifikácia: sapi-sk.sk. Implementácia ePošťák cez 8 spec-kompatibilných endpointov nižšie.

Demo testovacie účty

Tieto údaje sú verejné sandbox účty pre testovanie integrácie. Sú zaregistrované v Peppol sieti — môžete medzi nimi reálne posielať dokumenty bez registrácie. Pre produkčné kľúče napíšte na <a href="mailto:info@epostak.sk">info@epostak.sk</a>.

Firma A — odosielateľ

0245:0000000001
client_id
487d008a-b3a5-49d0-be3e-ba45cc9c4ffe
client_secret
sk_live_••••••••••••••••1eac

Použite na test odoslania faktúry. V hlavičke X-Peppol-Participant-Id, v metadata.senderParticipantId.

Firma B — prijímateľ

0245:0000000002
client_id
b6649c59-2f9d-4ae2-a750-af257c455478
client_secret
sk_live_••••••••••••••••6733

Použite na test prijatia. Token mintnite vlastnými credentialmi B, request pošlite s X-Peppol-Participant-Id: 0245:0000000002.

Onboarding klienta

Čo je SAPI a ako napojiť prvého klienta cez ePošťák — od jeho registrácie u Finančnej správy až po prvý dokument.

SAPI-SK 1.0 je otvorený štandard, na ktorom sa zhodli slovenskí Peppol Access Point operátori, aby integrátorov nezaháknuli na jeden konkrétny back-end. Jedna integrácia, ľubovoľný AP — keď to raz urobíte pre jedného poskytovateľa, rovnaké volania fungujú aj proti hocikomu inému kto SAPI implementuje. Špecifikáciu nájdete na sapi-sk.sk.

Zjednodušená verzia pre integrátorov. SAPI poskytuje minimálny set 8 endpointov — autentifikáciu (token / renew / revoke / status) a doručovanie dokumentov (send / list / detail / acknowledge). Žiadne dashboardy, žiadne firma-management API, žiadne webhooky. Pošlete UBL XML, dostanete UBL XML, hotovo. Ak váš ERP vie generovať UBL Peppol BIS 3.0 faktúru, integrácia je otázka 1-2 dní.

Potrebujete viac? Pre webhooky, OCR rozpoznávanie PDF/skenov, JSON režim, hromadné operácie alebo správu viacerých klientskych firiem z jedného účtu odporúčame náš rozšírený Enterprise API. Funguje paralelne so SAPI — môžete ich miešať podľa potreby.

Časový rámec. Voľba digitálneho poštára na portáli Finančnej správy SR sa plánuje spustiť koncom mája 2026, kedy začína obdobie dobrovoľnej elektronickej fakturácie. Od 1. januára 2027 je elektronická fakturácia povinná pre všetkých platiteľov DPH na Slovensku.

Krok 1: Klient si zvolí ePošťáka. Váš klient sa prihlási na portál Finančnej správy SR a v zozname certifikovaných poskytovateľov doručovacej služby si zvolí ePošťáka (Kaja Solutions s.r.o.). Následne si u nás vytvorí konto. My ho automaticky zaregistrujeme do centrálneho SMP a vytvoríme mu Peppol ID v tvare 0245:DIČ. Týmto sa stáva viditeľným v celej európskej Peppol sieti. Detailne v článku Ako si zvoliť digitálneho poštára.

Krok 2: Vyžiadajte si SAPI prístup. SAPI nepoužíva OAuth consent flow ako Enterprise API — namiesto toho dostanete od nás client_id a client_secret priamo viazaný na konkrétne Peppol ID. Pre testovanie použite verejné sandbox kľúče nižšie (Firma A / Firma B). Pre produkčné kľúče napíšte na info@epostak.sk — potrebujeme zoznam Peppol ID, za ktoré budete posielať alebo prijímať.

Krok 3: Implementujte 8 endpointov. Vymeňte client credentials za JWT cez POST /sapi/v1/auth/token, cachujte access_token, posielajte UBL Peppol BIS 3.0 cez POST /sapi/v1/document/send s hlavičkou X-Peppol-Participant-Id identifikujúcou firmu, kontrolujte príjmy cez GET /sapi/v1/document/receive a potvrdzujte spracované dokumenty cez POST /sapi/v1/document/receive/{id}/acknowledge. Detailne v sekcii Authentication a Documents nižšie.

Pred produkciou si všetko overte na zdieľaných sandbox účtoch (Firma A / Firma B nižšie). Krok-za-krokom sprievodca aj s code snippetmi je v článku Ako integrovať digitálneho poštára do vášho ERP.

Autentifikácia

OAuth 2.0 client_credentials flow. Vymeňte client_id + secret za JWT a používajte ako Bearer token.

Životnosť tokenov. access_token platí 15 minút (expires_in: 900), refresh_token 30 dní. Cachujte access_token v pamäti — nevolajte /auth/token pred každým requestom (rate-limit + ~100 ms latencia navyše). Pri prvej 401 alebo proaktívne ~1 minútu pred expiráciou zavolajte /auth/renew.

Refresh token rotation. /auth/renew vždy vráti nový pár — starý refresh_token sa okamžite invaliduje. Replay (opätovné použitie už raz spotrebovaného refresh tokenu) vráti 401.

POST/sapi/v1/auth/token

Získať token

OAuth 2.0 client_credentials grant. Vymeňte client_id + client_secret za krátkodobý JWT access_token (15 min) a long-lived refresh_token (30 dní). Volajte tento endpoint raz, token cachujte v pamäti — pri každej požiadavke ho znovu nemintujte.

Parametre

NázovTypPovinnéPopis
client_idstringREQUUID prideľený pri registrácii
client_secretstringREQsk_live_* alebo sk_int_* tajný kľúč
grant_typestringREQMusí byť client_credentials
scopestringoptionalVoliteľný subset povolených scope-ov, oddelený medzerami

Odpovede

  • 200OK
  • 400Invalid grant_type
  • 401Invalid credentials
  • 403IP not allowed
  • 423Account locked (5 fails / 10 min)
GET/sapi/v1/auth/token/status

Stav tokenu

Skontroluje či je access_token ešte platný, kedy expiruje, a či ho treba obnoviť. Pole should_refresh prejde na true ~3 minúty pred expiráciou — vtedy zavolajte /auth/renew.

Parametre

NázovTypPovinnéPopis
AuthorizationstringREQBearer <access_token>

Odpovede

  • 200OK
  • 401Invalid token
POST/sapi/v1/auth/renew

Obnoviť token

Vymeňte refresh_token za nový pár (token rotation). Starý refresh_token sa okamžite invaliduje — opätovné použitie vráti 401 (replay protection).

Parametre

NázovTypPovinnéPopis
grant_typestringREQMusí byť refresh_token
refresh_tokenstringREQPlatný refresh token rt_...

Odpovede

  • 200Nový pár tokenov
  • 401Invalid or replayed refresh_token
POST/sapi/v1/auth/revoke

Zrušiť token

Idempotentne zruší prístup access alebo refresh tokenu. Pri access tokene sa jeho jti pridá do Redis blocklistu na zvyšok TTL; pri refresh tokene sa zmaže server-side stav. Vždy 200 (idempotent).

Parametre

NázovTypPovinnéPopis
tokenstringREQJWT alebo rt_... token
token_type_hintstringoptionalVoliteľne: "access_token" | "refresh_token"

Odpovede

  • 200Revoked (or already revoked)

Dokumenty

Odosielanie a prijímanie Peppol dokumentov ako UBL XML.

UBL XML in, UBL XML out. SAPI je transport-only — vy posielate hotový UBL Peppol BIS 3.0 dokument, my ho doručíme cez AS4 a vrátime UBL od protistrany. Validáciu schemou a schematronom robíme na našej strane (UBL 2.1 XSD + EN 16931 + Peppol BIS 3.0 schematrons), ale formát musí prísť od vás.

X-Peppol-Participant-Id header. Posielate alebo prijímate vždy v mene konkrétneho Peppol ID — header X-Peppol-Participant-Id: 0245:DIČ hovorí, ktorá firma je zdrojom alebo cieľom requestu. Token sám o sebe nevie ku ktorej firme akcia patrí.

Idempotency-Key. Pri /document/send je povinné poslať Idempotency-Key: &lt;UUID&gt; — opakovanie po sieťovej chybe s rovnakým UUID vráti cached 202 namiesto duplicitného odoslania.

POST/sapi/v1/document/send

Odoslať dokument

Odošle dokument cez Peppol sieť (UBL XML). Pred odoslaním overíme cez SMP, že je príjemca v sieti — ak nie, vraciame 422. Idempotency-Key (UUID) je povinný; duplicitné volanie s rovnakým telom vráti cached 202.

Parametre

NázovTypPovinnéPopis
AuthorizationstringREQBearer <access_token>
X-Peppol-Participant-IdstringREQPeppol ID odosielateľa, napr. 0245:0000000001
Idempotency-KeystringREQUUID — opakovaný request s rovnakým telom vráti cached odpoveď
metadataobjectREQ{ documentId, documentTypeId, processId, senderParticipantId, receiverParticipantId, creationDateTime }
payloadstringREQUBL XML obsah faktúry
payloadFormatstringREQMusí byť "XML"
payloadEncodingstringoptionalVoliteľné, default "UTF-8"
checksumstringoptionalVoliteľný SHA-256 hex digest payloadu

Odpovede

  • 202Accepted
  • 400Invalid request
  • 401Invalid token
  • 403No permission for this firm
  • 409Idempotency key collision or duplicate documentId
  • 422Recipient not registered in Peppol
  • 503Temporarily unavailable
GET/sapi/v1/document/receive

Zoznam prijatých

Vráti zoznam dokumentov, ktoré dorazili na váš Peppol ID. Pri väčších objemoch stránkujte cez pageToken.

Parametre

NázovTypPovinnéPopis
AuthorizationstringREQBearer <access_token>
X-Peppol-Participant-IdstringREQPeppol ID prijímateľa, napr. 0245:0000000002
limitintegeroptional1-100, default 20
statusstringoptionalRECEIVED | ACKNOWLEDGED
pageTokenstringoptionalToken na ďalšiu stránku

Odpovede

  • 200OK
  • 401Invalid token
  • 403No permission
GET/sapi/v1/document/receive/{documentId}

Detail prijatého dokumentu

Vráti plný UBL XML payload prijatého dokumentu vrátane metadát.

Parametre

NázovTypPovinnéPopis
AuthorizationstringREQBearer <access_token>
X-Peppol-Participant-IdstringREQPeppol ID príjemcu, napr. 0245:0000000001
documentIdstringREQproviderDocumentId zo zoznamu /document/receive

Odpovede

  • 200OK
  • 401Invalid token
  • 404Document not found
POST/sapi/v1/document/receive/{documentId}/acknowledge

Potvrdiť prijatie

Označí dokument ako spracovaný — prejde zo stavu RECEIVED do ACKNOWLEDGED. Po potvrdení sa už nevracia v zozname so status=RECEIVED.

Parametre

NázovTypPovinnéPopis
AuthorizationstringREQBearer <access_token>
X-Peppol-Participant-IdstringREQPeppol ID príjemcu, napr. 0245:0000000001
documentIdstringREQproviderDocumentId

Odpovede

  • 200Acknowledged
  • 401Invalid token
  • 404Document not found

Referencia

Chybové kódy, rate limity, uchovávanie dát.

Cenník

Transparentné ceny bez skrytých poplatkov.

Sandbox

Testovacie prostredie pre integráciu (verejné Firma A / Firma B účty).

ObjemCena
Neobmedzenezadarmo

Odoslané

Cena za dokument odoslaný cez Peppol cez POST /document/send.

ObjemCena
1 – 1 0000,10 €
1 001 – 2 0000,08 €
2 001+0,06 €
5 000+individuálne

Prijaté

Cena za dokument prijatý cez Peppol a sprístupnený cez GET /document/receive.

ObjemCena
1 – 1 0000,08 €
1 001 – 2 0000,07 €
2 001+0,06 €
5 000+individuálne

Ceny sú bez DPH. Platí sa len za dokumenty skutočne doručené cez Peppol — ak SMP príjemcu nenájde alebo doručenie zlyhá, neúčtujeme. Sandbox je neobmedzený a zadarmo.

Rate limity

Limitácia požiadaviek na API kľúč.

Pravidlá

  • Štandardné endpointy200 / 60 s
  • POST /document/send150 / 60 s

Hlavičky odpovede (HTTP 429)

  • X-RateLimit-Limit
  • X-RateLimit-Remaining
  • X-RateLimit-Reset
  • Retry-After

Hlavičky sa vracajú len v HTTP 429 odpovediach. Odporúčame exponenciálny backoff.

Chybové kódy

Chyby sa vracajú vo formáte {"error":{"code":"...","message":"...","requestId":"..."}}. Kódy označené ako retryable je bezpečné opakovať s exponenciálnym backoffom.

StatusKódPopis
400VALIDATIONNeplatný request — chýbajúce alebo zlé pole
401AUTHNeplatný alebo expirovaný token
403FORBIDDENToken je platný, ale nemá oprávnenie pre túto firmu/scope
404NOT_FOUNDDokument neexistuje alebo nepatrí volajúcej firme
409CONFLICTretryableIdempotency key sa práve spracováva (in-flight collision)
422BUSINESSPríjemca nie je v Peppol sieti, alebo SMP neakceptuje doctype
423LOCKEDÚčet zablokovaný (5 zlých prihlásení / 10 min)
429RATE_LIMITEDretryablePrekročený rate limit
503TEMPORARYretryableDočasná nedostupnosť — opakujte s exponenciálnym backoffom

Uchovávanie dát

Trvalý archív AS4 obálok

Každá signovaná AS4 obálka — odoslaná aj prijatá — sa automaticky ukladá do WORM MinIO bucketu so S3 Object Lock v režime COMPLIANCE na 10 rokov ako infraštruktúra Access Pointu. Platí pre všetky firmy bez ohľadu na plán.

Vlastník dokumentov

Zákonná povinnosť uchovávať daňové doklady 10 rokov (zákon 431/2002 §35) je na vystaviteľovi/príjemcovi faktúry — vy zostávate vlastníkom dokumentov. Naša WORM infraštruktúra túto povinnosť pokrýva, ale formálne ju neprenášame na seba.

Príklady kódu

Na mobile sa code panel skladá pod obsah. Pre každý endpoint posúvaj nadol pod jeho parametre — alebo otvor desktop verziu.