Bevezetés
A Verteco API REST alapú, HTTPS felett. A kérés és a válasz egyaránt JSON (UTF-8). Kezdje egy fiók, majd egy API-token létrehozásával, és egy percen belül elküldheti az első hívást. Minden útvonal az alábbi alap-URL-hez (base URL) képest értendő.
A teljes tesztkörnyezet (sandbox) a következő címen érhető el: test.peppol.verteco.digital. Ugyanúgy viselkedik, mint az éles környezet, és ezen felül teszteszközöket (a Szlovák Köztársaság Pénzügyi Igazgatóságának (Finančná správa, FS) webhookja, ellenőrző token (Verifikačný údaj), cég eltávolítása) és egy szimulált szolgáltatóválasztást kínál az FS portál (VPDS) helyett.
- Alap-URL (base URL)
https://peppol.verteco.digital/api/v1- Verzió
- v1 (az útvonalban). A visszafelé nem kompatibilis változások új verzió alatt jelennek meg.
- Protokoll
- csak HTTPS · TLS 1.2+ · TLS A+
- Formátum
- application/json (UTF-8)
- Hitelesítés
- cookie alapú munkamenet (portál) vagy Bearer token (szerver-szerver)
- Időbélyegek
- ISO-8601 (UTC), pl. 2026-06-03T09:40:27Z
Tanúsított Access Point
Valódi Peppol hozzáférési pont (Access Point, Seat ID PSK001128), nem viszonteladó. Sikeresen teljesítettük az OpenPeppol megfelelőségi tesztjét (19/19), és éles üzemben vagyunk.
Érvényes bizonylatok
Szerveroldali EN 16931 + Peppol BIS 3.0 Schematron-validáció minden fogadott ÉS küldött bizonylaton. A bizonylatot előzetesen is ellenőrizheti: a nyilvános validátor a /validator címen fut (API-ként: POST /api/v1/public/peppol-validate); a hibákat a konkrét szabállyal együtt adjuk vissza (pl. BR-CO-15).
Több cég egy fiókban (multi-tenant)
Egy fiók és egy token N céghez, ideális SaaS-, ERP-rendszerek és könyvelők számára.
SK TDD automatikusan
Az adóhatósági jelentést (corner-5 / TDD) az Ön nevében állítjuk elő és küldjük el a Pénzügyi Igazgatóságnak (FS).
openapi-generator eszközzel. A portál API-t és a SAPI-SK-t is lefedi.Gyors kezdés
A fiókot és az API-tokent is a portálon (böngészőben) hozza létre. Az integráció ezután kizárólag az API-tokenen keresztül működik. Az alkalmazásának nem kell regisztrációt, bejelentkezést vagy jelszavakat kezelnie.
- 1
Hozzon létre fiókot a portálon
Regisztráljon az e-mail-címével, és erősítse meg az e-mailben kapott hivatkozással. - 2
Generáljon API-tokent
A portálon nyissa meg az API tokeny → Vytvoriť (API-tokenek → Létrehozás) menüpontot. Avpt_…token csak egyszer jelenik meg. Tárolja biztonságosan. - 3
Küldje el az első hívást
Használja a tokent azAuthorizationfejlécben:javascriptconst res = await fetch('https://peppol.verteco.digital/api/v1/companies', { headers: { Authorization: 'Bearer vpt_8f2a…' }, }); const companies = await res.json();
Tesztkörnyezet (sandbox)
A SAPI mock sandbox (lásd lent) mellett egy teljes értékű tesztkörnyezetet is üzemeltetünk, e portál teljes másolatát külön adatokkal, ahol a teljes folyamatot (regisztráció → cég → küldés → fogadás → értesítések) végigpróbálhatja az éles környezetre gyakorolt bármilyen hatás nélkül.
- Regisztráció
- nincs megerősítő e-mail; a fiók azonnal használható
- Cég jóváhagyása
- automatikus, közvetlenül a felületen vagy az API-n keresztül; nincs szolgáltatóválasztás a Szlovák Köztársaság Pénzügyi Igazgatóságának (Finančná správa, FS) portálján és nincs eID; közvetlenül egy áfaazonosítóval (IČ DPH) rendelkező cég létrehozása után küldhet és fogadhat is
- Hálózati regisztráció
- automatikus, a Peppol teszthálózatba. Figyeljen az azonosító két rétegére: az API és a portál ugyanazt a formátumot használja, mint az éles környezet (
peppolParticipantId = 0245:<DIČ számjegyei>, ahol a DIČ a szlovák adóazonosító szám; az integrációs kódja nem változik); a teszt SMP/SML-ben a cég technikailag9950:SK<DIČ>formában van regisztrálva, mert a 0245 séma a Pénzügyi Igazgatóság ellenőrző kódját igényli, amely a tesztkörnyezetben nem létezik. Az éles környezetben a0245:<DIČ számjegyei>azonosító csak az eID-vel végzett szolgáltatóválasztás után kerül regisztrálásra az éles Peppol hálózatban - Validáció
- valódi: EN 16931 + Peppol BIS 3.0 szabályok, ugyanúgy, mint az éles környezetben
- Kézbesítés
- szimulált: a bizonylat soha nem hagyja el a tesztszervert; ha a címzett (áfaazonosító) létezik a tesztkörnyezetben, a számla fogadott számlaként kézbesítésre kerül hozzá (e-maillel, PDF-fel és webhookkal együtt)
- Kézbesítési igazolás (MLS)
- szimulált, kifejezetten SANDBOX jelöléssel
- E-mailek
- valóban elküldésre kerülnek (a megadott címekre),
[TEST]előtaggal - Ár
- ingyenes, tesztelési korlátok nélkül
Minden, ami itt működik, ott is működik: a portál, a REST API, a SAPI-SK 1.0, a webshop-bővítmények és a webhookok. Csak váltsa át az integrációjában a domaint a test.peppol.verteco.digital címre, és használja a tesztkörnyezetben létrehozott tokeneket. Ideális integrációfejlesztéshez, CI-tesztekhez és a könyvelők betanításához az éles bevezetés előtt.
Megjegyzés: a tesztdomain peremvédelme (edge) a generikus User-Agent: Python-urllib és User-Agent: Java/1.8.x fejléceket (a Java 8HttpsURLConnection alapértelmezett User-Agentje) HTTP 403 "error code: 1010" válasszal blokkolja, még mielőtt a kérés elérné az API-nkat; az éles peppol.verteco.digital domain átengedi őket. Állítson be saját User-Agentet: Java alatt vagy a -Dhttp.agent=my-app/1.0 JVM-kapcsolóval (kódmódosítás nélkül; a Java hozzáfűzi a "Java/1.8" részt, és az így kapott "my-app/1.0 Java/1.8.0_xxx" átjut, csak a "Java/1.8" kezdetű fejléc van blokkolva), vagy a kapcsolaton a conn.setRequestProperty("User-Agent", "my-app/1.0") hívással. A gyakori kliensek (requests, httpx, Java 11+, Apache HttpClient, okhttp, axios, Go, PHP, curl) változtatás nélkül működnek.
Miért kerülnek a cégek automatikusan jóváhagyásra
A Pénzügyi Igazgatóságnak nincs tesztkörnyezete a VPDS portálhoz: a szolgáltatóválasztás a vpds.financnasprava.sk portálon csak élesben fut, és a slovensko.sk (eID) rendszeren keresztül ellenőrzik, így élesben nem lehet tetszőleges, nem saját céget „kiválasztani”. Hogy az integrációját mégis tesztelhesse, ezt a lépést a tesztkörnyezetben szimuláljuk: minden létrehozott cég automatikusan jóváhagyásra kerül (FS-nél történő választás nélkül), így beállíthat küldőt és címzettet is, és végigmehet a teljes folyamaton.
Az FS webhookok (szolgáltatóválasztás) teszteléséhez saját megfelelőnk van a Pénzügyi Igazgatóság eszközéhez: test.peppol.verteco.digital/sandbox-nastroje. Itt érvényes, FS-stílusú ellenőrző tokent (Verifikačný údaj) generálhat, és teljes webhookot küldhet a saját végpontjára, pontosan úgy, ahogy az FS portál teszi egy valódi választásnál. A teszteléshez létrehozott cégek pedig kiregisztrálhatók (a portálról és a teszt SMP-ből), éppen a Pénzügyi Igazgatóság oldalán hiányzó tesztmód miatt.
Hitelesítés
Az integrációja API-tokennel hitelesít az Authorization: Bearer vpt_… fejlécben. A tokent a portálon hozza létre (API-tokenek); formátuma vpt_ + 40 hexadecimális karakter, mi csak a SHA-256 hash-ét tároljuk, és ugyanolyan hozzáférése van, mint az Ön fiókjának. Tesztelje az /auth/me hívással:
curl https://peppol.verteco.digital/api/v1/auth/me -H 'Authorization: Bearer vpt_8f2a…'
# 200 → { "id": "…", "email": "vy(at)firma.sk" } (token works)Hiányzó vagy érvénytelen token esetén az API a következőt adja vissza:
// 401 Unauthorized
{ "error": "unauthorized", "message": "Authentication required" }portal_session, JWT, 7 nap); szerver-szerver integrációhoz erre nincs szüksége. Hitelesítés nélkül nyilvános a /ping, az /openapi.json és a /public/* alatti végpontok (a peppol-check lekérdezés, a peppol-validate validátor, részletek a Nyilvános eszközök szakaszban, valamint a szolgáltatás állapota a status végponton); minden más munkamenetet vagy Bearer tokent igényel.Konvenciók és formátumok
| Típus | Formátum | Példa |
|---|---|---|
id | UUID (string) | 08dd6c1e-… |
időbélyegek | ISO-8601 Instant (UTC) | 2026-06-03T09:40:27Z |
issueDate | dátum (YYYY-MM-DD) | 2026-06-03 |
totalAmount | decimális szám | 120.00 |
hiányzó értékek | null (nem kihagyott mező) | "dic": null |
Lapozás és idempotencia
/companies és a /companies/{id}/documents támogatja az opcionális ?page&limit paramétereket (a válasz JSON tömb marad; a teljes darabszám az X-Total-Count / X-Total-Pages fejlécekben van). Paraméterek nélkül a teljes tömböt adják vissza, a bizonylatokat createdAt szerint csökkenő sorrendben; a /tokens mindig a teljes tömböt adja vissza. Az Idempotency-Key fejlécet a nemzeti interfész, a SAPI-SK támogatja a POST /sapi/document/send végponton; programozott küldéshez pontosan ezt használja.Hibák
A hibák egységes alakúak, géppel olvasható error kóddal. A validációs hibák egy fields térképet is tartalmaznak (mezőnként az első hiba).
// business error
{ "error": "invalid_credentials", "message": "Invalid email or password" }
// validation error (400); field messages are returned in Slovak ("IČO musí byť 8 číslic" = "IČO must be 8 digits")
{ "error": "validation_failed", "message": "Some fields are invalid",
"fields": { "ico": "IČO musí byť 8 číslic" } }HTTP-státuszok
- 200 / 201 / 204
- siker (OK / Created / No Content)
- 400
- érvénytelen bemenet (lásd error / fields)
- 401
- hiányzó vagy érvénytelen hitelesítés
- 403
- nincs elegendő jogosultság (szerepkör)
- 404
- az erőforrás nem létezik, vagy nincs hozzá hozzáférése
- 405
- a HTTP-metódus nem támogatott ezen az útvonalon
- 409
- ütközés (az IČO / e-mail már létezik)
- 415
- nem támogatott Content-Type (az XML végpontok application/xml-t várnak)
- 429
- kérésszám-korlát (rate limit) túllépve (RateLimit-* és Retry-After fejlécek, JSON törzs: rate_limited)
error mezővel. A JSON törzs nélküli válasz (HTML vagy szöveg, például error code: 1010 403-as státusszal, vagy 502/504 telepítés közben) nem az API-tól, hanem az előtte álló infrastruktúrától érkezett (peremvédelem, gateway). A 403/1010 tipikus oka egy generikus könyvtári User-Agent (Python-urllib, Java/1.8.x a tesztdomainen); a megoldást a Tesztkörnyezet szakasz írja le.Teljes hibakatalógus
| Kód | HTTP | Mikor |
|---|---|---|
validation_failed | 400 | a törzs nem ment át a validáción (lásd fields) |
unauthorized | 401 | hiányzó vagy érvénytelen API-token |
forbidden | 403 | a művelet owner/admin szerepkört igényel |
company_not_found | 404 | a cég nem létezik, vagy Ön nem tagja |
ico_taken | 409 | ezzel az IČO-val (cégjegyzékszám) már létezik cég |
ico_immutable | 400 | az IČO nem módosítható |
company_dic_missing | 400 | küldési ellenőrzés a cég DIČ-je (szlovák adóazonosító szám) nélkül |
token_invalid | 400 | az ellenőrző token (Verifikačný údaj, aláírás) nem egyezik |
document_not_found | 404 | a bizonylat nem létezik |
token_not_found | 404 | az API-token nem létezik / nem az Öné |
rate_limited | 429 | túl sok kérés |
Kérésszám-korlátok (rate limit)
Az API-t kérésszám-korlátozás védi 60 másodperces ablakban (példányonként). A korlátot és a fennmaradó keretet minden válasz fejlécekben adja vissza; túllépés esetén az API 429 Too Many Requests választ ad Retry-After fejléccel.
- Rendes hívások
- dinamikus korlát nagy ráhagyással, API-tokenenként (vagy munkamenetenként, egyébként IP-címenként); az aktuális értéket a RateLimit-Limit fejléc adja vissza
- Hitelesítés (/auth/*)
- szigorúbb korlát IP-címenként (brute force ellen; kivéve /auth/me és /auth/logout)
RateLimit-Limit- korlát az ablakban
RateLimit-Remaining- hány kérés maradt
RateLimit-Reset- másodpercek az ablak újraindulásáig
Retry-After- másodpercek a következő próbálkozásig (429 esetén)
HTTP/2 429 Too Many Requests
RateLimit-Limit: <limit in the window>
RateLimit-Remaining: 0
RateLimit-Reset: 37
Retry-After: 37
{ "error": "rate_limited", "message": "Too many requests. Slow down." }API-tokenek
Átlátszatlan (opaque) vpt_… tokenek szerver-szerver hozzáféréshez. A nyílt szöveg csak egyszer jelenik meg, a létrehozáskor. Mentse el. Mi csak a SHA-256 hash-t és egy 12 karakteres előtagot tárolunk a megjelenítéshez.
/tokensmunkamenet / tokenAz Ön aktív tokenjeinek listája (a titok nélkül), createdAt szerint csökkenő sorrendben.
/tokensmunkamenet / tokenTokent hoz létre; a nyílt szöveget adja vissza (csak egyszer).
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
name | string | igen | a token neve, max. 128 |
curl -X POST https://peppol.verteco.digital/api/v1/tokens -b cookies.txt \
-H 'Content-Type: application/json' -d '{"name":"moja-appka"}'
# 201 Created
{ "id":"…","name":"moja-appka","token":"vpt_8f2a…","prefix":"vpt_8f2a3b…","createdAt":"…" }/tokens/{id}munkamenet / tokenVisszavonja a tokent. 204-et ad vissza.
Hibák: token_not_found (404)
Cégek
Az Ön által kezelt, cégjegyzékszámmal (IČO) / áfaazonosítóval (IČ DPH) azonosított cégek. A hozzáférés a tagsághoz kötött: csak azokat a cégeket látja, amelyeknek tagja. A cég létrehozója lesz annak owner-e.
/companiesmunkamenet / tokenAzoknak a cégeknek a listája, amelyeknek tagja (az Ön szerepkörével).
/companiesmunkamenet / tokenCéget ad hozzá; Ön lesz a tulajdonosa, status = pending_verification.
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
ico | string | igen | pontosan 8 számjegy |
dic | string | igen | formátum: SK + 10 számjegy (pl. SK2121358349) |
legalName | string | igen | hivatalos (cég)név, max. 500 |
registeredAddress | string | nem | a székhely címe, max. 1000 |
curl -X POST https://peppol.verteco.digital/api/v1/companies \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"ico":"53412834","dic":"SK2121358349","legalName":"Verteco digital services, s. r. o."}'
# 201 Created
{ "id":"08dd…","ico":"53412834","dic":"SK2121358349","legalName":"…",
"registeredAddress":null,"peppolParticipantId":null,
"status":"pending_verification","role":"owner","createdAt":"2026-06-03T09:40:27Z" }Hibák: ico_taken (409) · validation_failed (400)
/companies/{id}munkamenet / tokenA cég részletei (tagnak kell lennie).
/companies/{id}owner / adminFrissíti a céget. Az IČO nem módosítható (meg kell egyeznie a meglévő értékkel).
Hibák: forbidden (403) · ico_immutable (400) · company_not_found (404)
A status mező
pending_verification- létrehozás után; a küldés még nincs feloldva
active- ellenőrzött, a küldés feloldva
Tagi szerepkör
owner- a cég létrehozója (teljes hozzáférés)
admin- adminisztrátor (szerkesztés, webhookok, ellenőrzés)
member- tag (olvasás)
viewer- csak olvasás
owner és az admin szerepkör számára is elérhetők (cégkezelő).Küldési ellenőrzés (ellenőrző token, Verifikačný údaj)
Küldés előtt a céget ellenőrizni kell az ellenőrző tokennel (Verifikačný údaj, VÚ), amely a Szlovák Köztársaság Pénzügyi Igazgatósága (Finančná správa, FS) által kiállított aláírt token. Sikeres ellenőrzés után a cég status mezője active értékre vált, és a küldés feloldódik.
/companies/{id}/verificationowner / adminAz ellenőrző token (Verifikačný údaj) önálló ellenőrzése. Siker esetén a status értékét active-ra állítja.
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
token | string | igen | VÚ = hexadecimális aláírás (prod/pPFS 1024 hex, test/tPFS 768 hex) |
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/verification \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"token":"<1024-hex VÚ>"}'
# 200 OK
{ "companyId":"08dd…","status":"active","sendingVerified":true,
"verificationMethod":"self","verifiedAt":"2026-06-15T…Z" }Hibák: company_dic_missing (400) · token_invalid (400) · forbidden (403)
Bizonylatok
A cég Peppol bizonylatainak (fogadott és küldött) naplója. Ahogy a számlák áthaladnak a hozzáférési ponton (Access Point), úgy telik meg. A cégtagsághoz kötött, createdAt szerint csökkenő sorrendben.
/companies/{id}/documentsmunkamenet / tokenA cég bizonylatainak listája. Opcionális szűrő: ?direction=sent|received.
curl 'https://peppol.verteco.digital/api/v1/companies/{id}/documents?direction=received' \
-H 'Authorization: Bearer vpt_8f2a…'
# 200 OK
[ { "id":"…","direction":"received","peppolMessageId":"…","docTypeId":"…",
"senderId":"0088:7300010000001","receiverId":"0245:2121358349",
"invoiceNumber":"2026001","issueDate":"2026-06-03",
"currency":"EUR","totalAmount":120.00,"status":"received","createdAt":"…" } ]/companies/{id}/documents/{docId}munkamenet / tokenEgy bizonylat részletei.
Hibák: document_not_found (404)
/companies/{id}/documents/{docId}/downloadmunkamenet / tokenA számla önálló, nyomtatható HTML változata. ?inline=1 → a böngészőben jeleníti meg, egyébként letölti.
text/html típust ad vissza, a Content-Disposition fejlécben a fájlnév faktura-<číslo>.html (číslo = a számla száma).
SAPI-SK 1.0 (nemzeti interfész)
A SAPI-SK a szabványosított nemzeti REST interfész az ügyfél/ERP-rendszer és a hozzáférési pont (Access Point) között (sapi-sk.sk). Teljes körűen implementáljuk. Ez azt jelenti, hogy Ön nincs a saját API-formátumunkhoz kötve, és az integrációt egyszer írja meg, bármely SAPI-SK hozzáférési ponthoz.
- Alap-URL (base URL)
https://peppol.verteco.digital/sapi- Hitelesítés
- OAuth2 client_credentials → rövid élettartamú access token (JWT)
- client_id
- az Ön API-tokenjének UUID-ja (az API-tokenek szakaszban / a vezérlőpulton látható)
- client_secret
- maga a portálról származó
vpt_…token - Verzió
- 1.3 (10 művelet: 4× hitelesítés, 6× bizonylatok)
vpt_ tokenje és nem is munkamenet). Az API-token visszavonása a portálon azonnal érvényteleníti az /auth/token és az /auth/renew végpontot is.Sandbox (próbakörnyezet)
Kipróbálná a SAPI-SK-t regisztráció nélkül és kockázat nélkül? Használja a nyilvános sandbox hitelesítő adatokat. A sandbox pontosan úgy validálja a kéréseket, mint az éles környezet, de soha semmit nem küld a Peppol hálózatba, és nem dolgozik valódi adatokkal; valósághű mock válaszokat ad vissza. Ideális fejlesztéshez, CI-hoz és az integráció bevezetéséhez.
- client_id
sandbox- client_secret
sandbox- send
- teljes szerződésvalidáció + mock 202 (semmi nem kerül kézbesítésre)
- receive
- 1 mintabizonylat
sandbox-doc-0001a feldolgozás és az acknowledge teszteléséhez
# 1) sandbox token (no registration required)
curl -X POST https://peppol.verteco.digital/sapi/auth/token \
-H 'Content-Type: application/json' \
-d '{ "client_id": "sandbox", "client_secret": "sandbox",
"grant_type": "client_credentials" }'
# 2) mock send: it is validated, but NOTHING is actually delivered
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer <sandbox access_token>' \
-H 'X-Peppol-Participant-Id: 0245:0000000000' \
-H 'Content-Type: application/json' \
-d '{ "metadata": { "documentId": "TEST-1",
"documentTypeId": "urn:…::Invoice##…::2.1",
"senderParticipantId": "0088:sandbox-sender",
"receiverParticipantId": "0088:sandbox-receiver" },
"payload": "<Invoice>…</Invoice>", "payloadFormat": "XML" }'
# 202 { "providerDocumentId": "sandbox-…", "status": "ACCEPTED", … }
# 3) sample inbox + detail of the sample document
curl https://peppol.verteco.digital/sapi/document/receive \
-H 'Authorization: Bearer <sandbox access_token>'
curl https://peppol.verteco.digital/sapi/document/receive/sandbox-doc-0001 \
-H 'Authorization: Bearer <sandbox access_token>'client_id/client_secret adatokat (lent).Hitelesítés
/sapi/auth/tokenclient_credentialsA client_id + client_secret párost access tokenre (15 perc) és refresh tokenre (30 nap) cseréli. Tárolja a tokent, és használja a teljes 15 percig: minden hívásnál új tokent kérni szükségtelen többletterhelés (a kérésszám-korlát az /auth/token hívásokat is számolja).
curl -X POST https://peppol.verteco.digital/sapi/auth/token \
-H 'Content-Type: application/json' \
-d '{ "client_id": "<token UUID>", "client_secret": "vpt_8f2a…",
"grant_type": "client_credentials" }'
# 200 OK
{ "access_token": "eyJhbGciOi…", "token_type": "Bearer",
"expires_in": 900, "refresh_token": "eyJhbGciOi…" }Hibák: SAPI-AUTH-001 (401) · SAPI-AUTH-003 (401: a kulcs engedélyezőlistáján kívüli IP-cím) · SAPI-VAL-001 (400)
/sapi/auth/token/statusBearer (access)Az access token érvényessége és lejárata; should_refresh = true, ha kevesebb mint 3 perc van hátra.
/sapi/auth/renewrefresh tokenÚj access + refresh tokent ad ki. Sikertelen, ha a mögöttes API-tokent visszavonták.
// body
{ "refresh_token": "eyJhbGciOi…" }/sapi/auth/revoke–Mindig sikert ad vissza (RFC 7009). A végleges leállító kapcsoló az API-token visszavonása a portálon.
Bizonylat küldése
/sapi/document/sendBearer (access)Peppol üzleti bizonylatot (UBL / BIS 3.0) küld a címzettnek a hozzáférési pontunkon keresztül. A küldés fail-closed: a cégnek ellenőrzött ellenőrző tokennel (Verifikačný údaj) kell rendelkeznie.
Kötelező fejlécek:
| Fejléc | Leírás |
|---|---|
Authorization | Bearer <access_token> |
X-Peppol-Participant-Id | a résztvevő, akinek a nevében küld (pl. 0245:2121358349, a DIČ (szlovák adóazonosító szám) számjegyei az "SK" előtag nélkül) |
Idempotency-Key | egyedi kulcs; az ismételt hívás az eredeti eredményt adja vissza |
curl -X POST https://peppol.verteco.digital/sapi/document/send \
-H 'Authorization: Bearer eyJ…' \
-H 'X-Peppol-Participant-Id: 0245:2121358349' \
-H 'Idempotency-Key: 7b1f0e2a-…' \
-H 'Content-Type: application/json' \
-d '{ "metadata": {
"documentId": "INV-2026-001",
"documentTypeId": "urn:…::Invoice##…::2.1",
"processId": "urn:…:bis:billing:3.0",
"senderParticipantId": "0245:2121358349",
"receiverParticipantId": "0088:7300010000001",
"creationDateTime": "2026-06-17T10:00:00Z" },
"payload": "<Invoice …>…</Invoice>",
"payloadFormat": "XML" }'
# 202 Accepted
{ "providerDocumentId": "…", "status": "ACCEPTED",
"receivedAt": "2026-06-17T10:00:01Z", "timestamp": "…" }
# when status is "REJECTED", the response also carries a "detail" field
# with the rejection reason (validation rules, e.g. BR-CO-15)metadata mezői útválasztási és technikai mezők: a documentId az Ön belső azonosítója, nem a számla száma. Az üzleti adatok (számlaszám cbc:ID, kiállítás dátuma, fizetési határidő, teljesítés dátuma, pénznem, összeg) közvetlenül az UBL payloadból származnak; ezekből semmit nem küld a metadata mezőben, és a portálon való megjelenítéshez és a webhookokhoz mindig az UBL az igazság forrása.Hibák: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400) · SAPI-PROC-001 (502) · SAPI-PROC-002 (503) · SAPI-PROC-500 (500: ne próbálja újra, jelentse a correlation_id-t)
Bizonylatok fogadása
/sapi/document/receiveBearer (access)A fogadott bizonylatok listája (a legrégebbi elöl); a metadata az invoiceNumber mezőt is tartalmazza, így a bizonylat a payload letöltése nélkül is azonosítható. Query: ?pageToken, ?limit (max. 200), ?status (received / acknowledged; kis- és nagybetűre érzéketlen, bármely más érték SAPI-VAL-001 hibát ad), ?invoiceNumber (pontos egyezés a cbc:ID-vel), ?since és ?until (ISO-8601 instant; időablak a fogadás időpontja szerint, pl. az utolsó 5 nap bizonylatai, tömeges letöltés külső archiváláshoz vagy a könyvelés rekonstrukciójához), ?deliveryDateFrom és ?deliveryDateTo (ISO-8601 dátum; szűrés a bizonylatban megadott teljesítési dátum szerint). Az X-Peppol-Participant-Id fejléc kötelező.
// 200 OK
{ "documents": [ { "documentId":"…","documentTypeId":"…",
"senderParticipantId":"0088:…","receiverParticipantId":"0245:…",
"creationDateTime":"2026-06-17T…Z" } ],
"nextPageToken": "50" }/sapi/document/receive/{documentId}Bearer (access)Részletek a payloaddal együtt (nyers XML, pontosan úgy, ahogy a Peppolon keresztül érkezett).
Hibák: SAPI-RES-001 (404) · SAPI-RES-002 (404: a payload nincs archiválva)
/sapi/document/receive/{documentId}/acknowledgeBearer (access)Megerősíti, hogy az Ön rendszere átvette a bizonylatot. Idempotens.
Küldött bizonylatok állapota
/sapi/discovery?receiverId=0245:2121358349Előzetes ellenőrzés küldés előtt: regisztrálva van-e a címzett a Peppol hálózatban, és milyen bizonylattípusokat tud fogadni? Ugyanaz az SML/SMP lekérdezés, amelyet a hozzáférési pont végez; a receiverId Peppol ID-t, áfaazonosítót (IČ DPH) vagy puszta DIČ-et fogad. Válasz: {registered, participantId, smp, documentTypes, checkedAt}. Az X-Peppol-Participant-Id fejléc itt nem szükséges.
/sapi/document/sentBearer (access)A küldött bizonylatok kézbesítési állapota: pending (átadás a hálózatnak folyamatban) → submitted → delivered / rejected (a címzett AP-jától érkező kézbesítési igazolás (MLS) alapján); failed = átviteli hiba (az ugyanazzal az Idempotency-Key-jel végzett újrapróbálkozás újra küld). Query: ?pageToken, ?limit, ?status (pending / submitted / sent / delivered / rejected / failed; kis- és nagybetűre érzéketlen, bármely más érték SAPI-VAL-001 hibát ad), ?invoiceNumber (pontos egyezés a cbc:ID-vel: egy konkrét számla állapota egyetlen hívással), ?since és ?until (ISO-8601 instant; időablak), ?deliveryDateFrom és ?deliveryDateTo (ISO-8601 dátum; szűrés teljesítési dátum szerint).
// 200 OK
{ "documents": [ {
"documentId": "…",
"receiverParticipantId": "0245:1084695645",
"peppolMessageId": "befc9112-…",
"status": "delivered",
"statusDateTime": "2026-07-09T14:52:31Z",
"creationDateTime": "2026-07-09T14:52:12Z" } ],
"nextPageToken": null }Hibák: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400: érvénytelen since)
Tömeges küldés
/sapi/document/batchBearer (access)Legfeljebb 100 bizonylat egyetlen hívásban. Minden elem a teljes egyedi küldési logikán megy át (idempotencia az itemId + idempotencyKey alapján, foglalás, beküldés, ítélet), és saját eredményt ad vissza; egy elem hibája nem állítja meg a többit. Az elemek feldolgozása szekvenciális; a sikertelen elemeket ugyanazzal az idempotencyKey-jel próbálja újra.
// request
{ "documents": [ {
"itemId": "fa-2026-001",
"idempotencyKey": "fa-2026-001",
"metadata": { "documentId": "2026001", "documentTypeId": "…", "processId": "…",
"senderParticipantId": "0245:2121358349", "receiverParticipantId": "0245:1084695645" },
"payload": "<Invoice …>", "payloadFormat": "XML" } ] }
// 202 Accepted
{ "total": 2, "accepted": 1, "rejected": 1, "failed": 0,
"results": [
{ "itemId": "fa-2026-001", "ok": true, "providerDocumentId": "…", "status": "ACCEPTED" },
{ "itemId": "fa-2026-002", "ok": false, "errorCode": "SAPI-AUTH-003", "errorMessage": "…" } ] }Hibák: SAPI-AUTH-002 (401) · SAPI-AUTH-003 (403) · SAPI-VAL-001 (400: üres vagy túl nagy lista)
Hibamodell
Minden SAPI hiba egységes borítékot használ kategóriával, stabil kóddal, egy retryable jelzővel és egy correlation_id értékkel a támogatás számára.
{ "error": {
"category": "AUTH",
"code": "SAPI-AUTH-001",
"message": "Invalid client credentials.",
"retryable": false,
"correlation_id": "b4191dfc-…" } }Értesítések és webhookok
Fogadott számláról a céget e-mailben vagy webhookkal (POST az Ön URL-jére) értesíthetjük. A kézbesítés tartós: kimenő várólistában tároljuk, és aszinkron módon kézbesítjük (15 s időtúllépés); hiba esetén legfeljebb 8× újrapróbáljuk exponenciális visszatartással (30 s → max. 1 óra), majd dead-letter. Az Ön szerverének kimaradása így nem veszíti el az értesítést; a következő próbálkozásnál kézbesítjük. Az SSRF-védelem blokkolja a loopback/helyi címeket; a webhook-URL-nek nyilvánosnak kell lennie.
/companies/{id}/notificationsmunkamenet / tokenÉrtesítési beállítások: { webhookUrl, notificationEmail, hasSecret }.
/companies/{id}/notificationsowner / adminMindkét csatornát beállítja (üres string kikapcsolja az adott csatornát).
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
webhookUrl | string | nem | üres vagy http(s) URL, max. 512 |
notificationEmail | string | nem | érvényes e-mail, max. 256 |
/companies/{id}/webhookmunkamenet / tokenWebhook-konfiguráció: { url, hasSecret } (a titok nélkül).
/companies/{id}/webhookowner / adminBeállítja a webhook-URL-t (automatikusan aláíró titkot generál, ha még nincs).
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
url | string | igen | http(s) URL, max. 512 |
curl -X PUT https://peppol.verteco.digital/api/v1/companies/{id}/webhook \
-H 'Authorization: Bearer vpt_8f2a…' -H 'Content-Type: application/json' \
-d '{"url":"https://vas-system.sk/peppol/webhook"}'
# 200 OK { "url":"https://vas-system.sk/peppol/webhook", "hasSecret": true }/companies/{id}/webhookowner / adminEltávolítja a webhook-URL-t és a titkot is. 204-et ad vissza.
/companies/{id}/webhook/secretowner / adminÚj aláíró titkot generál, és EGYSZER adja vissza; tárolja el az X-Verteco-Signature ellenőrzéséhez.
// 200 OK
{ "secret": "vpt_8f2a…" }/companies/{id}/webhook/testowner / adminSzinkron módon tesztértesítést küld (webhook.test esemény, aláírva, SSRF-védelemmel) a tárolt URL-re, és visszaadja, MIT küldött és MI jött vissza. Ugyanezt indítja a cég részleteinél az „Otestovať webhook“ (Webhook tesztelése) gomb.
// 200 OK
{
"sent": { "url": "https://vas-system.sk/peppol/webhook", "event": "webhook.test",
"signed": true, "payload": "{…}" },
"received": { "status": 200, "body": "OK", "durationMs": 142, "error": null }
}
// 400 webhook_not_configured if no webhook URL is storedWebhook payload
Fogadott (invoice.received) és küldött (invoice.sent) számla esetén is POST kérést küldünk ezzel a törzzsel; a típust az event mező különbözteti meg.
Két további esemény jelzi a hálózat ítéletét az Ön által küldött számláról: invoice.delivered (a címzett hozzáférési pontja kézbesítési igazolással (MLS) megerősítette a kézbesítést) és invoice.rejected (elutasítva, vagy a hálózat által, vagy a küldés előtti validáció során). A bizonylat és a cég azonosítóit hordozzák (documentId, invoiceNumber, receiverId, peppolMessageId, companyDic, peppolParticipantId), valamint a status mezőt, a statusDetail mezőt az elutasítás okával és a statusDateTime mezőt. Ezeknek köszönhetően nem kell lekérdezéssel figyelnie a küldött számlák állapotát.
A company.activated esemény akkor érkezik, amikor egy ügyfél befejezi a szolgáltatóválasztást a Szlovák Köztársaság Pénzügyi Igazgatóságának (Finančná správa, FS) portálján (VPDS); törzs: event, companyId, companyDic, peppolParticipantId, status, verifiedAt. A company.deactivated pedig akkor érkezik, amikor egy céget kiregisztrálnak a hálózatból (ugyanaz a törzs verifiedAt nélkül); részletek a /saas útmutatóban:
{
"event": "invoice.received",
"companyId": "08dd…",
"documentId": "…",
"invoiceNumber": "2026001",
"senderId": "0088:7300010000001",
"supplierName": "Dodávateľ s.r.o.",
"receiverId": "0245:2121358349",
"issueDate": "2026-06-03",
"dueDate": "2026-06-17",
"deliveryDate": "2026-06-03",
"currency": "EUR",
"totalAmount": "120.00",
"peppolMessageId": "…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349"
}A companyDic és a peppolParticipantId mező azonosítja azt a céget, amelyre az esemény vonatkozik (fontos azoknak a partnereknek, amelyek egyetlen webhook-URL-t használnak minden ügyfelükhöz).
A hálózat ítélete a küldött számláról:
{
"event": "invoice.delivered", // or "invoice.rejected"
"companyId": "08dd…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349",
"documentId": "…",
"invoiceNumber": "2026001",
"receiverId": "0245:2120049096",
"peppolMessageId": "…",
"status": "delivered", // or "rejected"
"statusDetail": null, // for rejected: the rejection reason
"statusDateTime": "2026-06-03T10:15:42Z"
}Cég aktiválása az FS portálon (VPDS) végzett szolgáltatóválasztás után:
{
"event": "company.activated", // company.deactivated has the same body without verifiedAt
"companyId": "08dd…",
"companyDic": "SK2121358349",
"peppolParticipantId": "0245:2121358349",
"status": "active",
"verifiedAt": "2026-06-03T10:02:11Z"
}Az esemény neve az X-Verteco-Event fejlécben is szerepel. Az események teljes listája: invoice.received, invoice.sent, invoice.delivered, invoice.rejected, company.activated, company.deactivated és a webhook.test tesztesemény. Az ismeretlen eseménytípust javasoljuk félretenni és naplózni; új típust mindig előre bejelentünk.
Aláírás ellenőrzése
Ha a cégnek van titka, az X-Verteco-Signature fejlécet küldjük sha256=HMAC-SHA256(secret, raw body) formában (kisbetűs hex). A HMAC-et mindig a törzs pontos bájtjain számolja:
import crypto from 'node:crypto';
// rawBody = the exact bytes of the request body (not re-serialized JSON)
function verify(rawBody, header, secret) {
const expected = 'sha256=' +
crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
return crypto.timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}POST /companies/{id}/webhook/secret hívással kapja meg; ez egyszer adja vissza (a rotáció újat generál). Titok nélkül nem küldjük az X-Verteco-Signature fejlécet.Tömeges beállítás: egy token, több cég
Egyetlen API-token (a fiókjához/e-mail-címéhez kötve) kezeli az összes tulajdonában lévő céget: aki a POST /companies hívással céget hoz létre, annak owner-e lesz, és beállíthatja a webhookját. A webhook cégenkénti (saját URL és titok), így ugyanazzal a tokennel tetszőleges számú céget csatlakoztathat:
# 1) list of your companies (paginated, see Companies)
curl 'https://peppol.verteco.digital/api/v1/companies?page=0&limit=100' -H 'Authorization: Bearer vpt_8f2a…'
# 2) for EACH company {id}: set the webhook (and/or e-mail)
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://vas-system.sk/peppol/webhook","notificationEmail":"faktury@firma.sk"}'
# 3) fetch the signing secret (returned ONLY ONCE) and store it for signature verification
curl -X POST https://peppol.verteco.digital/api/v1/companies/{id}/webhook/secret -H 'Authorization: Bearer vpt_8f2a…'
# → { "secret": "…" }- A tokennek az adott cég
owner/adminszerepkörével kell rendelkeznie; olyan cégnél, ahol csak member/viewer,403 forbiddenválaszt ad (nincs bérlők közötti hozzáférés). - Minden cégnek adhat eltérő URL-t, vagy mindnek ugyanazt; a payloadban a
companyId(és areceiverId) alapján különbözteti meg őket. - Több száz cég esetén tartsa be a tokenenkénti kérésszám-korlátot (az aktuális értéket a
RateLimit-Limitfejléc adja vissza); kötegeljen visszatartással429esetén (Retry-Afterfejléc). - A webhook ténylegesen csak akkor sül el, amikor a cég aktív a Peppolban (miután a Pénzügyi Igazgatóságnál a Vertecót választotta szolgáltatónak) és így ténylegesen fogad bizonylatokat.
Adatmodellek
Az API által visszaadott objektumok mezői.
Company
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
id | UUID | – | a cég azonosítója |
ico | string | – | cégjegyzékszám (IČO, 8 számjegy) |
dic | string|null | – | áfaazonosító (IČ DPH) |
legalName | string | – | hivatalos név |
registeredAddress | string|null | – | a székhely címe |
peppolParticipantId | string|null | – | Peppol résztvevő (regisztráció után) |
status | string | – | pending_verification | active |
role | string | – | owner | admin | member | viewer (az Ön szerepköre) |
createdAt | Instant | – | a létrehozás időpontja |
Document
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
id | UUID | – | a bizonylat azonosítója |
direction | string | – | sent | received |
peppolMessageId | string|null | – | Peppol üzenetazonosító |
docTypeId | string|null | – | bizonylattípus (Peppol) |
senderId | string|null | – | küldő (scheme:id) |
receiverId | string|null | – | címzett (scheme:id) |
invoiceNumber | string|null | – | számlaszám |
issueDate | date|null | – | a kiállítás dátuma |
currency | string|null | – | pénznem (pl. EUR) |
totalAmount | number|null | – | teljes összeg |
status | string | – | feldolgozási állapot |
createdAt | Instant | – | a rögzítés időpontja |
User · Token · Webhook
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
User | object | – | { id: UUID, email: string } |
Token | object | – | { id, name, prefix, lastUsedAt|null, createdAt } |
Webhook | object | – | { url: string|null, hasSecret: boolean } |
Szlovák konvenciók az implementálói gyakorlatból
A Peppol BIS Billing 3.0-n túl a szlovák ERP- és számlázószoftver-gyártók fokozatosan közös értelmezésre jutnak az opcionális mezőkről (az egyeztetés a Szlovák Köztársaság Pénzügyi Igazgatósága (Finančná správa, FS) által működtetett Slack-csatornán zajlik). Alább azok a konvenciók, amelyeket a portálunk már ma is tiszteletben tart: mindegyik érvényes BIS-konstrukció, változatlanul haladnak át az API-nkon, és a fogadott bizonylatokban az emberi olvasásra szánt előnézetben és a PDF-ben is megjelennek.
- Adózott előleg levonása egy soron: negatív sor
cac:DocumentReferenceelemmel, ahol acbc:IDa kapott fizetésről szóló adóbizonylat számát hordozza, és acbc:DocumentTypeCodeértéke130(BIS: invoice line object identifier, soronként max. 1). Az ilyen sort tartalmazó fogadott számlát az előnézetünk az „odpočet zálohy – daňový doklad č. …” megjegyzéssel jeleníti meg (előleg levonása, adóbizonylat száma: …). - Adóbizonylat kapott fizetésről: a Pénzügyi Igazgatóság GYIK-je szerint az
InvoiceTypeCode 388(Tax invoice) kódot használják. Átmegy az API-nkon és a validáción is; a ki nem fizetett (nem adózott) előleg levonását acbc:PrepaidAmountfejezi ki. - Számla érvénytelenítése (sztornó):
381jóváíró számla (CreditNote)cac:BillingReferencehivatkozással az eredeti számlára, nem negatív 380-as számla. Megjegyzés: a hálózat a 384-es kódot szlovák felek között elutasítja (a PEPPOL-EN16931-P0112 szabály csak német szervezetek között engedi); felfelé történő korrekcióhoz használja a 383-as terhelési értesítőt (debit note). - BT-83 PaymentID: a szlovák gyakorlat a
/VS…/SS…/KS…fizetői hivatkozási formátum felé tart; a puszta változó szimbólum (variabilný symbol) is gyakori. A feldolgozásunk az értéket változatlanul továbbítja, és a fizetési adatokkal együtt jeleníti meg. - További tételadatok (gyártási tételszámok, sorozatszámok, lejárati dátumok) a
cac:AdditionalItemPropertyelemen keresztül, bevett nevekkel, példáulBatchNumber,SerialNumber,ExpirationDate.
Bizonylatmellékletek (BT-125)
Mellékletek (PDF, képek) base64 formában csatolhatók az e-számlához a cac:AdditionalDocumentReference elemben (BT-125). A mi korlátunk mellékletenként 25 MB. A Peppol nem határoz meg egységes, hálózatszintű korlátot; az egyes szolgáltatók sajátot állapítanak meg (FS GYIK 9/DPH/2025/IM, 67. példa), ezért nagyon nagy mellékleteknél ellenőrizze a másik fél szolgáltatójának korlátját is.
Nyilvános eszközök (validáció, címzett ellenőrzése)
Két segédvégpont hitelesítés nélkül: ugyanaz a validációs mag és ugyanaz az SML/SMP lekérdezés, amelyet a hozzáférési pontunk használ. CI-hoz és küldés előtti ellenőrzésekhez alkalmasak; szigorúbb nyilvános kérésszám-korlát vonatkozik rájuk.
/public/peppol-validatenyilvánosE-számla validációja az EN 16931 + Peppol BIS Billing 3.0 szerint (a szlovák szabályokkal együtt), ugyanúgy, mint a /validator felületi validátor. A kérés törzse = közvetlenül az UBL 2.1 XML (Invoice / CreditNote, vagy a teljes Peppol SBD), Content-Type application/xml, korlát 3 MB.
curl -X POST https://peppol.verteco.digital/api/v1/public/peppol-validate \
-H "Content-Type: application/xml" \
--data-binary @faktura.xml// 200 OK
{
"valid": false,
"errors": [
"BR-CO-09: [BR-CO-09]-The Seller VAT identifier (BT-31) … shall have a prefix in accordance with ISO code…"
],
"warnings": []
}
// 400 = empty body (empty_document) or document over 3 MB (document_too_large)/public/peppol-check?id=0245:2121358349nyilvánosA címzett ellenőrzése az éles Peppol hálózatban (SML/SMP lekérdezés): regisztrálva van-e, és milyen bizonylattípusokat tud fogadni? Az id paraméter Peppol ID-t (0245:…), áfaazonosítót (IČ DPH, SK…) vagy puszta DIČ-et (szlovák adóazonosító szám) fogad. Hitelesített megfelelője ERP-folyamatokhoz: GET /sapi/discovery.
// 200 OK
{
"registered": true,
"participantId": "0245:2121358349",
"smp": "sml.peppol-smp.sk",
"capabilities": ["Faktúra (BIS Billing)", "Dobropis", "Self-billing", "MLS doručenky"], // Slovak labels: Invoice (BIS Billing), Credit note, Self-billing, MLS delivery receipts
"lastCheckedAt": "2026-08-31T…Z"
}Állapot (ping)
Nyilvános health-check végpont, monitorozásra alkalmas.
/pingnyilvánosA backend állapota.
// 200 OK
{ "service": "peppol-portal-backend", "status": "ok", "timestamp": "2026-06-17T…Z" }Az összes komponens élő áttekintése a rendszerállapot oldalon érhető el.
Hamarosan
- POST
/companies/{id}/peppol/register· Manuális regisztráció a Peppol SMP-ben az API-n keresztül. Ma ez automatikusan történik a Szlovák Köztársaság Pénzügyi Igazgatóságának (Finančná správa, FS) portálján (VPDS) végzett szolgáltatóválasztáskor.
POST /companies/{id}/documents/send már elérhető (béta: a válasz alakja még változhat); stabil programozott küldéshez a SAPI-SK POST /sapi/document/send végpontját javasoljuk Idempotency-Key fejléccel.Korai hozzáférést szeretne az integrációhoz, sandboxot, vagy kérdése van? Vegye fel velünk a kapcsolatot közvetlenül:
