Skip to Content
TCC ServerCertifier une facture

Certifier une facture

Certifie une facture de façon synchrone : la réponse HTTP contient directement la signature, le QR code et l’horodatage. Aucun callback ni polling.

Authentification : clé API — voir Authentification.

Endpoint

URL : POST /api/v1/invoices/certify
Hôte : votre TCC Server (ex. http://localhost:23109 en local, ou https://<votre-serveur> via reverse proxy en production)

POST http://localhost:23109/api/v1/invoices/certify Content-Type: application/json Authorization: ApiKey ak_votre_cle_ici

Corps de la requête

Les champs sont en camelCase (ex. invoiceId, recipientType).

Identification de la facture

ChampTypeObligatoireContraintes / Description
invoiceIdstring✅Max 23 caractères, unique. Un ID déjà certifié est rejeté (409).
invoiceTypestring✅salesInvoice ou creditNote.
invoiceSubjectstring❌Objet de la facture.
invoiceDueDatestring❌Format YYYY-MM-DD.
referenceInvoiceIdstringConditionnelMax 23. Obligatoire si invoiceType = creditNote (facture d’origine).

Destinataire

ChampTypeObligatoireContraintes
recipientTypestring✅individual, business, government, foreign (détermine les champs obligatoires).
recipientNamestringConditionnelNom ou raison sociale.
recipientNiustringConditionnelExactement 16 ou 17 caractères.
recipientAddressstringConditionnelMax 250.
recipientPhonestringConditionnelFormat Congo ou E.164.
recipientEmailstringConditionnelEmail valide.
isRecipientTaxableboolean✅true / false.

Montants

Tous de type number (décimal, précision 15, échelle 2) et obligatoires — envoyez 0 si non applicable.

ChampDescription
subtotalSous-total HT (= somme des netAmount des items).
totalTaxTAmountTVA au taux normal [T] (18%).
totalTaxRAmountTVA au taux réduit [R] (5%).
totalExemptAmountMontant total exonéré.
totalTaxAmountTotal de la TVA.
discountAmountEscompte — remise globale (niveau facture).
totalLineDiscountAmountSomme des remises de tous les items (Σ items[].discountAmount).
additionalCentTaxTaxe additionnelle (centimes).
electronicStampDutyDroit de timbre électronique — doit être 0 (non calculé par le contribuable).
totalAmountMontant total TTC.
amountDueMontant restant dû.

discountAmount (Escompte) et totalLineDiscountAmount (Total Remises) sont deux remises distinctes, affichées sur deux lignes séparées de la facture. totalLineDiscountAmount doit être la somme des remises de tous les items (Σ items[].discountAmount), pas celle d’un seul item.

Paiement

ChampTypeObligatoireContraintes
currencystring✅XAF, USD ou EUR.
paymentMethodstring✅bank_transfer, card, cash, mobile_money, cheque.
paymentReferencestring❌Max 100.
paymentDatestring❌Format YYYY-MM-DDTHH:mm:ss.

Vendeur & références (optionnels)

sellerAddress, sellerTaxRegime, sellerBankIban, sellerBankRib, cashierName, logoImg, sciet, externalCreditNoteNumber, originalSfecInvoiceNumber, notes.

Lignes (items) — minimum 1

ChampTypeObligatoireContraintes
designationstring✅Max 500.
classificationCodestring❌Max 20.
typestring✅product ou service.
unitPricenumber✅≥ 0.01.
quantitynumber✅≥ 0.001 (3 décimales max).
subtotalnumber✅= unitPrice × quantity.
discountAmountnumber✅≥ 0.
discountTypestring✅fixed ou percentage.
netAmountnumber✅= subtotal − discountAmount.
taxRatestring✅Max 10 (ex. "19.25", "0" pour exonéré).
taxAmountnumber✅Montant de la taxe calculée.
totalAmountnumber✅= netAmount + taxAmount.

Taxes additionnelles (additionalTaxes, optionnel)

ChampTypeObligatoire
taxCodestring✅
taxLabelstring❌
taxAmountnumber✅
taxRatenumber❌

Validation

Champs destinataire obligatoires par type

Champindividualbusinessgovernmentforeign
recipientNameOptionnelObligatoireObligatoireObligatoire
recipientNiuOptionnelObligatoireObligatoireOptionnel
recipientPhoneOptionnelObligatoireObligatoireObligatoire
recipientEmailOptionnelObligatoireObligatoireObligatoire
recipientAddressOptionnelObligatoireObligatoireObligatoire

Même optionnel, un champ fourni doit respecter son format. NIU : 16–17 caractères · Téléphone Congo : +242 0[4-6]XXXXXXX ou 0[4-6]XXXXXXX · International : E.164 · Montants : précision 15, échelle 2 · Quantités : précision 10, échelle 3.

Énumérations

  • invoiceType : salesInvoice, creditNote
  • recipientType : individual, business, government, foreign
  • paymentMethod : bank_transfer, card, cash, mobile_money, cheque
  • type (items) : product, service
  • discountType : fixed, percentage

Réponse — 200 OK

{ "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "invoiceId": "FAC-2026-001234", "certificationStatus": "certified", "certificationDate": "2026-04-24T14:30:45.123", "certificationSignature": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2", "certificationShortSignature": "A1B2C3D4E5F6A1B2C3D4", "certificationQrCode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...", "message": "Invoice certified successfully" }
ChampDescription
idUUID interne attribué par le TCC Server.
certificationSignatureSignature complète (64 hexadécimaux, HMAC-SHA256).
certificationShortSignatureSignature abrégée (20 hexadécimaux) — à imprimer.
certificationQrCodeQR code (Data URL PNG 200×200) — à imprimer.
certificationDateHorodatage NTP (ISO 8601) — à imprimer.

À imprimer sur la facture : certificationShortSignature, certificationQrCode et certificationDate.

Codes d’erreur

CodeerrorSignification
200—Certification réussie.
400validation_errorDonnées invalides (détails dans errors[]).
400invalid_requestCorps de requête mal formé.
401unauthorizedClé API absente ou invalide.
404not_foundFacture introuvable.
409duplicateFacture déjà certifiée — ne pas re-soumettre (émettre un avoir).
500internal_errorErreur interne — réessayer après quelques secondes.

Exemple d’erreur de validation :

{ "error": "validation_error", "message": "Validation failed", "errors": [ { "field": "invoiceId", "message": "Invoice ID is required" }, { "field": "items[0].subtotal", "message": "Item subtotal is incoherent" } ] }

Exemple — vente à une entreprise

curl -X POST http://localhost:23109/api/v1/invoices/certify \ -H "Content-Type: application/json" \ -H "Authorization: ApiKey ak_votre_cle_ici" \ -d '{ "invoiceId": "FAC-2026-001234", "invoiceType": "salesInvoice", "recipientType": "business", "recipientName": "Société XYZ SARL", "recipientNiu": "M202600001234567", "recipientAddress": "123 Avenue de la Paix, Brazzaville", "recipientPhone": "+24206XXXXXXX", "recipientEmail": "comptabilite@xyz-sarl.cg", "isRecipientTaxable": true, "subtotal": 1000000.00, "totalTaxTAmount": 192500.00, "totalTaxRAmount": 0.00, "totalExemptAmount": 0.00, "totalTaxAmount": 192500.00, "discountAmount": 0.00, "totalLineDiscountAmount": 0.00, "additionalCentTax": 0.00, "electronicStampDuty": 0.00, "totalAmount": 1192500.00, "amountDue": 1192500.00, "currency": "XAF", "paymentMethod": "bank_transfer", "items": [ { "designation": "Ramettes de papier A4 (carton de 5)", "type": "product", "unitPrice": 25000.00, "quantity": 20.000, "subtotal": 500000.00, "discountAmount": 0.00, "discountType": "fixed", "netAmount": 500000.00, "taxRate": "19.25", "taxAmount": 96250.00, "totalAmount": 596250.00 } ] }'

Étape suivante → Consulter les factures