Docs
7

Identifiants d’accès aux réseaux

Stocker et remplacer les identifiants d’accès aux réseaux d’un client.

  • Dans le bac à sablestockage
  • Pas encore dans le bac à sableréseaux

En termes simples

Un identifiant d’accès au réseau est la clé ou l’autorisation qui nous permet d’agir auprès du réseau ou de l’administration d’un pays pour un client, par exemple un jeton pour le système national de facturation électronique polonais (KSeF). Le client le délivre ou l’autorise, et il est transmis à eurinvoice par l’API, jamais par e-mail ou par messagerie. Nous le conservons chiffré et ne l’affichons plus jamais. Le bac à sable hébergé n’en détient encore aucun : un canal n’y envoie donc rien.

Un identifiant d’accès au réseau nous permet d’agir sur un canal pour un client : un jeton KSeF, une autorisation ANAF, une clé de plateforme. Il est transmis par cette API, jamais par e-mail ou par messagerie. L’API le conserve et ne le renvoie jamais. Les appels nécessitent une clé dotée de la portée admin, et la clé d’un client ne stocke que les identifiants d’accès de son propre client.

Comment une valeur est conservée

Une valeur est chiffrée avant d’être stockée, conservée à part de la clé qui la protège, et jamais affichée à nouveau. Un identifiant d’accès n’est ouvert que lorsque le service doit appeler le canal de ce client. Chaque utilisation écrit une ligne d’audit sans valeur.

Une alerte est consignée pour un identifiant d’accès dont la date expires_on est à moins de 30 jours. La révocation efface la valeur et conserve les dates.

Champs

ChampSignification
clientL’identifiant du client, le même que celui que porte une facture : de 1 à 64 lettres, chiffres, points, tirets bas ou traits d’union. La clé propre d’un client peut l’omettre.
routeDE-XRECHNUNG, PEPPOL, FR-PA, PL-KSEF ou RO-EFACTURA.
kindNomme l’identifiant d’accès et détermine comment il est lu, jusqu’à 80 caractères parmi lettres, chiffres, points, tirets bas et traits d’union : ksef-token pour KSeF et anaf-oauth pour l’ANAF. Pour un canal Peppol ou France, nous vous indiquons le kind et la forme de la valeur au démarrage de la mise en production.
issued_byQui l’a délivré, jusqu’à 200 caractères.
issued_onLa date de délivrance, YYYY-MM-DD.
expires_onFacultatif, YYYY-MM-DD. Renseignez-le si l’identifiant d’accès a une date d’expiration.
environmentFacultatif. Ce doit être l’environnement du service que vous appelez ; un bac à sable ne stocke que des identifiants d’accès de bac à sable.
legal_entityFacultatif, jusqu’à 64 caractères. L’identifiant du vendeur pour lequel l’identifiant d’accès agit : un numéro de TVA, NIP, SIREN ou identifiant de société. Un identifiant d’accès sans cette valeur sert les autres factures du client.
valueLe secret, jusqu’à 16 384 caractères. Obligatoire, et jamais renvoyé.

Le service vérifie qu’une valeur peut fonctionner pour son kind, par exemple qu’un jeton KSeF est un JSON avec un nip et un token. Une valeur anaf-oauth est un texte JSON avec un cui et soit un access_token, soit un refresh_token avec le client_id et le client_secret de l’application. Une valeur qui ne le peut pas reçoit 422, credential-unusable, et la réponse indique la forme attendue sans citer la valeur.

Une réponse contient id (cred_ suivi de 24 caractères hexadécimaux), les champs ci-dessus sauf value, stored (true tant qu’une valeur est détenue) et revoked_at une fois l’identifiant révoqué.

Un client peut détenir un identifiant d’accès actif par canal, kind, environnement et entité juridique. Le processus de traitement utilise le plus ancien non révoqué pour le client et le canal de la facture.

Stocker un identifiant d’accès

POST /credentials reçoit les champs ci-dessus en JSON et répond 201. La requête est 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.json
Réponse201
{
  "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"
}
Enregistré le 7 oct. 2026. La valeur est une chaîne fictive.

Stocker à nouveau le même identifiant d’accès tant que le premier est actif renvoie 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.json
Réponse409 Conflict
{
  "type": "https://eurinvoice.com/problems/credential-exists",
  "title": "This client already has this credential",
  "status": 409
}
Enregistré le 7 oct. 2026.

Lister et lire

GET /credentials renvoie tous les identifiants d’accès, actifs et révoqués, sous la forme {"data": [...]}. GET /credentials/{id} en renvoie un, et 404 pour un identifiant qu’il ne connaît pas.

curl "https://api-sandbox-eu.eurinvoice.com/credentials" \
  -H "Authorization: Bearer <your-api-key>"
Réponse200 OK
{
  "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"
    }
  ]
}
Enregistré le 7 oct. 2026. La liste ne contient aucune valeur.

Remplacer

POST /credentials/{id} reçoit une nouvelle value, et éventuellement une nouvelle date expires_on. Le client, le canal, le kind et la date de délivrance restent inchangés. Utilisez-le après un renouvellement de jeton. La requête est 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.json
Réponse200 OK
{
  "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"
}
Enregistré le 7 oct. 2026.

Révoquer

POST /credentials/{id}/revoke efface la valeur et horodate revoked_at. Le répéter ne change rien.

curl -X POST "https://api-sandbox-eu.eurinvoice.com/credentials/cred_5bebc3172daf651a788e4284/revoke" \
  -H "Authorization: Bearer <your-api-key>"
Réponse200 OK
{
  "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"
}
Enregistré le 7 oct. 2026. `stored` vaut false.

Attention

Un enregistrement révoqué demeure, pour la piste d’audit. Il ne peut pas être remplacé : la réponse est 409, credential-revoked. Stockez plutôt le nouvel identifiant d’accès comme un nouvel enregistrement. Un identifiant d’accès révoqué n’empêche plus de stocker à nouveau le même client, le même canal et le même kind.

Réponses

StatutSignification
200La liste, un identifiant d’accès, un remplacement ou une révocation.
201Stocké.
400Le corps n’est pas du JSON, un champ obligatoire est absent ou trop long, route n’est pas l’un des cinq, ou une date n’est pas au format YYYY-MM-DD.
401Aucune clé, ou une clé inconnue.
403La clé n’a pas la portée admin, ou indique un autre client.
404Cet identifiant d’accès n’existe pas.
409Le client a déjà cet identifiant d’accès (credential-exists), ou l’identifiant d’accès a été révoqué (credential-revoked).
413Le corps dépasse 5 Mo (payload-too-large).
422La valeur ne peut pas fonctionner pour ce kind (credential-unusable).
429Trop de requêtes pour la clé. Attendez Retry-After secondes.
503Le service n’a pas de clé maîtresse pour sceller une valeur (unavailable).

Ce dont chaque canal a besoin

Dans le bac à sabled’après les sources officielles, vérifié le 2 oct. 2026
CanalCe que le client fournitQui le délivreDurée de validité
PL-KSEFUn jeton KSeF qui permet d’envoyer des factures (InvoiceWrite) et, pour les statuts, de les lire (InvoiceRead). Ses autorisations sont fixées à sa création : tout changement nécessite donc un nouveau jeton. La connexion avec un certificat KSeF n’est pas encore prise en charge. Stocker un identifiant d’accès ksef qui n’est pas un ksef-token renvoie 422, credential-unusable.L’administrateur KSeF du client.Voir la note ci-dessous.
RO-EFACTURAUne autorisation OAuth pour notre application ANAF enregistrée.Une personne disposant des droits SPV pour le CUI du client : le représentant légal ou le comptable. Elle se connecte au portail de l’ANAF avec un certificat qualifié.Le jeton d’accès est valable 90 jours et le jeton de rafraîchissement 365 jours.
PEPPOLLe consentement à l’enregistrement du client comme participant Peppol, et la vérification d’identité que demande le point d’accès.Le client signe le consentement et passe la vérification. Nous détenons la clé du point d’accès : il n’y a donc pas d’identifiant d’accès client à stocker.La clé du point d’accès est la nôtre et nous en assurons la rotation.
FR-PALe propre compte du client sur sa Plateforme Agréée, et des identifiants d’API pour la société.Le client les crée sur sa plateforme, ou nous en donne l’accès.Fixée par la plateforme. Demandez quel type d’identifiant elle délivre.
DE-XRECHNUNGRien pour l’Allemagne elle-même. Par e-mail, la boîte d’envoi. Via Peppol, l’enregistrement auprès du point d’accès.Le client.Sans objet.

Conseil

Renseignez expires_on à partir des dates ci-dessus, pour que l’alerte à 30 jours se déclenche avant l’expiration d’un jeton de rafraîchissement.

Sources : procédure OAuth de l’ANAF (durées de validité des jetons), documentation de l’API KSeF : jetons (autorisations fixées à la création d’un jeton).

Attention

Pologne : les sources divergent sur la durée de validité d’un jeton KSeF. Le manuel du ministère des Finances (édition du 9 févr. 2026) et la page de l’application du contribuable (modifiée le 31 mars 2026) indiquent que les jetons permettent de s’authentifier jusqu’au 31 déc. 2026. La page de questions-réponses du ministère indique qu’il a décidé de conserver les jetons dans KSeF 2.0 sans date de fin (réponse 39). Un ticket public dans le dépôt de l’API KSeF du ministère lui demande de trancher cette divergence. Vérifié le 2 oct. 2026. Tant que ce n’est pas tranché, prévoyez de renouveler le jeton si le ministère fixe une date de fin. La connexion avec un certificat n’est pas encore prise en charge : un jeton est donc le seul accès. Voir le manuel, les questions-réponses et le ticket.

Sur cette page