Toegangsgegevens voor netwerken
De toegangsgegevens van een eindklant voor een netwerk opslaan en vervangen.
- In de sandboxopslag
- Nog niet in de sandboxnetwerken
In gewone woorden
Toegangsgegevens voor een netwerk zijn de sleutel of machtiging waarmee we voor één eindklant kunnen optreden bij het netwerk of de overheidsinstantie van een land, zoals een token voor het nationale e-facturatiesysteem van Polen (KSeF). De eindklant reikt ze uit of geeft de machtiging, en ze komen in eurinvoice binnen via de API, nooit per e-mail of chat. We bewaren ze versleuteld en tonen ze nooit opnieuw. De gehoste sandbox bevat er nog geen, dus een verzendkanaal daar verzendt niets.
Met toegangsgegevens voor een netwerk kunnen we voor één eindklant optreden op een verzendkanaal: een KSeF-token, een ANAF-autorisatie, een platformsleutel. Ze komen binnen via deze API, nooit per e-mail of chat. De API bewaart ze en geeft ze nooit terug. De aanroepen vereisen een sleutel met de scope admin, en de sleutel van een eindklant slaat alleen toegangsgegevens op voor de eigen eindklant.
Hoe een waarde wordt bewaard
Een waarde wordt versleuteld voordat ze wordt opgeslagen, apart bewaard van de sleutel die haar beschermt, en nooit opnieuw getoond. Toegangsgegevens worden alleen geopend wanneer de dienst het verzendkanaal van die eindklant zou aanroepen. Elk gebruik schrijft een auditregel zonder waarde.
Voor toegangsgegevens waarvan de expires_on minder dan 30 dagen in de toekomst ligt, wordt een waarschuwing vastgelegd. Intrekken wist de waarde en bewaart de datums.
Velden
| Veld | Betekenis |
|---|---|
client | De identificatie van de eindklant, dezelfde die in een factuur staat: 1 tot 64 letters, cijfers, punten, underscores of koppeltekens. De eigen sleutel van een eindklant mag dit veld weglaten. |
route | DE-XRECHNUNG, PEPPOL, FR-PA, PL-KSEF of RO-EFACTURA. |
kind | Geeft de toegangsgegevens een naam en bepaalt hoe ze worden gelezen, maximaal 80 tekens uit letters, cijfers, punten, underscores en koppeltekens: ksef-token voor KSeF en anaf-oauth voor ANAF. Voor een Peppol- of Frans verzendkanaal geven wij u de soort en de vorm van de waarde wanneer de livegang begint. |
issued_by | Wie ze heeft uitgereikt, maximaal 200 tekens. |
issued_on | De datum van uitreiking, YYYY-MM-DD. |
expires_on | Optioneel, YYYY-MM-DD. Vul dit in als de toegangsgegevens verlopen. |
environment | Optioneel. Het moet de omgeving zijn van de dienst die u aanroept; een sandbox slaat alleen sandbox-toegangsgegevens op. |
legal_entity | Optioneel, maximaal 64 tekens. De ID van de verkoper waarvoor de toegangsgegevens gelden: een btw-nummer, NIP, SIREN of bedrijfs-ID. Toegangsgegevens zonder deze waarde gelden ook voor de andere facturen van de eindklant. |
value | Het geheim, maximaal 16.384 tekens. Verplicht, en wordt nooit teruggegeven. |
De dienst controleert of een waarde bij haar soort kan werken, bijvoorbeeld dat een KSeF-token JSON is met een nip en een token. Een anaf-oauth-waarde is JSON-tekst met een cui en een access_token, of een refresh_token met de client_id en het client_secret van de toepassing. Een waarde die dat niet kan, geeft 422, credential-unusable, en het antwoord zegt welke vorm het verwacht zonder de waarde te citeren.
Een antwoord bevat id (cred_ en 24 hexadecimale tekens), de velden hierboven behalve value, stored (true zolang er een waarde wordt bewaard) en revoked_at na het intrekken.
Een eindklant kan per verzendkanaal, kind, omgeving en rechtspersoon één actieve set toegangsgegevens hebben. De worker gebruikt voor de eindklant en het verzendkanaal van de factuur de oudste set die niet is ingetrokken.
Toegangsgegevens opslaan
POST /credentials neemt de velden hierboven aan als JSON en antwoordt 201. Het verzoek is 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"
}Dezelfde toegangsgegevens opnieuw opslaan terwijl de eerste nog actief zijn, geeft 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
}Opvragen en lezen
GET /credentials geeft alle toegangsgegevens terug, actief en ingetrokken, als {"data": [...]}. GET /credentials/{id} geeft één set terug, en 404 voor een onbekende ID.
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"
}
]
}Vervangen
POST /credentials/{id} neemt een nieuwe value aan, en eventueel een nieuwe expires_on. Eindklant, verzendkanaal, soort en datum van uitreiking blijven ongewijzigd. Gebruik dit na het vernieuwen van een token. Het verzoek is 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"
}Intrekken
POST /credentials/{id}/revoke wist de waarde en vult revoked_at in. Herhalen verandert niets.
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"
}Waarschuwing
Een ingetrokken record blijft bestaan, voor het auditspoor. Het kan niet worden vervangen: dat geeft 409, credential-revoked. Sla de nieuwe toegangsgegevens op als een nieuw record. Ingetrokken toegangsgegevens staan het opnieuw opslaan van dezelfde eindklant, hetzelfde verzendkanaal en dezelfde soort niet meer in de weg.
Antwoorden
| Status | Betekenis |
|---|---|
200 | De lijst, één set toegangsgegevens, een vervanging of een intrekking. |
201 | Opgeslagen. |
400 | De body is geen JSON, een verplicht veld ontbreekt of is te lang, route is niet een van de vijf, of een datum heeft niet de vorm YYYY-MM-DD. |
401 | Geen sleutel, of een onbekende sleutel. |
403 | De sleutel mist de scope admin, of noemt een andere eindklant. |
404 | Deze toegangsgegevens bestaan niet. |
409 | De eindklant heeft deze toegangsgegevens al (credential-exists), of ze zijn ingetrokken (credential-revoked). |
413 | De body is groter dan 5 MB (payload-too-large). |
422 | De waarde kan niet werken voor deze soort (credential-unusable). |
429 | Te veel aanvragen voor de sleutel. Wacht het aantal seconden in Retry-After. |
503 | De dienst heeft geen hoofdsleutel om een waarde mee te verzegelen (unavailable). |
Wat elk verzendkanaal nodig heeft
In de sandboxuit officiële bronnen, gecontroleerd op 2 okt. 2026| Verzendkanaal | De eindklant geeft | Wie het uitreikt | Geldigheid |
|---|---|---|---|
PL-KSEF | Een KSeF-token waarmee facturen kunnen worden verzonden (InvoiceWrite) en, voor statussen, gelezen (InvoiceRead). De rechten liggen vast bij het aanmaken, dus een wijziging vereist een nieuw token. Aanmelden met een KSeF-certificaat wordt nog niet ondersteund. Het opslaan van een ksef-set die geen ksef-token is, geeft 422, credential-unusable. | De KSeF-beheerder van de eindklant. | Zie de opmerking hieronder. |
RO-EFACTURA | Een OAuth-autorisatie voor onze geregistreerde ANAF-applicatie. | Iemand met SPV-rechten voor de CUI van de eindklant: de wettelijke vertegenwoordiger of de boekhouder. Die meldt zich aan op het portaal van ANAF met een gekwalificeerd certificaat. | Het toegangstoken is 90 dagen geldig en het vernieuwingstoken 365 dagen. |
PEPPOL | Toestemming om de eindklant als Peppol-deelnemer te registreren, en de identiteitscontrole die het toegangspunt vraagt. | De eindklant ondertekent de toestemming en doorstaat de controle. Wij beheren de sleutel van het toegangspunt, dus er zijn geen toegangsgegevens van de eindklant om op te slaan. | De sleutel van het toegangspunt is van ons en wij roteren hem. |
FR-PA | Het eigen account van de eindklant op zijn Plateforme Agréée, en API-toegangsgegevens voor de onderneming. | De eindklant maakt ze aan op zijn platform, of geeft ons toegang. | Bepaald door het platform. Vraag welk soort toegangsgegevens het uitreikt. |
DE-XRECHNUNG | Niets voor Duitsland zelf. Per e-mail: de verzendende mailbox. Via Peppol: de registratie bij het toegangspunt. | De eindklant. | Niet van toepassing. |
Tip
Stel expires_on in op basis van de datums hierboven, zodat de waarschuwing van 30 dagen afgaat voordat een vernieuwingstoken verloopt.
Bronnen: OAuth-procedure van ANAF (geldigheid van de tokens), KSeF-API-documentatie: tokens (rechten liggen vast bij het aanmaken van een token).
Waarschuwing
Polen: de bronnen zijn het oneens over hoelang een KSeF-token werkt. Het handboek van het Poolse ministerie van Financiën (editie van 9 feb. 2026) en de pagina over de applicatie voor belastingplichtigen (gewijzigd op 31 mrt. 2026) zeggen dat tokens tot 31 dec. 2026 geldig zijn voor authenticatie. De pagina met vragen en antwoorden van het ministerie zegt dat het heeft besloten de tokens in KSeF 2.0 zonder einddatum te behouden (antwoord 39). Een openbaar issue in de KSeF-API-repository van het ministerie vraagt het om dat verschil op te helderen. Gecontroleerd op 2 okt. 2026. Reken er, tot dat is opgehelderd, op dat u het token moet vernieuwen als het ministerie een einddatum vaststelt. Aanmelden met een certificaat wordt nog niet ondersteund, dus een token is de enige toegang. Zie het handboek, de vragen en antwoorden en het issue.