Prístupové údaje k sieťam
Uloženie a výmena prístupových údajov klienta k sieťam.
- V sandboxeuloženie
- Zatiaľ nie v sandboxesiete
Jednoducho povedané
Prístupové údaje k sieti sú kľúč alebo autorizácia, ktorá nám umožňuje konať v mene jedného klienta v sieti alebo na úrade krajiny, napríklad token pre poľský národný systém elektronickej fakturácie (KSeF). Klient ich vydá alebo autorizuje a do eurinvoice sa zadávajú cez API, nikdy nie e-mailom ani cez chat. Uchovávame ich zašifrované a nikdy ich znova nezobrazíme. Hostovaný sandbox zatiaľ žiadne nemá, takže kanál tam nič neodosiela.
Prístupové údaje k sieti nám umožňujú konať v kanáli v mene jedného klienta: token KSeF, autorizácia ANAF, kľúč platformy. Zadávajú sa cez toto API, nikdy nie e-mailom ani cez chat. API ich uchová a nikdy ich nevráti. Volania vyžadujú kľúč s oprávnením admin a kľúč klienta ukladá prístupové údaje len pre vlastného klienta.
Ako sa hodnota uchováva
Hodnota sa pred uložením zašifruje, uchováva sa oddelene od kľúča, ktorý ju chráni, a nikdy sa znova nezobrazí. Prístupové údaje sa otvoria, len keď by služba volala kanál daného klienta. Každé použitie zapíše auditný záznam bez hodnoty.
Pri prístupových údajoch, ktorých expires_on nastane o menej ako 30 dní, sa zaznamená upozornenie. Odvolanie vymaže hodnotu a ponechá dátumy.
Polia
| Pole | Význam |
|---|---|
client | Identifikátor klienta, ten istý, aký je uvedený vo faktúre: 1 až 64 písmen, číslic, bodiek, podčiarkovníkov alebo spojovníkov. Kľúč klienta ho môže vynechať. |
route | DE-XRECHNUNG, PEPPOL, FR-PA, PL-KSEF alebo RO-EFACTURA. |
kind | Pomenúva prístupové údaje a určuje, ako sa čítajú, najviac 80 znakov z písmen, číslic, bodiek, podčiarkovníkov a spojovníkov: ksef-token pre KSeF a anaf-oauth pre ANAF. Pri kanáli Peppol alebo Francúzsko vám druh a tvar hodnoty oznámime pri začiatku uvedenia do prevádzky. |
issued_by | Kto ich vydal, najviac 200 znakov. |
issued_on | Dátum vydania, YYYY-MM-DD. |
expires_on | Voliteľné, YYYY-MM-DD. Nastavte ho, ak majú prístupové údaje obmedzenú platnosť. |
environment | Voliteľné. Musí to byť prostredie služby, ktorú voláte; sandbox ukladá iba prístupové údaje sandboxu. |
legal_entity | Voliteľné, najviac 64 znakov. ID predávajúceho, v mene ktorého prístupové údaje konajú: IČ DPH, NIP, SIREN alebo ID spoločnosti. Prístupové údaje bez neho slúžia pre ostatné faktúry klienta. |
value | Tajná hodnota, najviac 16 384 znakov. Povinné a nikdy sa nevracia. |
Služba skontroluje, či hodnota môže fungovať pre svoj druh, napríklad že token KSeF je JSON s nip a token. Hodnota anaf-oauth je text JSON s cui a buď s access_token, alebo s refresh_token spolu s client_id a client_secret aplikácie. Hodnota, ktorá nemôže, dostane odpoveď 422, credential-unusable, a odpoveď uvedie, aký tvar očakáva, bez citovania hodnoty.
Odpoveď obsahuje id (cred_ a 24 hexadecimálnych znakov), polia uvedené vyššie okrem value, stored (true, kým je uložená hodnota) a po odvolaní revoked_at.
Klient môže mať jedny živé prístupové údaje pre každý kanál, druh (kind), prostredie a právnu entitu. Pracovný proces použije najstaršie neodvolané prístupové údaje pre klienta a kanál faktúry.
Uloženie prístupových údajov
POST /credentials prijme polia uvedené vyššie ako JSON a odpovie 201. Požiadavka je credential-create.json.
curl -X POST "https://api-sandbox-eu.eurinvoice.com/credentials" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
--data-binary @credential-create.jsonimport java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/credentials"))
.header("Authorization", "Bearer <your-api-key>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofFile(Path.of("credential-create.json")))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}import { readFile } from 'node:fs/promises';
const response = await fetch('https://api-sandbox-eu.eurinvoice.com/credentials', {
method: 'POST',
headers: {
Authorization: 'Bearer <your-api-key>',
'Content-Type': 'application/json',
},
body: await readFile('credential-create.json'),
});
console.log(response.status);
console.log(await response.text());{
"issued_by": "ANAF",
"environment": "sandbox",
"route": "RO-EFACTURA",
"kind": "anaf-oauth",
"expires_on": "2027-09-01",
"stored": true,
"client": "acme-srl",
"issued_on": "2026-09-01",
"id": "cred_5bebc3172daf651a788e4284"
}Opätovné uloženie tých istých prístupových údajov, kým sú prvé živé, odpovie 409.
curl -X POST "https://api-sandbox-eu.eurinvoice.com/credentials" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
--data-binary @credential-create.jsonimport java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/credentials"))
.header("Authorization", "Bearer <your-api-key>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofFile(Path.of("credential-create.json")))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}import { readFile } from 'node:fs/promises';
const response = await fetch('https://api-sandbox-eu.eurinvoice.com/credentials', {
method: 'POST',
headers: {
Authorization: 'Bearer <your-api-key>',
'Content-Type': 'application/json',
},
body: await readFile('credential-create.json'),
});
console.log(response.status);
console.log(await response.text());{
"type": "https://eurinvoice.com/problems/credential-exists",
"title": "This client already has this credential",
"status": 409
}Zoznam a čítanie
GET /credentials vráti všetky prístupové údaje, živé aj odvolané, ako {"data": [...]}. GET /credentials/{id} vráti jedny a pre ID, ktoré nemá, 404.
curl "https://api-sandbox-eu.eurinvoice.com/credentials" \
-H "Authorization: Bearer <your-api-key>"import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/credentials"))
.header("Authorization", "Bearer <your-api-key>")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}const response = await fetch('https://api-sandbox-eu.eurinvoice.com/credentials', {
headers: {
Authorization: 'Bearer <your-api-key>',
},
});
console.log(response.status);
console.log(await response.text());{
"data": [
{
"issued_by": "ANAF",
"environment": "sandbox",
"route": "RO-EFACTURA",
"kind": "anaf-oauth",
"expires_on": "2027-09-01",
"stored": true,
"client": "acme-srl",
"issued_on": "2026-09-01",
"id": "cred_5bebc3172daf651a788e4284"
}
]
}Výmena
POST /credentials/{id} prijme novú value a voliteľne nové expires_on. Klient, kanál, druh a dátum vydania zostávajú. Použite ho po obnovení tokenu. Požiadavka je credential-replace.json.
curl -X POST "https://api-sandbox-eu.eurinvoice.com/credentials/cred_5bebc3172daf651a788e4284" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
--data-binary @credential-replace.jsonimport java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/credentials/cred_5bebc3172daf651a788e4284"))
.header("Authorization", "Bearer <your-api-key>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofFile(Path.of("credential-replace.json")))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}import { readFile } from 'node:fs/promises';
const response = await fetch('https://api-sandbox-eu.eurinvoice.com/credentials/cred_5bebc3172daf651a788e4284', {
method: 'POST',
headers: {
Authorization: 'Bearer <your-api-key>',
'Content-Type': 'application/json',
},
body: await readFile('credential-replace.json'),
});
console.log(response.status);
console.log(await response.text());{
"issued_by": "ANAF",
"environment": "sandbox",
"route": "RO-EFACTURA",
"kind": "anaf-oauth",
"expires_on": "2028-09-01",
"stored": true,
"client": "acme-srl",
"issued_on": "2026-09-01",
"id": "cred_5bebc3172daf651a788e4284"
}Odvolanie
POST /credentials/{id}/revoke vymaže hodnotu a zapíše revoked_at. Opakovanie nič nezmení.
curl -X POST "https://api-sandbox-eu.eurinvoice.com/credentials/cred_5bebc3172daf651a788e4284/revoke" \
-H "Authorization: Bearer <your-api-key>"import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api-sandbox-eu.eurinvoice.com/credentials/cred_5bebc3172daf651a788e4284/revoke"))
.header("Authorization", "Bearer <your-api-key>")
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}const response = await fetch('https://api-sandbox-eu.eurinvoice.com/credentials/cred_5bebc3172daf651a788e4284/revoke', {
method: 'POST',
headers: {
Authorization: 'Bearer <your-api-key>',
},
});
console.log(response.status);
console.log(await response.text());{
"issued_by": "ANAF",
"environment": "sandbox",
"route": "RO-EFACTURA",
"revoked_at": "2026-10-06T19:49:12.987Z",
"kind": "anaf-oauth",
"expires_on": "2028-09-01",
"stored": false,
"client": "acme-srl",
"issued_on": "2026-09-01",
"id": "cred_5bebc3172daf651a788e4284"
}Varovanie
Odvolaný záznam zostáva, pre auditnú stopu. Nedá sa vymeniť: odpoveď je 409, credential-revoked. Nové prístupové údaje uložte namiesto toho ako nový záznam. Odvolané prístupové údaje už nebránia opätovnému uloženiu pre rovnakého klienta, kanál a druh.
Odpovede
| Stav | Význam |
|---|---|
200 | Zoznam, jedny prístupové údaje, výmena alebo odvolanie. |
201 | Uložené. |
400 | Telo nie je JSON, povinné pole chýba alebo je príliš dlhé, route nie je jeden z piatich kanálov alebo dátum nie je vo formáte YYYY-MM-DD. |
401 | Chýba kľúč alebo je neznámy. |
403 | Kľúču chýba oprávnenie admin alebo uvádza iného klienta. |
404 | Také prístupové údaje neexistujú. |
409 | Klient už tieto prístupové údaje má (credential-exists) alebo boli prístupové údaje odvolané (credential-revoked). |
413 | Telo má viac ako 5 MB (payload-too-large). |
422 | Hodnota nemôže fungovať pre tento druh (credential-unusable). |
429 | Príliš veľa požiadaviek pre kľúč. Počkajte Retry-After sekúnd. |
503 | Služba nemá hlavný kľúč, ktorým by hodnotu zapečatila (unavailable). |
Čo potrebuje každý kanál
V sandboxez oficiálnych zdrojov, overené 2. okt. 2026| Kanál | Klient dodá | Kto ich vydáva | Platnosť |
|---|---|---|---|
PL-KSEF | Token KSeF, ktorý môže odosielať faktúry (InvoiceWrite) a kvôli stavom ich aj čítať (InvoiceRead). Jeho oprávnenia sa určia pri vytvorení, takže zmena vyžaduje nový token. Prihlásenie certifikátom KSeF zatiaľ nie je podporované. Uloženie prístupových údajov ksef, ktoré nie sú ksef-token, odpovie 422, credential-unusable. | Administrátor KSeF klienta. | Pozri poznámku nižšie. |
RO-EFACTURA | Autorizácia OAuth pre našu registrovanú aplikáciu ANAF. | Osoba s oprávneniami SPV pre CUI klienta: štatutárny zástupca alebo účtovník. Do portálu ANAF sa prihlási kvalifikovaným certifikátom. | Prístupový token platí 90 dní a obnovovací token 365 dní. |
PEPPOL | Súhlas s registráciou klienta ako účastníka siete Peppol a overenie totožnosti, ktoré požaduje prístupový bod. | Klient podpíše súhlas a prejde overením. Kľúč prístupového bodu držíme my, takže neexistujú žiadne prístupové údaje klienta na uloženie. | Kľúč prístupového bodu je náš a rotujeme ho my. |
FR-PA | Vlastný účet klienta na jeho Plateforme Agréée a prístupové údaje k API pre spoločnosť. | Klient ich vytvorí na svojej platforme alebo nám udelí prístup. | Určuje platforma. Opýtajte sa, aký druh vydáva. |
DE-XRECHNUNG | Pre samotné Nemecko nič. Pri doručovaní e-mailom poštovú schránku, z ktorej sa odosiela. Cez Peppol registráciu u prístupového bodu. | Klient. | Neuplatňuje sa. |
Tip
Nastavte expires_on podľa údajov vyššie, aby sa upozornenie 30 dní vopred spustilo skôr, než platnosť obnovovacieho tokenu vyprší.
Zdroje: postup OAuth ANAF (platnosť tokenov), dokumentácia KSeF API: tokeny (oprávnenia určené pri vytvorení tokenu).
Varovanie
Poľsko: zdroje sa nezhodujú v tom, ako dlho token KSeF funguje. Príručka ministerstva financií (vydanie z 9. feb. 2026) a stránka aplikácie pre daňovníkov (zmenená 31. mar. 2026) uvádzajú, že tokeny slúžia na autentifikáciu do 31. dec. 2026. Stránka otázok a odpovedí ministerstva uvádza, že ministerstvo sa rozhodlo ponechať tokeny v KSeF 2.0 bez dátumu ukončenia (odpoveď 39). Verejné hlásenie v repozitári KSeF API ministerstva ho žiada, aby rozpor vyriešilo. Overené 2. okt. 2026. Kým sa to nevyrieši, počítajte s obnovením tokenu, ak ministerstvo stanoví dátum ukončenia. Prihlásenie certifikátom zatiaľ nie je podporované, takže token je jediný vstup. Pozri príručku, otázky a odpovede a hlásenie.