Technická referencia všetkých 37 operácií APEX Access Pointu: APEX API pre hlbokú integráciu (odosielanie aj hromadné, príjem, validácia, precheck, udalosti, odpovede, webhooky a MQTT, participanti, reporting, licencia) a SAPI pre zjednodušený prístup podľa slovenskej špecifikácie SAPI-SK v1.0. Overené voči zdrojovému kódu APEX 26.4.
/api-docs/api a /api-docs/sapi.
APEX Access Point ponúka dva rovnocenné spôsoby integrácie. Výber závisí od toho, kde beží váš systém a aký štýl komunikácie potrebujete. Obe cesty pokrývajú plný Peppol tok (odosielanie aj prijímanie) a môžete ich aj kombinovať.
client_credentials). JSON telo, UBL dokument ako XML text. Odosielanie je asynchrónne (202 / ACCEPTED), stav sledujete pollingom, webhookmi alebo MQTT.SynchronizationMessage s entitou PeppolDocument (30); prijaté dokumenty aj výsledky vašich odoslaní (PeppolDocumentEvent, 32) prichádzajú do vašej delivery queue. Registráciu a prístupové údaje zriaďuje ASOL alebo váš partner.Integráciu vyvíjajte a testujte na sandboxe, do produkcie prejdete výmenou URL a prístupových údajov. Obe prostredia majú rovnaké API, rovnakú autentifikáciu a rovnaké limity.
https://api.sandbox.apex.qasida.sk/api-docs/api, /api-docs/sapihttps://iam.qasida.sk/oauth2/tokenDOCUMENTS_RECEIVED a odosielateľ následne dostane MLS. Namiesto AS4 udalostí uvidíte LOOPBACK_DETECTED a LOOPBACK_PROCESSING_COMPLETED. SML/SMP sa nevolá: lookup pozná len participantov sandboxu a precheck hlási príjemcu vždy ako dostupného. SAPI neznámeho príjemcu odmietne hneď (RECEIVER_NOT_FOUND); APEX API a dávky ho prijmú a dokument po vyčerpaní pokusov (cca 7,5 min) skončí v DEAD_LETTER./swagger-ui, /api-docs/api, /api-docs/sapi/oauth2/token servera ASOL IAM uvedeného v prístupových údajochclientId + clientSecret), viazaný na jednu organizáciu (tenanta). Sandbox prístup obsahuje aj testovacieho participanta 0245:<DIČ> a sandbox licenciu; vyžiadate si ho cez ASOL alebo svojho partnera./api-docs/api (APEX API) a /api-docs/sapi (SAPI) — a Swagger UI na /swagger-ui s tlačidlom Authorize (OAuth 2.0 client_credentials). Z OpenAPI si môžete vygenerovať klienta (OpenAPI Generator, NSwag, Kiota…).
APEX AP poskytuje dve API skupiny: APEX API (/api/v1, /api/v2) pre hlbokú integráciu
a APEX SAPI (/sapi/v1) pre zjednodušené rozhranie podľa špecifikácie SAPI-SK v1.0.
Obe bežia na tom istom serveri a zdieľajú dáta aj tokeny.
Technická cesta od prvého requestu po odoslanie a prijatie faktúry cez APEX API. Všetky kroky si vyskúšate na sandboxe.
client_credentials (platnosť podľa expires_in) a posielajte ho v hlavičke Authorization: Bearer <token>. Pred vypršaním si vyžiadajte nový./api/** aj /sapi/**.POST /api/v1/documents/send s hlavičkou Idempotency-Key (napr. číslo faktúry). Príjemcu určuje receiverParticipantId (slovenské firmy 0245:DIČ). Odpoveď 202 so stavom QUEUED a documentId. Pri timeoute opakujte s tým istým kľúčom.POST /api/v1/subscriptions) alebo MQTT, prípadne pollujte GET /api/v1/documents/{id}/status. Históriu ukáže /events, odpovede protistrany /responses.DELIVERED, alebo jasný dôvod chyby.DOCUMENTS_RECEIVED alebo pravidelne volajte GET /api/v2/documents/inbox?status=VALIDATED, stiahnite detail a po uložení potvrďte POST /api/v1/documents/inbox/{id}/acknowledged.GET /api/v1/participants/lookup/dic?schema=0245&dic=2024000001 (alebo /lookup/ico?ico=…) zistí, či je odberateľ v sieti Peppol a či má použiteľný certifikát.POST /api/v1/documents/precheck s rovnakým telom ako send overí dokument (XSD, EN 16931, Peppol BIS), existenciu príjemcu aj podporu typu dokumentu bez odoslania — výsledkom je networkReady: true alebo zoznam chýb.
Všetky endpointy APEX API a SAPI: účel, kedy ich volať, vstupy, výstupy, správanie a typické chyby.
Cesty sú relatívne k základnej URL prostredia (napr. https://api.sandbox.apex.qasida.sk);
každý request okrem /sapi/v1/auth/token, /renew a /revoke vyžaduje Bearer token.
Odoslanie jedného dokumentu do siete Peppol a sledovanie jeho osudu. Odosielanie je asynchrónne:
POST /send dokument skontroluje, uloží a zaradí do frontu, AS4 prenos prebehne na pozadí.
Stav čítajte cez /status, históriu cez /events a odpovede protistrany cez
/responses — alebo si nechajte posielať notifikácie (záložka Webhooky & MQTT).
202 Accepted so stavom QUEUED.202 znamená prevzatie, nie doručenie./precheck, ak chcete chyby zachytiť ešte pred odoslanímPOST /api/v1/batchesIdempotency-Key202 (pôvodné documentId a submittedAt, status vždy QUEUED) s hlavičkou Idempotent-Replayed: true a nič nové nezaradí — opakovanie po timeoute tak faktúru nikdy neodošle dvakrát. Kľúče sú oddelené pre každého tenanta; krátky a kanonický tvar participanta sa považujú za rovnaký obsah. Rovnaký kľúč s iným obsahom (dokument alebo metadáta) → 409 IDEMPOTENCY_CONFLICT; súbežný request s tým istým kľúčom → 409 IDEMPOTENCY_IN_PROGRESS. Odmietnutý request (400/403/500) kľúč nespotrebuje.QUEUED → PROCESSING → DELIVERED. Ak pokus o AS4 prenos zlyhá, dokument prejde do RETRYING a ďalší pokus príde o 30, 60, 120 a 240 s; piate zlyhanie (alebo trvalá chyba, napr. certifikát príjemcu nevydaný CA OpenPeppol) → DEAD_LETTER, spravidla do 8 minút. Negatívny Peppol MLS od prijímajúceho AP prepne dokument na FAILED — aj keď už bol DELIVERED. Licencia neplatná v čase odosielania → REJECTED.400 — chýbajúce pole (napr. Receiver participant ID is required), zlyhaná validácia dokumentu alebo nezhoda strán (telo s validationErrors[])401 — chýbajúci alebo neplatný Bearer token403 — odosielateľ chýba, nie je registrovaný alebo nepatrí vášmu tenantovi; neplatná licencia409 — IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS500 — dokument sa nepodarilo zaradiť (Failed to queue document: …); sem patrí aj príjemca, ktorý nie je v Peppol alebo neprijíma daný typ dokumentu — preto ho overte cez /precheck alebo lookupublDocument je XML text (nie Base64) — holý UBL dokument alebo UBL v obálke SBDH; úvodný UTF-8 BOM APEX odstráni. Typ a proces musia zodpovedať obsahu (cbc:CustomizationID, cbc:ProfileID). Odosielateľ a príjemca musia sedieť s cbc:EndpointID strán dokladu: dodávateľ → odberateľ; samofaktúru posiela odberateľ a objednávku kupujúci. Nezhoda vráti SENDER_SUPPLIER_MISMATCH / RECEIVER_CUSTOMER_MISMATCH (resp. SENDER_CUSTOMER_MISMATCH / RECEIVER_SUPPLIER_MISMATCH). Schematron sa pri dokumentoch nad 5 MB preskočí.0245:2024000001) alebo kanonický tvar (iso6523-actorid-upis::0245:2024000001)urn:fdc:peppol.eu:2017:poacc:billing:01:1.0/status, /events, /responses a notifikácieQUEUED/send, dávku alebo SAPI (SAPI providerDocumentId je ten istý UUID). Notifikácie nemajú zaručené poradie, preto je tento endpoint autoritatívnym zdrojom stavu.statusDELIVERED)PROCESSING do QUEUED (napr. pri prerušení odosielania na nedostupný cieľ) bez notifikácie a bez spotrebovania pokusu.404 (prázdne telo) — dokument neexistuje, nepatrí vášmu tenantovi alebo ide o prijatý dokument (stav je len pre odoslané)401 — neplatný token/send (path)200 — výsledok je v poli valid./send robí tú istú validáciu (navyše kontroluje strany, licenciu a príjemcu). Ak documentTypeId nezadáte, odvodí sa z koreňového elementu: CreditNote → BIS 3.0 dobropis, inak BIS 3.0 faktúra. Podporované sú faktúry a dobropisy BIS Billing 3.0 (vrátane samofakturácie, PINT a XRechnung), objednávky, odpovede na objednávky, dodacie listy, katalógy, MLR, IMR a MLS; pre neznámy typ vráti chybu SCHEMATRON_001.valid je true, len ak prejdú všetky tri vrstvy; po vrstvách schemaValid, schematronValid, businessRulesValid. Každá chyba má level (ERROR/WARNING/INFO), code (napr. BR-07, PEPPOL-EN16931-R004), message a location (XPath). Pri úspešnom parsovaní vráti aj metadáta dokladu.400 — chýba telo alebo ublDocument je prázdny415 — telo nie je application/json200 s valid: falselevel, code, message, location/send, ale bez uloženia a zaradenia: validácia dokumentu, existencia príjemcu v Peppol a podpora typu dokumentu. Výsledok networkReady.valid (XSD, EN 16931, Peppol BIS)participantExists (SML/DNS nájde SMP)canSend (SMP príjemcu ponúka documentTypeId + processId, AS4 endpoint a platný certifikát)networkReady = valid && participantExists && canSendPARTICIPANT_NOT_FOUND; hlási sa aj pri dočasnej nedostupnosti SML/SMP)DOCTYPE_NOT_SUPPORTED)CERT_EXPIRING_SOON (certifikát príjemcu vyprší do 30 dní).participantExists a canSend sú vždy true200 sa vracia vždy, aj keď kontroly neprejdú; licenciu precheck nekontroluje400 — chýba povinné pole; 403 — chýbajúci alebo cudzí odosielateľ/sendcategory, code, message, location (pri PARTICIPANT/ROUTING null)createdAt.QUEUE_PROCESSING_STARTED / QUEUE_PROCESSING_FAILEDMESSAGE_RECEIVED → MESSAGE_VALIDATED → MESSAGE_ACKNOWLEDGED)eventType404 — dokument neexistuje[] — zatiaľ bez udalostídocumentId dokumentu, ku ktorému udalosť patríEBMS-0010, BR-07)nulldocumentTypeId …urn:peppol:edec:mls…), IMR (Invoice Response 3.0 / T111), ORDER_RESPONSE (BIS 28a), RECEIPT_ADVICE (BIS 30a)RE a CA obsahuje issues[] jednotlivé dôvody z odpovede: type (kód dôvodu, spravidla BV biznis / SV syntax), code, description, severity (FATAL pri RE, inak WARNING) a xpath (spravidla null). AP s prázdnym zoznamom = čisté prijatie.[] — zatiaľ bez odpovede (bežné hneď po odoslaní)[] — aj keď documentId je sám odpoveďou404 — dokument nie je váš alebo neexistujeMLR, IMR, ORDER_RESPONSE, RECEIPT_ADVICEAP/RE/CA/UQ/IP a jeho popisApplicationResponse), Content-Type: application/xml./responses — obchodnej odpovede protistrany (IMR/MLR), odpovede, ktorú ste poslali vy, alebo MLR, ktoré APEX vygeneroval a poslal AP odosielateľa (C2).404 — responseId nepatrí k danému dokumentu (aj keď sú obe ID rovnaké)
Dokumenty, ktoré vám prišli zo siete Peppol cez AS4. Pull model: zoznam → detail → potvrdenie.
O novom dokumente sa dozviete pollingom zoznamu alebo notifikáciou DOCUMENTS_RECEIVED (webhook / MQTT).
Endpointy existujú vo verzii v1 (identifikátory v kanonickom tvare iso6523-actorid-upis::0245:…)
a v2 (krátke Peppol ID 0245:…). Pre nové integrácie odporúčame v2; potvrdenie existuje len vo v1.
receivedAt DESC). Odosielateľ a príjemca v krátkom tvare 0245:2024000001.ublDocument je prázdne) — obsah získate z detailu. Čítanie zoznamu nemení stav dokumentov.status=VALIDATED — to sú dokumenty, ktoré čakajú na stiahnutieGET /api/v2/documents/inbox/{documentId}POST /api/v1/documents/inbox/{documentId}/acknowledged — z ďalšieho pollingu vypadneDOCUMENTS_RECEIVED)offset / limit (predvolene 0 / 20; odporúčame najviac 100); odpoveď nesie total — počet záznamov zodpovedajúcich filtru. status rozlišuje veľké a malé písmená; neznáma hodnota vráti 400.VALIDATED, ACKNOWLEDGED, REJECTED, FAILEDdocumentId, senderParticipantId, receiverParticipantId, documentTypeId, processId, receivedAt, statusStandardBusinessDocument (SBDH obálka s UBL dokumentom vnútri).ublDocument obsahuje kompletný StandardBusinessDocument tak, ako prišiel sieťou Peppol — koreňom je obálka SBDH, nie faktúra. Validácia priamo voči UBL Invoice XSD preto zlyhá; biznis dokument nájdite podľa menného priestoru kdekoľvek v strome. Identifikátory vnútri payloadu sa neprepisujú, krátky tvar platí len pre JSON polia.cac:, cbc:…) nie sú súčasťou kontraktu a môžu sa meniť medzi verziami aj v rámci jedného dokumentu. Viažte sa na URI menných priestorov a lokálne názvy z UBL 2.1 a Peppol BIS Billing 3.0.POST /api/v1/documents/inbox/{documentId}/acknowledged. Stiahnutie samo o sebe stav nemení. Ak v odpovedi chýba pole ublDocument, payload sa práve nepodarilo načítať — dokument nepotvrdzujte a skúste to neskôr.404 (prázdne telo) — dokument neexistuje, nie je adresovaný vášmu tenantovi alebo nejde o prijatý dokument401 — neplatný token0245:1234567890)StandardBusinessDocument (XML reťazec)senderParticipantId / receiverParticipantId v plnom kanonickom tvare ISO 6523 — iso6523-actorid-upis::0088:1234567890123.0088:1234567890123, teda rovnaký tvar, aký posielate v requestoch a aký vracia /participants/lookup.ACKNOWLEDGED. Odpoveď 204 No Content.204. Potvrdiť možno prijatý dokument v akomkoľvek stave (aj REJECTED, ak ho chcete označiť ako vybavený); potvrdenie sa zapíše do udalostí ako MESSAGE_ACKNOWLEDGED a platí aj pre SAPI.404 — dokument neexistuje alebo nepatrí vášmu tenantovi401 — neplatný token
Desiatky až tisíce dokumentov jedným requestom (mesačná fakturácia, migrácia). Dávka prijme až 5 000 dokumentov
a hneď odpovie 202. Každý dokument potom na pozadí prejde presne tými istými kontrolami ako
POST /api/v1/documents/send a zaradí sa samostatne. Dokumenty dávky sa odosielajú až po dokumentoch posielaných
jednotlivo a tenanti sa vo fronte striedajú, takže veľká dávka nebrzdí bežnú prevádzku.
202 s batchId a hlavičkou Location.202 znamená, že APEX dávku prevzal, nie že sú dokumenty platné. Dokumenty sú nezávislé: neplatný dokument nezastaví ostatné, skončí REJECTED s dôvodom. Výsledok sledujte cez GET /api/v1/batches/{batchId} (nie častejšie ako raz za 10 s) alebo notifikáciu BATCH_PROCESSED.RECEIVED/PROCESSING) na tenantaIdempotency-Key (1–200 znakov, napr. ID behu ERP). Ten istý kľúč a bajtovo identické telo → pôvodná 202 s Idempotent-Replayed: true, nová dávka nevznikne. Iné telo → 409 IDEMPOTENCY_CONFLICT. Kľúč dávky neexpiruje. Telo si pred odoslaním uložte a pri opakovaní pošlite tie isté bajty (curl --data-binary).Content-Type: application/zip (aj application/x-zip-compressed); každý súbor = jeden dokument v UTF-8 (holý UBL alebo UBL v SBDH). Cesta súboru v archíve je clientReference dokumentu (súbory pomenujte číslom dokladu). Názov dávky a režim notifikácií idú do query parametrov clientReference a notify. Metadáta APEX odvodí z dokumentu: typ z koreňového elementu + cbc:CustomizationID, proces z cbc:ProfileID, strany z cbc:EndpointID (dodávateľ → odberateľ; pri samofaktúre naopak; pri objednávke kupujúci → predávajúci). Súbor bez odvoditeľných metadát skončí REJECTED s INVALID_METADATA.400 BATCH_INVALID_REQUEST — nie je to JSON objekt/ZIP, chýba documents alebo povinné pole (správa uvádza cestu, napr. documents[17].processId), duplicitný clientReference, neznámy notify400 INVALID_IDEMPOTENCY_KEY403 PARTICIPANT_NOT_AUTHORIZED / LICENCE_INVALID409 IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS413 BATCH_TOO_LARGE429 TOO_MANY_OPEN_BATCHES / BATCH_INTAKE_BUSY (zopakujte po Retry-After)BATCH (predvolené), DOCUMENT, BOTH/documents/sendRECEIVEDExpect: 100-continue — odmietnutie (429, 403, 400) potom príde ešte pred nahraním tela. Dávky jedného tenanta neposielajte paralelne a tú istú faktúru neposielajte zároveň v dávke aj cez /documents/send — odišli by dve.items) a živé počty doručovania vzniknutých správ (messages).ACCEPTED, REJECTED alebo CANCELLED; doručovanie prijatých pokračuje (pozri messages)items = prevzatie dokumentov: pending, processing, accepted, rejected, cancelled.messages = doručovanie správ z prijatých dokumentov, rovnaké stavy ako /documents/{id}/status: queued, processing, delivered (vrátane prechodného SENT), retrying, failed, rejected, deadLetter. Súčet messages = accepted.404 BATCH_NOT_FOUND — neexistuje alebo patrí inému tenantoviprocessedAt je null, kým nie sú spracované všetky dokumentystatus=REJECTED pre to, čo treba opraviť.errorCode)errors[]DOCUMENT_NOT_UTF8, DOCUMENT_NOT_XML, DOCUMENT_TYPE_UNSUPPORTED, CUSTOMIZATION_ID_MISSING, PROFILE_ID_MISSING, SENDER_ENDPOINT_MISSING, RECEIVER_ENDPOINT_MISSING, METADATA_INVALID)errorMessage po dočasnej chybe čaká na ďalší pokus)documentId použite pre /documents/{id}/status, /events, /responseserrorCodestatus (voliteľné), page od 0, size predvolene 100, najviac 1 000. Chyby: 400 neplatný stav/stránkovanie, 404 BATCH_NOT_FOUND.ACCEPTEDerrors[] = code, message, location[from, to) alebo v jednom stave.from, to (ISO 8601 date-time), status (RECEIVED, PROCESSING, PROCESSED, CANCELLED), page od 0, size predvolene 20, najviac 1 000.content[] s batchId, clientReference, status, notify, itemCount, receivedAt, processedAt, cancelledAt; ďalej page, size, totalElements. Počty dokumentov sú v detaile dávky. Chyba 400 pri neplatnom stave alebo stránkovaní.ACCEPTED) dokumenty sú na ceste a nevolajú sa späť.PENDING aj dokument, ktorý sa práve validuje (o chvíľu skončí CANCELLED, preto môže byť v odpovedi ešte processing > 0). Dávka prejde na CANCELLED, prestane sa počítať do limitu 3 otvorených dávok a BATCH_PROCESSED sa pre ňu nepošle. Odpoveďou je stav dávky (ako GET /batches/{batchId}).404 BATCH_NOT_FOUND409 BATCH_NOT_CANCELLABLE — dávka je už PROCESSED alebo CANCELLEDnotify. BATCH_PROCESSED príde na každý aktívny webhook a MQTT queue tenanta; filtre webhooku sa naň neuplatňujú. Nenesie zoznam dokumentov, iba počty — dokumenty načítajte cez /items.notify | BATCH_PROCESSED | Notifikácie jednotlivých dokumentov |
|---|---|---|
| BATCH (predvolené) | áno | iba problémy: QUEUE_PROCESSING_FAILED, QUEUE_DEAD_LETTER, MLS_RECEIVED_NEGATIVE |
| DOCUMENT | nie | všetky, ako pri jednotlivom odoslaní |
| BOTH | áno | všetky |
Vyhľadanie obchodného partnera v sieti Peppol podľa DIČ (alebo iného identifikátora so schémou) či IČO.
Výsledok povie, či je partner v Peppol registrovaný, cez ktorý AS4 endpoint prijíma a či je certifikát jeho prístupového bodu použiteľný.
Pre slovenské subjekty používajte schému 0245 (SK:DIČ) — Peppol ID má tvar 0245:2024000001.
<schema>:<dic>, plný identifikátor iso6523-actorid-upis::<schema>:<dic>. Hodnoty sa používajú presne tak, ako ich pošlete — bez orezania, zmeny veľkosti písmen, odstránenia prefixu SK a bez kontroly formátu. 2024000001 a SK2024000001 sú dva rôzne identifikátory.source=LOCAL), bez neho 404; SML/SMP sa nevolá.source=LOCAL.404 (aj keď lokálny záznam existuje)LOCAL), bez neho 503source=SMP s endpointom a certifikátomsource=SMP s uloženým endpointom alebo nullcertificate.validtrue — certifikát publikovaný v SMP prešiel počas requestu plnou kontrolou: platnosť, reťaz vydavateľa a stav odvolania, na ktorý CRL alebo OCSP skutočne odpovedal.false — certifikát je s istotou nepoužiteľný, dôvod v invalidReason: EXPIRED, NOT_YET_VALID, REVOKED, UNTRUSTED_ISSUER (nevydala ho CA OpenPeppol). Na taký endpoint nemožno doručiť.null — stav sa v tomto requeste nezistil (certifikát z lokálneho záznamu, alebo soft-fail pri nedostupnom CRL/OCSP). Soft-fail nikdy nedá true.valid a invalidReason sú v JSON vždy, aj s hodnotou null.400 — chýba schema alebo dic404 — nie je registrovaný v Peppol, alebo prázdna hodnota (bez tela)503 — SML/SMP neodpovedá a lokálny záznam neexistuje — zopakujte neskôr0245 (SK DIČ), 9950 (SK IČ DPH), 9929 (CZ VAT), 9914 (AT VAT), 0088 (GLN)SKLOCAL (lokálny záznam) alebo SMP (živé vyhľadanie v tomto requeste)iso6523-actorid-upis::0245:…0245:2024000001null0245 → SK); ZZ = neznámanull, ak záznam neexistujesubject, issuer, serial, fingerprint (SHA-256), notBefore, notAfter, expired, valid, invalidReason/lookup/dic.404.503.schema vznikne Peppol ID a vyhodnotí sa rovnako ako /lookup/dic.400 — chýba ico404 — IČO sa nepodarilo preložiť na DIČ alebo participant nie je v Peppol503 — registeruz.sk alebo SML/SMP nedostupné0245/lookup/dic
Push notifikácie namiesto pollingu: o novom prijatom dokumente a o udalostiach vašich odoslaných dokumentov.
Dva kanály — HTTPS webhook (filtrovateľný, viac odberov) a MQTT topic (jeden na tenanta, všetky notifikácie).
Notifikácia dokument iba identifikuje, obsah si stiahnete cez API. Doručenie je best-effort, najviac raz a bez zaručeného poradia:
stav dokumentu berte vždy z poľa status, nikdy z eventType.
documentIds má vždy práve jeden prvok, tvar poľa je zachovaný kvôli kompatibilite). Polia s hodnotou null sa v JSON vynechávajú.| Pole | Význam |
|---|---|
| eventType | Čo notifikáciu vyvolalo — nie stav dokumentu |
| subscriptionId | Odber, pre ktorý sa doručuje (pri MQTT chýba) |
| documentId / documentIds | UUID dokumentu / to isté ako jednoprvkové pole |
| receivedCount | Vždy 1, len pri DOCUMENTS_RECEIVED |
| direction | IN prijatý, OUT odoslaný dokument |
| status | Stav dokumentu v čase odoslania notifikácie |
| messageId | ID správy; pri prijatom dokumente AS4 Message ID od odosielajúceho AP |
| conversationId | Conversation ID dokumentu (ak existuje) |
| senderParticipantId, receiverParticipantId | Peppol ID vrátane schémy (iso6523-actorid-upis::…) |
| documentTypeId, processId | Peppol typ dokumentu a proces |
| eventMessage | Čitateľný detail, neparsujte ho |
| notifiedAt | Kedy bola notifikácia zostavená. Webhook: číslo, Unix epoch sekundy so zlomkom (1776168005.123456000); MQTT: ISO 8601 reťazec |
| batch | Len pri BATCH_PROCESSED: batchId, clientReference, status, itemCount, accepted, rejected, cancelled |
| eventType | Smer | Kedy |
|---|---|---|
| DOCUMENTS_RECEIVED | IN | Prijatý dokument prešiel validáciou a je uložený (VALIDATED); pri zamietnutom ani duplicitnom dokumente nepríde |
| MESSAGE_QUEUED | OUT | Váš dokument bol prijatý a zaradený |
| QUEUE_PROCESSING_STARTED | OUT | Začal sa pokus o odoslanie (pri každom pokuse; nie pri self-send) |
| MESSAGE_DELIVERED | OUT | Doručené prijímajúcemu AP (alebo lokálne pri self-send) |
| QUEUE_PROCESSING_FAILED | OUT | Pokus zlyhal, ďalší je naplánovaný |
| QUEUE_DEAD_LETTER | OUT | Odosielanie vzdané, dokument je DEAD_LETTER |
| MLS_RECEIVED | OUT | Prišiel pozitívny Peppol MLS |
| MLS_RECEIVED_NEGATIVE | OUT | Prišiel negatívny MLS; dokument je FAILED (aj po DELIVERED) |
| BATCH_PROCESSED | — | Dávka je spracovaná (podľa notify) |
MESSAGE_DELIVERED môže prísť pred MESSAGE_QUEUED. status je stav prečítaný pri odoslaní notifikácie, môže byť novší ako udalosť (napr. MESSAGE_QUEUED so stavom DELIVERED) a notifikácia so starším stavom môže prísť po novšej. Poslednú prijatú notifikáciu teda neberte ako aktuálny stav; pri pochybnosti zavolajte GET /api/v1/documents/{documentId}/status. Nie každá zmena stavu sa notifikuje (napr. REJECTED pre neplatnú licenciu)./inbox, /status).POST pri každom dokumente a udalosti, ktoré zodpovedajú filtrom. Odpoveď 201 Created.https:// a dostupná zo servera APEX (dostupnosť sa pri registrácii neoveruje, presmerovania sa nenasledujú). Timeout spojenia 2 s a odpovede 2 s — vráťte 2xx čo najskôr (ideálne < 500 ms) a ťažké spracovanie robte asynchrónne. Odbery tenanta sa pre jednu udalosť volajú postupne, pomalý endpoint teda zdrží ostatné. Request má Content-Type: application/json, Accept: application/json a User-Agent: Apex-Webhook/1.0. Telo nie je podpísané — na overenie APEX použite customHeaders (napr. tajný token).documentTypeFilters — zoznam typov dokumentov, presná zhoda; platí pre prijaté aj odoslané dokumenty.senderParticipantFilters — zoznam odosielateľov, presná zhoda na kanonický identifikátor tak, ako je v senderParticipantId notifikácie (napr. iso6523-actorid-upis::0245:1234567890; krátky tvar sa nezhoduje); len pre prijaté dokumenty.BATCH_PROCESSED filtre ignoruje.[A-Za-z0-9-_], hodnota max 1 000 znakov bez zalomení riadkov. Host, Content-Length, Content-Type a Transfer-Encoding nemožno prepísať (Accept a User-Agent áno). Hlavička, ktorá pravidlá nesplní, sa ticho vynechá — skontrolujte customHeaders v odpovedi.400 — chýba name/url, URL nie je https://, priveľa hlavičiek (Problem Details s detail: "Invalid request content.")409 — tenant už má 3 webhooky401 — neplatný tokentrue)offset (predvolene 0), limit (predvolene 20, 1–100).items[] (objekty ako pri vytvorení), total (všetky odbery tenanta bez ohľadu na stránku), offset, limit. Chyby 400 (limit < 1), 401.404, ak neexistuje alebo patrí inému tenantovi.POST; prepíšu sa všetky polia (nie PATCH). Na dočasné pozastavenie bez straty nastavenia pošlite active: false. Zmena platí pre notifikácie odoslané po uložení. Odpoveď 200 s aktualizovaným odberom; 400 pri neplatnom tele, 404.204; 404, ak neexistuje. Ak chcete len prestať dočasne, použite PUT s active: false.queueName, napr. /apex/inbox/apex-sk2024000001) dostáva notifikácie prijatých aj odoslaných dokumentov, hoci má v názve inbox. Filtre a príznak active webhookov sa naň neuplatňujú. Správa má rovnaký formát ako webhook, bez subscriptionId a s notifiedAt ako ISO 8601 reťazcom.host, port, username, password (alebo mqttUrl, ktoré má vždy schému mqtt:// — či broker vyžaduje TLS, určuje prostredie). Prihláste sa na topic queueName doslovne, vrátane úvodnej lomky a bez zástupných znakov (#, +) — používateľ brokera má oprávnenie len na presne tento topic. APEX publikuje s QoS 1, bez retain; či sa vám uchovajú správy publikované počas výpadku spojenia, závisí od brokera a nastavení vašej MQTT session (clean / persistent session).password a úplné mqttUrl sa vrátia len v tejto odpovedi; na serveri je uložený iba hash hesla. Pri strate hesla prístup zmažte a vytvorte nový — vznikne nové heslo.409 — MQTT prístup pre tenanta už existuje (najprv ho zmažte)400 — prístup sa na brokeri nepodarilo zriadiť; zopakujte neskôr401mqttUrl — nepoužívajte v nových integráciách204; 404, ak prístup neexistuje.Prehľad prevádzky tenanta (štatistiky odoslaných a prijatých dokumentov), história štatistických hlásení EUSR/TSR do OpenPeppol a stav licencie s mesačným čerpaním dokumentov.
/reporting/statistics sú spoľahlivé živé počty delivered, failed, topRecipients, topSenders a failedDocuments; agregované total, byDocumentType, byCountry a deliveryRate sú zatiaľ nulové alebo prázdne. /reporting/submissions zatiaľ nevracia záznamy. Pre presné čísla o vašich dokumentoch použite /api/v1/licenses/info (mesačné čerpanie) a vlastnú evidenciu stavov.period=month / quarter / year — aktuálny kalendárny mesiac, štvrťrok, rok.from + to (obidva, YYYY-MM-DD) — vlastný interval, period sa ignoruje a v odpovedi je type=custom. Ak pošlete len jeden z nich, ignoruje sa.period vždy uvádza presne použitý rozsah.sent / received: total, delivered, failed (FAILED + DEAD_LETTER), deliveryRate (0.0–1.0, null pri nule), byDocumentType (kľúče INVOICE, CREDIT_NOTE, ORDER, ORDER_RESPONSE, DESPATCH_ADVICE…), byCountry (krajina protistrany).deliveryRate na najvyššej úrovni počíta len odoslané dokumenty.topRecipients / topSenders — najviac 10 partnerov (name, peppolId v kanonickom tvare, countryCode, count).failedDocuments — dokumenty, ktoré sú práve v chybovom stave (bez ohľadu na obdobie, oba smery): total, deadLetters, retrying, rejected.400 — from po to alebo neznáme period401 / 403errorMessage), zopakuje sareportType (EUSR/TSR), status, offset (predvolene 0), limit (predvolene 20, 1–100). Napr. ?reportType=EUSR&status=FAILED.items[]: id, reportType, periodStart, periodEnd, reporterId, status, errorMessage, submittedAt, validatedAt, createdAt; ďalej total, offset, limit. Chyba 400 pri neznámej hodnote filtra.maxDocuments je mesačný (-1 = neobmedzený). Všetky počty v documentUsage sa týkajú aktuálneho kalendárneho mesiaca v UTC (periodStart–periodEnd). usedDocuments = odoslané + prijaté, každá uložená správa bez ohľadu na stav (aj QUEUED a FAILED).limitExceeded: true odosielanie aj príjem fungujú ďalej — je to signál na navýšenie licencie. Počítadlá sa vynulujú začiatkom ďalšieho mesiaca. Neplatná licencia (valid: false) však odosielanie blokuje (REJECTED, resp. 403 LICENCE_INVALID).serialNumber, companyName, branchName, licenseTypeCode, validFrom, validTo (formát 2026-01-01T00:00:00.000+0000), valid, autoProlong a documentUsage: maxDocuments, usedDocuments, remainingDocuments (-1 = neobmedzene), usagePercentage (null pri neobmedzenej), limitExceeded, sentDocuments, receivedDocuments, periodStart, periodEnd.404 (prázdne telo) — tenant nemá aktívnu licenciu; licencia po platnosti vráti 200 s valid: false401
Autentifikácia podľa SAPI-SK v1.0. APEX žiadosť prepošle do ASOL IAM (OAuth 2.0 client_credentials) a k IAM access tokenu
pridá vlastný refresh token (30 dní, rotácia pri každom použití), takže klient nemusí pri každom obnovení posielať
client_secret. Access token zo SAPI platí aj pre APEX API (/api/**) a naopak.
Polia týchto endpointov sú v snake_case; /token, /renew a /revoke sú verejné (bez Bearer tokenu).
client_id + client_secret za access token (JWT RS256 z ASOL IAM) a refresh token APEX.Content-Type: application/json; application/x-www-form-urlencoded vráti 415). APEX prepošle údaje do IAM a vráti jeho access token spolu s novým refresh tokenom. Platnosť access tokenu udáva pole expires_in./renewscope je voliteľný a prepošle sa do IAM; o prístupe k dokumentom a participantom rozhoduje tenant, ku ktorému sú údaje klienta viazané.400/401 SAPI-AUTH-001 — IAM odmietol údaje (stav vracia IAM)400 — nečitateľné JSON telo (Problem Details)415 — iný Content-Type ako JSON500 SAPI-AUTH-999 — IAM nedostupný alebo interná chyba; zopakujte neskôrclient_credentialsAuthorization: BearerBearernullAuthorization: platnosť, zostávajúci čas a odporúčanie obnoviť.X-Peppol-Participant-Id nie je potrebná). should_refresh je true, keď do vypršania zostávajú menej ako 3 minúty.expires_in401 SAPI-AUTH-002 — token chýba, je neplatný alebo vypršal200 vždy trueaccesssub; pri klientskom tokene UUID)/token.401 SAPI-AUTH-006 a z bezpečnostných dôvodov zneplatní všetky refresh tokeny daného klienta (už vydané access tokeny dobehnú do svojej expirácie). Klient sa potom musí prihlásiť cez /token. Pri viacerých inštanciách klienta preto refresh token zdieľajte, alebo každá inštancia nech má vlastný.401 SAPI-AUTH-007 — refresh token je neplatný, poškodený alebo vypršal401 SAPI-AUTH-006 — refresh token už bol použitý alebo zneplatnenýSAPI-AUTH-001 — IAM odmietol uložené údaje klienta (napr. zmenené client_secret)500 SAPI-AUTH-999 — interná chyba alebo IAM nedostupný/token — nová dvojica tokenovclient_id/client_secret./renew s ním vráti 401. Opakované zneplatnenie už neplatného tokenu vráti tiež 200 ("Token was already invalid or expired"). Iný token APEX prepošle na revokáciu do IAM.client_secret.SAPI-AUTH-001 — IAM odmietol revokáciu iného tokenu500 SAPI-AUTH-999 — IAM nedostupnýrefresh_token200 vždy trueRefresh token revoked successfully
Tri operácie podľa SAPI-SK v1.0: odoslať, prijať, potvrdiť. Každý request nesie hlavičku
X-Peppol-Participant-Id (organizačný kontext — participant vášho tenanta; krátky aj kanonický tvar).
Polia dokumentových endpointov sú v camelCase; neznáme polia sa ticho ignorujú, preto dodržte presné názvy.
200 ACCEPTED = prevzatie do úschovy, 4xx/5xx REJECTED = nič sa nezaradilo.ACCEPTEDmetadata, payload, payloadFormat (len XML), payloadEncoding (len UTF-8), voliteľný checksum.metadata.senderParticipantId patria vášmu tenantovi a sú totožné; tenant má platnú licenciu.documentTypeId.documentTypeId + processId cez AS4.providerDocumentId — je to UUID dokumentu v APEX, takže s tým istým tokenom môžete sledovať doručenie cez GET /api/v1/documents/{providerDocumentId}/status, /events alebo webhooky.Idempotency-Key, povinná)ACCEPTED (rovnaké providerDocumentId a receivedAt), nič sa nezaradí druhýkrát. Iný request → 409 IDEMPOTENCY_CONFLICT. Prvý request ešte beží → 409 IDEMPOTENCY_IN_PROGRESS (opakujte s tým istým kľúčom). Odmietnutý request kľúč nespotrebuje. Po 24 h sa kľúč správa ako nový — neopakujte teda staré requesty po dni.error.retryable je true (409 IDEMPOTENCY_IN_PROGRESS, 503, 500, 429), s exponenciálnym odstupom a tým istým Idempotency-Key. Pri kontakte s podporou uveďte error.correlation_id.metadata.senderParticipantId0245:1234567890 alebo kanonický tvar)XMLUTF-8 (predvolené)payload, hex (64 znakov)ACCEPTED — prevzatie, nie doručenieREJECTEDcategory, code, message, details[], retryable, correlation_id| HTTP | errorCode | error.code | retryable | Príčina |
|---|---|---|---|---|
| 400 | INVALID_REQUEST | SAPI-VAL-001 | nie | chýba/prázdna hlavička Idempotency-Key (alebo > 200 znakov) či X-Peppol-Participant-Id; telo nie je platný JSON; neplatné creationDateTime |
| 400 | INVALID_METADATA | SAPI-VAL-001 | nie | chýba metadata alebo niektorý z identifikátorov, prípadne obsahuje riadiace znaky |
| 400 | PAYLOAD_MISSING | SAPI-VAL-001 | nie | chýba payload (napr. telo podľa špecifikácie document{content}) |
| 400 | INVALID_DOCUMENT_FORMAT | SAPI-VAL-001 | nie | payloadFormat nie je XML, payloadEncoding nie je UTF-8, nesedí checksum |
| 400 | INVALID_DOCUMENT_FORMAT | SAPI-VAL-002 | nie | payload nie je well-formed XML |
| 400 | UNSUPPORTED_DOCUMENT_TYPE | SAPI-VAL-002 | nie | pre documentTypeId neexistujú validačné pravidlá |
| 400 | DOCUMENT_VALIDATION_FAILED | SAPI-VAL-002 | nie | chyby XSD, Schematron, biznis pravidiel alebo strán; zoznam v error.details[] (field = umiestnenie, issue = popis, value = kód pravidla) |
| 400 | RECEIVER_NOT_FOUND | SAPI-VAL-021 | nie | príjemca nie je v Peppol (v sandboxe nie je sandbox participantom) |
| 400 | UNSUPPORTED_DOCUMENT_TYPE | SAPI-VAL-021 | nie | príjemca neponúka typ dokumentu a proces cez AS4 |
| 403 | AUTHORIZATION_FAILED | SAPI-AUTH-007 | nie | participant z hlavičky alebo odosielateľ nepatrí vášmu tenantovi, alebo sa navzájom líšia |
| 403 | AUTHORIZATION_FAILED | SAPI-AUTH-008 | nie | tenant nemá platnú licenciu |
| 409 | IDEMPOTENCY_CONFLICT | SAPI-VAL-010 | nie | kľúč použitý pre iný request — použite nový kľúč |
| 409 | IDEMPOTENCY_IN_PROGRESS | SAPI-VAL-010 | áno | request s rovnakým kľúčom sa práve spracúva |
| 503 | SERVICE_UNAVAILABLE | SAPI-PROC-002 | áno | dočasne nedostupné SML/SMP, validácia alebo úložisko |
| 500 | PROCESSING_ERROR | SAPI-PROC-001 | áno | neočakávaná chyba |
/sapi/v1/document/send (špecifikácia: /sapi/v1/documents), identifikátor providerDocumentId (špecifikácia: apDocumentId), dokument v plochých poliach payload, payloadFormat, payloadEncoding (špecifikácia: document{content, format, encoding} — také telo skončí PAYLOAD_MISSING), navyše povinné hlavičky X-Peppol-Participant-Id a Idempotency-Key a kontroly 3–5 nad rámec minima špecifikácie. Odpovede 401 a 429 majú iba obálku error (bez status); 415, 405 a 406 majú formát Problem Details (RFC 9457) — rozhodujte podľa HTTP kódu.pageToken. Hodnotu nextPageToken z odpovede pošlite ako query parameter pageToken ďalšieho volania; nextPageToken: null = posledná stránka. Kurzor je nepriehľadný reťazec — neparsujte ho ani neskladajte. Pre všetky stránky jedného prechodu zachovajte status, limit a hlavičku. Parameter nextPageToken sa prijme ako alias pageToken (ak pošlete oba, musia byť rovnaké).status=RECEIVED400 SAPI-VAL-001 — neplatný pageToken, rozdielne pageToken/nextPageToken, záporný limit400 (Problem Details) — chýba hlavička alebo limit nie je číslo401 SAPI-AUTH-002, 403 SAPI-AUTH-007 — participant nepatrí vášmu tenantovi429 SAPI-RATE-001nextPageToken predchádzajúcej odpovedeRECEIVED alebo ACKNOWLEDGEDiso6523-actorid-upis::…nullStandardBusinessDocument (SBDH obálka s biznis dokumentom) ako XML reťazec.payload je StandardBusinessDocument tak, ako prišiel sieťou Peppol, znovu serializovaný — prefixy menných priestorov a formátovanie sa môžu líšiť od originálu. Biznis dokument nájdite podľa menného priestoru, parsujte s ohľadom na menné priestory a nevalidujte koreň priamo voči UBL XSD. Stiahnutie stav nemení.404 (prázdne telo) — ID nie je UUID alebo dokument neexistuje403 SAPI-AUTH-009 — dokument nie je adresovaný participantovi z hlavičky400 SAPI-DOC-002 — nejde o prijatý dokument vášho tenanta401 SAPI-AUTH-002, 429 SAPI-RATE-001documentId, documentTypeId, processId, senderParticipantId, receiverParticipantId, creationDateTime)StandardBusinessDocument ako UTF-8 XML reťazecXMLACKNOWLEDGED. Idempotentné.status=RECEIVED200 s pôvodným časom potvrdenia404 (prázdne telo) — dokument neexistuje alebo nie je váš403 SAPI-AUTH-009 — dokument nie je adresovaný participantovi z hlavičky409 SAPI-DOC-002 — ide o odoslaný, nie prijatý dokumentdocumentId zo zoznamu (path); telo sa neposielaACKNOWLEDGED/api/v1, /api/v2) je plné REST API: odosielanie (aj hromadné), príjem, validácia, precheck, stav, udalosti, odpovede (MLR/IMR/MLS), webhooky a MQTT, vyhľadanie participantov, štatistiky a licencia. Token z ASOL IAM (client_credentials)./sapi/v1) je zjednodušené rozhranie podľa slovenskej špecifikácie SAPI-SK v1.0: odoslať, prijať, potvrdiť. Odosielanie je tiež asynchrónne — ACCEPTED znamená prevzatie, nie doručenie — ale všetky kontroly (dokument, príjemca v Peppol) prebehnú synchrónne v rámci requestu. Vlastné auth endpointy s refresh tokenom; ten istý access token funguje aj na APEX API./api/v1/documents/{id}/status alebo webhooky.<ICD>:<hodnota> (napr. 0245:2024000001) a kanonický tvar iso6523-actorid-upis::0245:2024000001 sú v requestoch zameniteľné. Odpovede v1 inboxu a notifikácie používajú kanonický tvar, v2 inbox a lookup krátky.0245 (SK:DIČ) — DIČ má 10 číslic bez prefixu SK. Ďalšie bežné schémy: 9950 SK IČ DPH, 9929 CZ VAT, 9914 AT VAT, 9919 AT register, 9930 DE VAT, 9910 HU VAT, 0088 GLN, 0007 SE org. číslo, 0200 LT kód./participants/lookup/ico ho cez Register účtovných závierok preloží na DIČ.QUEUED → PROCESSING → DELIVERED (→ prípadne FAILED po negatívnom MLS)PROCESSING → RETRYING → PROCESSING → … → DELIVERED alebo DEAD_LETTERSENT je v číselníku, pri odosielaní sa však nepoužíva.DELIVERED znamená doručenie do prístupového bodu príjemcu (Peppol corner 3), nie spracovanie v jeho ERP — to signalizujú až aplikačné odpovede (IMR) a MLS.VALIDATED (validácia prešla, čaká na stiahnutie, notifikácia DOCUMENTS_RECEIVED) → ACKNOWLEDGED (váš systém potvrdil). REJECTED = dokument neprešiel validáciou (je v zozname, notifikácia nepríde), FAILED = chyba spracovania. RECEIVED je len vnútorný medzistav počas príjmu.RECEIVED (prijaté a zvalidované, čaká na potvrdenie) → ACKNOWLEDGED; zamietnuté dokumenty SAPI nezobrazuje. Potvrdenie je spoločné pre APEX API aj SAPI.PEPPOL-EN16931-R*)documentTypeId a cbc:CustomizationID: Peppol BIS Billing 3.0 (faktúra, dobropis, samofakturácia), národné varianty PINT, nemecká XRechnung, objednávky (Order, Order Response) a ďalšie Peppol BIS dokumenty. Pri viacerých verziách tej istej sady sa použije najvyššia. Rovnaká validácia beží v /validate, /precheck, /send, dávkach aj SAPI.urn:peppol:edec:mls) — technický stav správy, ktorý posiela prijímajúci prístupový bod odosielajúcemu. APEX pri odosielaní žiada MLS pre každý dokument; pozitívny (AP/AB) → notifikácia MLS_RECEIVED, negatívny (RE) → dokument prejde na FAILED a príde MLS_RECEIVED_NEGATIVE. Príjem MLS je v sieti Peppol povinný od 28. 2. 2027 a odosielanie od 31. 3. 2027 — dovtedy ho niektoré prístupové body ešte nevracajú, chýbajúci MLS teda nie je chyba.GET /api/v1/documents/{id}/responses.ublDocument, SAPI payload) je celý StandardBusinessDocument — obálka SBDH (http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader) s UBL dokumentom vnútri, presne ako prišiel sieťou. Biznis dokument hľadajte podľa menného priestoru (napr. urn:oasis:names:specification:ubl:schema:xsd:Invoice-2), nie ako koreň.cac:, cbc: ani iné prefixy sa nemusia zhodovať medzi verziami ani v rámci jedného dokumentu — používajte namespace-aware parser (XPath s registrovanými menými priestormi, JAXB, XmlReader s NamespaceURI…).POST /api/v1/documents/send — hlavička Idempotency-Key voliteľná; kľúč platí 24 h; porovnáva sa obsah (dokument a smerovacie metadáta).POST /api/v1/batches — voliteľná, odporúčaná; kľúč neexpiruje; porovnávajú sa bajty tela (SHA-256).POST /sapi/v1/document/send — povinná; kľúč platí 24 h; porovnáva sa payload a metadáta (odosielateľ, príjemca, typ, proces).409 IDEMPOTENCY_CONFLICT; súbežne bežiaci request s rovnakým kľúčom → 409 IDEMPOTENCY_IN_PROGRESS (zopakujte neskôr). Odmietnutý request kľúč nespotrebuje. Pri timeoute vždy opakujte s tým istým kľúčom.RETRYING a worker ho skúsi znova. Dokument má 5 pokusov; po 1. až 4. zlyhaní príde ďalší pokus o 30, 60, 120 a 240 s, piate zlyhanie znamená DEAD_LETTER — celkovo zhruba 7,5 minúty plus čas prenosov (AS4 timeout je 120 s). Trvalé chyby (napr. certifikát príjemcu nevydaný CA OpenPeppol) idú do DEAD_LETTER hneď. Každý pokus vytvorí udalosti QUEUE_PROCESSING_STARTED a pri zlyhaní QUEUE_PROCESSING_FAILED (Attempt n/5 failed, retry in …s: <príčina>). Dokument v DEAD_LETTER vyžaduje zásah — kontaktujte podporu s documentId; po náprave ho môže zaradiť znova (udalosť QUEUE_MANUAL_REQUEUE, bez notifikácie)./api/v1, /api/v2). Publikovaná verzia sa nikdy nemení spätne nekompatibilne — nový formát vzniká pod novou verziou a predchádzajúca funguje ďalej. Dnes má verziu v2 len príjem (GET /api/v2/documents/inbox a detail) — líši sa iba krátkym tvarom identifikátorov. Všetky ostatné endpointy sú len vo v1. Klienti majú ignorovať neznáme polia v odpovediach a neznáme hodnoty eventType.| Dokument | documentTypeId | processId |
|---|---|---|
| Faktúra (BIS Billing 3.0) | 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 | urn:fdc:peppol.eu:2017:poacc:billing:01:1.0 |
| Dobropis (BIS Billing 3.0) | urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1 | urn:fdc:peppol.eu:2017:poacc:billing:01:1.0 |
| Samofaktúra (Self-billing 3.0) | urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:selfbilling:3.0::2.1 | urn:fdc:peppol.eu:2017:poacc:selfbilling:01:1.0 |
| Objednávka (BIS Order Only 3) | urn:oasis:names:specification:ubl:schema:xsd:Order-2::Order##urn:fdc:peppol.eu:poacc:trns:order:3::2.1 | urn:fdc:peppol.eu:poacc:bis:order_only:3 |
| Odpoveď na objednávku (BIS Ordering 3) | urn:oasis:names:specification:ubl:schema:xsd:OrderResponse-2::OrderResponse##urn:fdc:peppol.eu:poacc:trns:order_response:3::2.1 | urn:fdc:peppol.eu:poacc:bis:ordering:3 |
| Odpoveď na faktúru (IMR, Invoice Response 3) | urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:fdc:peppol.eu:poacc:trns:invoice_response:3::2.1 | urn:fdc:peppol.eu:poacc:bis:invoice_response:3 |
| MLR (Message Level Response 3) | urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:fdc:peppol.eu:poacc:trns:mlr:3::2.1 | urn:fdc:peppol.eu:poacc:bis:mlr:3 |
| MLS (Message Level Status) — posiela APEX | urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:peppol:edec:mls:1.0::2.1 | urn:peppol:edec:mls |
Všetky endpointy okrem /sapi/v1/auth/token, /renew a /revoke vyžadujú hlavičku
Authorization: Bearer <access_token>. Access token je JWT podpísaný (RS256) serverom ASOL IAM a získate ho
grantom client_credentials (server-to-server, bez prihlásenia používateľa) — priamo z IAM, alebo cez SAPI endpoint,
ktorý navyše vydá refresh token. Výsledný token je ten istý a platí pre APEX API aj SAPI.
| A) Priamo z ASOL IAM | B) Cez SAPI | |
|---|---|---|
| Endpoint | POST https://iam.qasida.sk/oauth2/token | POST /sapi/v1/auth/token |
| Formát | application/x-www-form-urlencoded | application/json |
| Access token | JWT, platnosť podľa expires_in | ten istý JWT z IAM |
| Refresh token | nie — nový token vždy cez client_credentials | áno, 30 dní, rotácia cez /sapi/v1/auth/renew |
| Odporúčané pre | APEX API, Swagger UI (Authorize) | SAPI integrácie podľa SAPI-SK v1.0 |
client_credentials z IAM alebo /sapi/v1/auth/token
Authorization: Bearer <token> v každom requeste
pred vypršaním nový client_credentials alebo /renew
/sapi/v1/auth/revoke pre refresh token
clientId, clientSecret) sú viazané na jednu organizáciu (tenanta) v APEX — token určuje, ku ktorým dokumentom a participantom máte prístup. Access token obnovujte s rezervou (napr. 1–3 min pred expires_in), jeden token používajte pre všetky requesty počas jeho platnosti a pri 401 si vyžiadajte nový. APEX overuje token lokálne (podpis a platnosť), revokácia access tokenu ho preto pred vypršaním nezruší. Parameter scope nie je potrebný — prístup určuje tenant.POST https://iam.qasida.sk/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id=your-client-id
&client_secret=your-client-secret
HTTP/1.1 200 OK
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 900
}
POST /sapi/v1/auth/token
Content-Type: application/json
{
"client_id": "your-client-id",
"client_secret": "your-client-secret",
"grant_type": "client_credentials"
}
HTTP/1.1 200 OK
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 900,
"scope": null,
"refresh_token": "eyJhbGciOiJIUzI1NiJ9..."
}
POST /sapi/v1/auth/renew
Content-Type: application/json
{ "refresh_token": "eyJhbGciOiJIUzI1NiJ9..." }
GET /api/v2/documents/inbox?status=VALIDATED Authorization: Bearer eyJhbGciOiJSUzI1NiIs... Accept: application/json
Ako vyzerajú chybové odpovede, ktoré chyby má zmysel opakovať, aké limity platia a na čo si dať pozor pri návrhu klienta. Rozhodujte vždy podľa HTTP kódu a strojového kódu chyby, nie podľa textu správy.
/api/**timestamp, status, error, message a spravidla path. Strojový code majú dávky a idempotencia (INVALID_IDEMPOTENCY_KEY, IDEMPOTENCY_CONFLICT, IDEMPOTENCY_IN_PROGRESS, BATCH_*, PARTICIPANT_NOT_AUTHORIZED, LICENCE_INVALID, TOO_MANY_OPEN_BATCHES); pri ostatných chybách je message len informatívny text. /documents/send pri zlyhanej validácii vracia error: "Validation Error" s validationErrors[] a validationWarnings[] (code, message, location). Chyby frameworku (nečitateľný JSON, zlý typ parametra, chýbajúci parameter, 405/415) majú formát Problem Details (type, title, status, detail, instance). 404 pre neexistujúci alebo cudzí zdroj má prázdne telo. timestamp je bez časovej zóny (UTC).{
"timestamp": "2026-10-09T10:15:00.123",
"status": 409,
"error": "Conflict",
"code": "IDEMPOTENCY_CONFLICT",
"message": "Idempotency-Key 'FA2026-0001' was already used for a different request (document or routing metadata)",
"path": "/api/v1/documents/send"
}
{
"timestamp": "2026-10-09T19:31:24.544",
"status": 401,
"error": "Unauthorized",
"message": "Missing or malformed Authorization: Bearer header",
"path": "/api/v1/documents/send"
}
/sapi/**error: category (AUTH, VALIDATION, PROCESSING, TEMPORARY), code (SAPI-…), message, details[] (alebo null), retryable a correlation_id (uveďte ho podpore). Odmietnutie odoslania ho obaľuje do status: REJECTED s errorCode. Odpovede 415, 405, 406 a chýbajúca hlavička pri príjme majú formát Problem Details (RFC 9457); 404 pri detaile a potvrdení má prázdne telo.{
"error": {
"category": "AUTH",
"code": "SAPI-AUTH-002",
"message": "Access token is invalid or has expired",
"details": null,
"retryable": false,
"correlation_id": "c3d4e5f6-a7b8-9012-cdef-345678901234"
}
}
| HTTP | Význam | Čo urobiť |
|---|---|---|
| 200 / 201 / 202 / 204 | Úspech; 202 = prevzaté na asynchrónne spracovanie | Pri 202 sledujte stav (/status, notifikácie) |
| 400 | Neplatný request alebo dokument. Špeciálny prípad: Invalid UUID string: anonymousUser znamená token bez tenanta (napr. token používateľa namiesto integračného klienta) | Opravte request; neopakujte bez zmeny |
| 401 | Chýbajúci, neplatný alebo expirovaný token (hlavička musí začínať presne Bearer ) | Získajte nový token a request zopakujte raz |
| 403 | Participant nepatrí vášmu tenantovi, neplatná licencia, tenant z tokenu nie je v APEX založený (Authenticated tenant not found) | Skontrolujte Peppol ID, licenciu (/api/v1/licenses/info) a prístupové údaje |
| 404 | Zdroj neexistuje alebo patrí inému tenantovi (zámerne nerozlíšené) | Skontrolujte ID a prostredie |
| 409 | Konflikt idempotencie, stav neumožňuje operáciu | IDEMPOTENCY_IN_PROGRESS zopakujte neskôr; ostatné riešte |
| 413 | Príliš veľká dávka | Rozdeľte dávku |
| 415 | Nesprávny Content-Type | Posielajte application/json (ZIP dávka application/zip) |
| 429 | Prekročený rate limit alebo kapacita príjmu dávok | Počkajte podľa Retry-After, potom exponenciálny odstup |
| 500 / 503 | Neočakávaná alebo dočasná chyba | Opakujte s exponenciálnym odstupom a tým istým Idempotency-Key |
| Endpointy | Limit |
|---|---|
| POST /sapi/v1/document/send | 100 requestov / min / IP (vlastný limit) |
| všetky ostatné /api/** a /sapi/** (vrátane /sapi/v1/auth/*) | 200 requestov / min / IP (spoločný limit) |
X-RateLimit-Limit a X-RateLimit-Remaining; pri 429 aj Retry-After (sekundy do ďalšieho voľného requestu). Rate limit sa vyhodnocuje pred autentifikáciou, takže sa počítajú aj neúspešné requesty. Hromadné odosielanie má navyše vlastné limity (3 otvorené dávky, BATCH_INTAKE_BUSY).HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
Retry-After: 1
{
"error": {
"category": "TEMPORARY",
"code": "SAPI-RATE-001",
"message": "Rate limit exceeded. Maximum 100 requests per minute per IP address.",
"retryable": true,
"correlation_id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890"
}
}
/api/** má telo 429 tvar chyby APEX API: {"timestamp", "status": 429, "error": "Too Many Requests", "message", "path"}. Limity sa uplatňujú pre každú inštanciu služby samostatne — berte ich ako horný orientačný limit, nie ako garantovanú kapacitu.429, 500, 503 a timeoute opakujte s exponenciálnym odstupom (napr. 2, 4, 8, 16 s + náhodný jitter). Odosielacie requesty posielajte vždy s Idempotency-Key a pri opakovaní s tým istým kľúčom — tak faktúru nikdy neodošlete dvakrát.eventType či stavov — API sa rozširuje spätne kompatibilne. Časy parsujte ako ISO 8601 s posunom a porovnávajte okamihy, nie reťazce (počet desatinných miest sa líši). XML payload parsujte s ohľadom na menné priestory.clientSecret, refresh token a MQTT heslo ukladajte v trezore tajomstiev, nie v kóde ani logoch. Webhooky nie sú podpísané — overujte ich tajomstvom v customHeaders a obsah si vždy načítajte z API podľa documentId. Notifikácie berte ako signál, nie ako zdroj pravdy.
Konkrétne requesty a odpovede pre kľúčové scenáre. $APEX je základná URL prostredia
(napr. https://api.sandbox.apex.qasida.sk), $TOKEN access token.
XML dokumenty sú v príkladoch skrátené.
curl -X POST "$APEX/api/v1/documents/send" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: FA2026-0001" \
-d @faktura.json
{
"senderParticipantId": "0245:2024000001",
"receiverParticipantId": "0245:1234567890",
"documentTypeId": "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": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"ublDocument": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" ...>...</Invoice>"
}
{
"documentId": "550e8400-e29b-41d4-a716-446655440000",
"status": "QUEUED",
"submittedAt": "2026-10-09T10:30:00"
}
{
"timestamp": "2026-10-09T10:30:00",
"status": 400,
"error": "Validation Error",
"message": "Document validation failed: 1 error(s)",
"validationErrors": [
{
"code": "BR-02",
"message": "An Invoice shall have an Invoice number (BT-1).",
"location": "/Invoice/cbc:ID"
}
],
"validationWarnings": []
}
{
"networkReady": true,
"valid": true,
"participantExists": true,
"canSend": true,
"errors": [],
"warnings": [
{
"category": "ROUTING",
"code": "CERT_EXPIRING_SOON",
"message": "Recipient AP certificate expires in 18 days (2026-10-27). Sending is still possible.",
"location": null
}
],
"checkedAt": "2026-10-09T11:00:00+02:00"
}
{
"networkReady": false,
"valid": true,
"participantExists": false,
"canSend": false,
"errors": [
{
"category": "PARTICIPANT",
"code": "PARTICIPANT_NOT_FOUND",
"message": "Participant '0245:9999999999' was not found in the Peppol network.",
"location": null
}
],
"warnings": [],
"checkedAt": "2026-10-09T11:00:00+02:00"
}
{
"source": "SMP",
"participantId": "iso6523-actorid-upis::0245:2024000001",
"peppolId": "0245:2024000001",
"organizationName": null,
"countryCode": "SK",
"endpointUrl": "https://ap.partner.example.com/as4/receive",
"smpUrl": "https://smp.partner.example.com/",
"enabled": true,
"certificate": {
"subject": "CN=PSK000202,OU=PEPPOL PRODUCTION AP,O=Partner SK s.r.o.,C=SK",
"issuer": "CN=PEPPOL ACCESS POINT CA - G2,O=OpenPEPPOL AISBL,C=BE",
"serial": "7f3a1b2c9d0e4f56",
"fingerprint": "FF:EE:DD:CC:...:00",
"notBefore": "2025-03-01T00:00:00Z",
"notAfter": "2027-03-01T23:59:59Z",
"expired": false,
"valid": true,
"invalidReason": null
},
"smpMetadataUpdatedAt": "2026-10-09T10:15:30Z"
}
[
{
"id": "d3a1e2f0-11aa-42bb-9c3d-000000000003",
"messageId": "550e8400-e29b-41d4-a716-446655440000",
"eventType": "MESSAGE_QUEUED",
"eventCode": null,
"eventMessage": "Document queued for async AS4 sending to https://receiver.example.com/as4",
"technicalDetails": null,
"stacktrace": null,
"createdAt": "2026-10-09T10:30:01+02:00"
},
{
"id": "d3a1e2f0-11aa-42bb-9c3d-000000000004",
"messageId": "550e8400-e29b-41d4-a716-446655440000",
"eventType": "QUEUE_PROCESSING_FAILED",
"eventCode": null,
"eventMessage": "Attempt 1/5 failed, retry in 30s: AS4 send returned failure",
"technicalDetails": null,
"stacktrace": null,
"createdAt": "2026-10-09T10:30:04+02:00"
},
{
"id": "d3a1e2f0-11aa-42bb-9c3d-000000000006",
"messageId": "550e8400-e29b-41d4-a716-446655440000",
"eventType": "MESSAGE_DELIVERED",
"eventCode": null,
"eventMessage": "Message delivered successfully",
"technicalDetails": null,
"stacktrace": null,
"createdAt": "2026-10-09T10:30:40+02:00"
}
]
{
"name": "ERP Invoice Inbox",
"description": "Notifikácie o nových faktúrach",
"url": "https://erp.example.com/webhooks/peppol",
"active": true,
"documentTypeFilters": [
"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"
],
"senderParticipantFilters": [],
"customHeaders": { "X-Webhook-Secret": "zdielane-tajomstvo" }
}
POST https://erp.example.com/webhooks/peppol
Content-Type: application/json
User-Agent: Apex-Webhook/1.0
X-Webhook-Secret: zdielane-tajomstvo
{
"eventType": "DOCUMENTS_RECEIVED",
"subscriptionId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"documentId": "550e8400-e29b-41d4-a716-446655440001",
"documentIds": ["550e8400-e29b-41d4-a716-446655440001"],
"receivedCount": 1,
"direction": "IN",
"status": "VALIDATED",
"messageId": "c3a1e7f2-5b9d-4d2e-8f41-2a6b9e0d7c15@sender-ap.example.com",
"senderParticipantId": "iso6523-actorid-upis::0245:1234567890",
"receiverParticipantId": "iso6523-actorid-upis::0245:2024000001",
"documentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##...::2.1",
"processId": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"eventMessage": "Incoming Peppol document received",
"notifiedAt": 1791282005.123456000
}
{
"documentId": "550e8400-e29b-41d4-a716-446655440001",
"senderParticipantId": "0245:1234567890",
"receiverParticipantId": "0245:2024000001",
"documentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##...::2.1",
"processId": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"receivedAt": "2026-10-09T09:15:00",
"status": "VALIDATED",
"ublDocument": "<StandardBusinessDocument xmlns=\"http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader\"><StandardBusinessDocumentHeader>...</StandardBusinessDocumentHeader><Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\">...</Invoice></StandardBusinessDocument>"
}
curl -X POST "$APEX/api/v1/documents/inbox/550e8400-e29b-41d4-a716-446655440001/acknowledged" \ -H "Authorization: Bearer $TOKEN" HTTP/1.1 204 No Content
curl -X POST "$APEX/api/v1/batches" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ERP-run-2026-10-09-17" \
-H "Expect: 100-continue" \
--data-binary @davka.json
{
"clientReference": "ERP-run-2026-10-09-17",
"notify": "BATCH",
"documents": [
{
"clientReference": "FA2026-0001",
"senderParticipantId": "0245:2024000001",
"receiverParticipantId": "0245:1234567890",
"documentTypeId": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##...::2.1",
"processId": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"ublDocument": "<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\">...</Invoice>"
}
]
}
{
"batchId": "6f1c2a9e-0b7d-4f3a-9c55-2b8e1f0d4a11",
"clientReference": "ERP-run-2026-10-09-17",
"status": "RECEIVED",
"itemCount": 1000,
"receivedAt": "2026-10-09T10:15:00Z"
}
{
"eventType": "BATCH_PROCESSED",
"subscriptionId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"eventMessage": "Batch processed: 990 accepted, 10 rejected, 0 cancelled",
"notifiedAt": 1791281700.482913000,
"batch": {
"batchId": "6f1c2a9e-0b7d-4f3a-9c55-2b8e1f0d4a11",
"clientReference": "ERP-run-2026-10-09-17",
"status": "PROCESSED",
"itemCount": 1000,
"accepted": 990,
"rejected": 10,
"cancelled": 0
}
}
POST /sapi/v1/document/send
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json
Idempotency-Key: 3f6c1d2e-8a4b-4c5d-9e0f-112233445566
X-Peppol-Participant-Id: 0245:2024000001
{
"metadata": {
"documentId": "FA2026-0001",
"documentTypeId": "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": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"senderParticipantId": "0245:2024000001",
"receiverParticipantId": "0245:1234567890",
"creationDateTime": "2026-10-09T10:30:00Z"
},
"payload": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" ...>...</Invoice>",
"payloadFormat": "XML",
"payloadEncoding": "UTF-8",
"checksum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
{
"providerDocumentId": "7c9d0e1f-2a3b-4c5d-8e6f-0a1b2c3d4e5f",
"status": "ACCEPTED",
"receivedAt": "2026-10-09T08:30:05.123456Z",
"timestamp": "2026-10-09T08:30:05.130Z"
}
{
"status": "REJECTED",
"timestamp": "2026-10-09T08:30:05Z",
"errorCode": "RECEIVER_NOT_FOUND",
"errorMessage": "The receiver is not registered in the Peppol network for this document type (The SML has no SMP address for the participant)",
"error": {
"category": "VALIDATION",
"code": "SAPI-VAL-021",
"message": "The receiver is not registered in the Peppol network for this document type (The SML has no SMP address for the participant)",
"details": null,
"retryable": false,
"correlation_id": "e5f6a7b8-c9d0-1234-ef01-567890123456"
}
}