eFacture Connect : du JSON à la facture signée et déposée chez TTN
Quatre modes disponibles selon votre cas d'usage. Vous pouvez basculer de l'un à l'autre par requête via le champ method (seal, digigo, usb ou mobileid). Le mode E-Houwiya (Mobile ID) s'active chez le service de signature pour chaque compte : demandez-le nous.
Endpoint : POST /einvoices/process
Endpoint : POST /einvoices/prepare
GET /einvoices/{signing_id}signer_email) à renseigner sur le clientEndpoint : POST /einvoices/prepare
GET /einvoices/{signing_id}mobileid)Endpoint : POST /einvoices/prepare
GET /einvoices/{signing_id}Toutes les requêtes nécessitent un header X-Api-Key.
X-Api-Key: ck_test_xxxxxxxxxxxxxxxxxxxxxxxx
Trois clés, et chacune a un rôle :
sk_dev_xxx, votre clé de développeur : elle sert à gérer vos clients (les créer, les raccorder). Elle n'émet aucune facture.ck_test_xxx, la clé sandbox de chacun de vos clients : signature et dépôt réels sur les environnements de TEST (aucune simulation), aucun crédit consommé.ck_live_xxx, la clé de production du même client : signature réelle, dépôt TTN réel, 1 crédit déduit par signature.Chaque facture s'émet avec la clé du client concerné. Pour émettre au nom de votre propre société, créez-vous un client.
POST https://efacturetn.com/api/v1/einvoices/process
X-Api-Key: ck_test_xxxxxxxxxxxx
Content-Type: application/json
{
"invoice_number": "F-2026-001",
"date": "2026-06-13",
"seller": {
"name": "Mon Entreprise SARL",
"tax_id": "1234567MAM000",
"address": "Tunis"
},
"buyer": {
"name": "Client SARL",
"tax_id": "7654321XAM000"
},
"items": [
{ "description": "Service de conseil", "quantity": 1, "unit_price": 500, "vat_rate": 19 }
]
}
{
"success": true,
"data": {
"status": "signed",
"invoice_number": "F-2026-001",
"signing_id": "sg_3c9e1f7a2b4d6e8f0a1b2c3d",
"ttn_reference": "TTN-2026-XXXXX",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIi...",
"pdf_base64": "JVBERi0xLjQKJaqrrK0K...",
"test_mode": true,
"credits_remaining": null
},
"error": null
}
curl -X POST https://efacturetn.com/api/v1/einvoices/process \
-H "X-Api-Key: ck_test_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d @facture.json
Les trois modes suivent le même parcours ; seule la valeur de method change (digigo, usb ou mobileid). Pour DigiGo et E-Houwiya, renseignez d'abord sur le client l'adresse du signataire (signer_email, dans le portail ou par PATCH /api/v1/clients/{id}) : celle de son certificat, à laquelle part la demande de signature.
POST https://efacturetn.com/api/v1/einvoices/prepare
X-Api-Key: ck_test_xxxxxxxxxxxx
Content-Type: application/json
{
"invoice_number": "F-2026-001",
"date": "2026-06-13",
"seller": { ... },
"buyer": { ... },
"items": [ ... ],
"method": "digigo",
"return_url": "https://votre-erp.tn/factures/F-2026-001/retour-signature"
}
Réponse :
{
"success": true,
"data": {
"status": "pending_signature",
"signing_id": "sg_a7f9c21b3e4d8f6a9b2c1d4e",
"signing_url": "https://signature-securisee.tn/sign/xa7f9c21",
"method": "digigo",
"invoice_number": "F-2026-001"
},
"error": null
}
HTTP/1.1 302 Found
Location: https://signature-securisee.tn/sign/xa7f9c21
Backoff exponentiel recommandé : 5s, 10s, 20s, 30s, 60s... Timeout total : 30 minutes.
GET https://efacturetn.com/api/v1/einvoices/sg_a7f9c21b3e4d8f6a9b2c1d4e
X-Api-Key: ck_test_xxxxxxxxxxxx
Quand status: "validated", la réponse contient xml_base64 + pdf_base64 + ttn_reference.
POST /einvoices/prepare. Tant que la signature attend, vous recevez le même lien ("resumed": true), sans seconde transaction ni crédit. GET /einvoices/{signing_id} le donne aussi, dans signing_url.POST /einvoices/{signing_id}/cancel. Rien n'est débité, et le numéro se prépare de nouveau aussitôt. Si le signataire a signé entre-temps, la facture est traitée comme signée, avec un seul crédit.can_prepare_again_at).| Code | HTTP | Description | Action recommandée |
|---|---|---|---|
AUTH_INVALID_KEY | 401 | Clé API invalide ou inactive | Vérifier la clé |
RATE_LIMIT | 429 | Trop de requêtes | Backoff exponentiel, lire X-RateLimit-* |
INVALID_JSON | 400 | Corps non JSON | Corriger le payload |
VALIDATION_FAILED | 422 | Champs requis manquants | Lire error.details |
INSUFFICIENT_CREDITS | 402 | Solde épuisé | Acheter des crédits |
SEAL_NOT_CONFIGURED | 412 | Cachet non provisionné, ou code PIN du cachet manquant | Renseigner seal_passphrase_test / seal_passphrase_prod sur le client |
SIGNER_NOT_CONFIGURED | 412 | Compte de signature du client pas encore créé | Le créer depuis le portail, ou PATCH /api/v1/clients/{id} avec "provision" |
SIGNER_EMAIL_MISSING | 412 | DigiGo ou E-Houwiya sans adresse de signataire | Renseigner signer_email sur le client |
DEVELOPER_KEY_NOT_ALLOWED | 403 | Clé développeur utilisée pour émettre | Utiliser la clé du client (ck_) |
SELLER_MISMATCH | 422 | Le vendeur envoyé n'est pas le titulaire de la clé | Corriger seller.tax_id, ou l'omettre |
INVOICE_IN_PROGRESS | 409 | Une signature attend déjà sur ce numéro, avec un contenu différent | Terminer la signature (error.details.signing_url) ou l'annuler |
INVOICE_NUMBER_ALREADY_ISSUED | 409 | Numéro déjà accepté par TTN pour un autre contenu | Émettre un avoir, ou utiliser un nouveau numéro |
METHOD_REQUIRES_PREPARE | 422 | DigiGo, clé USB ou E-Houwiya demandés sur /einvoices/process | Utiliser /einvoices/prepare |
SIGNING_FAILED | 503 | Service signature down | Réessayer dans 1-2 min |
{
"success": false,
"data": null,
"error": {
"code": "VALIDATION_FAILED",
"message": "Invoice validation failed.",
"details": [
"buyer.tax_id or buyer.id_number is required.",
"item 1: vat_rate is required (set the line vat_rate, a document default_vat_rate, or \"exonerated\": true)."
]
}
}
| Critère | Test (ck_test_) | Production (ck_live_) |
|---|---|---|
| Signature | XAdES réelle, environnement de test du prestataire | XAdES réelle |
| Dépôt TTN | Réel, sur l'environnement de test TTN | Dépôt réel |
| Crédits consommés | Aucun | 1 par signature |
| Compte de signature | Sandbox, créé depuis le portail | Production, créé depuis le portail |
ck_test_ par sa clé ck_live_. Vos clients sont indépendants : l'un peut être en production pendant qu'un autre reste en test.
Tous les codes d'erreur, les champs facultatifs et l'annulation : documentation complète.