API REST - Vue d'ensemble

L'API EFact est une API REST versionnée. Toutes les réponses sont au format JSON.

Base URL

EnvironnementURL
Production https://api.efact.itzenata.com
Sandbox / Test https://sandbox.efact.itzenata.com

Versioning

L'API est versionnée via le préfixe d'URL. La version courante est v1 .

Examples
/v1/invoices
/v1/webhook_endpoints

Les versions précédentes restent supportées pendant au moins 12 mois après la publication d'une nouvelle version.

Authentification

Toutes les requêtes doivent inclure la clé API secrète dans le header Authorization :

Secret Key Auth
Authorization: Bearer sk_live_xxx

Pour les requêtes frontend en lecture seule (via client_secret), le header est :

Client Secret Auth
Authorization: Bearer inv_01H..._secret_xxx

Voir Authentification pour le détail complet.

Format des requêtes

  • Content-Type : application/json
  • Encoding : UTF-8
  • Montants : en centimes DH (entiers) - ex : 12000 = 120.00 DH
  • Dates : ISO 8601 avec timezone (2026-04-07T10:00:00Z)
  • IDs : UUIDs v4

Format des réponses

Succès

Success Response
{
  "id": "inv_01HXXX",
  "status": "pending",
  "amount": 12000,
  "currency": "MAD",
  "created_at": "2026-04-07T10:00:00Z"
}

Erreur

Error Response
{
  "error": {
    "code": "invalid_request",
    "message": "Le champ 'customer.ice' est obligatoire.",
    "param": "customer.ice",
    "status": 400
  }
}

Codes de statut HTTP

CodeSignification
200 OKRequête réussie (GET)
201 CreatedRessource créée avec succès (POST)
400 Bad RequestPayload invalide ou champ manquant
401 UnauthorizedClé API manquante ou invalide
403 ForbiddenScope insuffisant (ex : clé publiable sur endpoint d'écriture)
404 Not FoundRessource introuvable (ou n'appartenant pas au tenant courant)
409 ConflictConflit d'idempotency (même idempotency key, payload différent)
422 Unprocessable EntityRègle métier violée (ex : montant négatif)
429 Too Many RequestsRate limiting dépassé
500 Internal Server ErrorErreur côté EFact - support à contacter

Codes d'erreur métier

CodeDescription
invalid_requestChamp manquant ou format invalide
invalid_api_keyClé API non reconnue
api_key_revokedClé API révoquée
resource_not_foundFacture ou webhook introuvable
amount_too_smallMontant inférieur au minimum légal
invalid_iceICE client non conforme (15 chiffres)
dgi_transmission_failedÉchec transmission après 5 tentatives
signature_errorErreur lors de la signature XAdES
idempotency_conflictClé d'idempotency déjà utilisée avec un payload différent

Idempotency

Les requêtes POST acceptent un header optionnel Idempotency-Key pour éviter les doublons en cas de retry réseau :

Idempotency Request
POST /v1/invoices
Idempotency-Key: INV-2026-042-retry-1

Si une requête avec la même clé a déjà réussi, EFact retourne la réponse originale sans créer de doublon. Si le payload est différent, l'API retourne 409 Conflict.

Rate limiting

ScopeLimite
Par clé API secrète100 requêtes / minute
Par clé publiable300 requêtes / minute

Les headers X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset sont inclus dans chaque réponse.

Pagination

Les endpoints de liste utilisent une pagination par curseur :

Pagination Request
GET /v1/invoices?limit=20&starting_after=inv_01HABC

Paramètres

ParamètreTypeDescription
limitintegerNombre de résultats (1-100, défaut : 20)
starting_afterstringID du dernier objet de la page précédente
ending_beforestringID du premier objet (pagination inverse)

Réponse

Pagination Response
{
  "data": [...],
  "has_more": true,
  "next_cursor": "inv_01HXYZ"
}

Endpoints disponibles (V0.1)

MéthodeEndpointDescription
POST/v1/invoicesCréer une facture
GET/v1/invoices/:idRécupérer une facture
GET/v1/invoicesLister les factures du tenant
POST/v1/webhook_endpointsCréer un endpoint webhook
GET/v1/webhook_endpointsLister les endpoints
DELETE/v1/webhook_endpoints/:idSupprimer un endpoint