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
invoiceIdstringMax 23 caractères, unique. Un ID déjà certifié est rejeté (409).
invoiceTypestringsalesInvoice ou creditNote.
invoiceSubjectstringObjet de la facture.
invoiceDueDatestringFormat YYYY-MM-DD.
referenceInvoiceIdstringConditionnelMax 23. Obligatoire si invoiceType = creditNote (facture d’origine).

Destinataire

ChampTypeObligatoireContraintes
recipientTypestringindividual, 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.
isRecipientTaxablebooleantrue / 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
currencystringXAF, USD ou EUR.
paymentMethodstringbank_transfer, card, cash, mobile_money, cheque.
paymentReferencestringMax 100.
paymentDatestringFormat 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
designationstringMax 500.
classificationCodestringMax 20.
typestringproduct ou service.
unitPricenumber≥ 0.01.
quantitynumber≥ 0.001 (3 décimales max).
subtotalnumber= unitPrice × quantity.
discountAmountnumber≥ 0.
discountTypestringfixed ou percentage.
netAmountnumber= subtotaldiscountAmount.
taxRatestringMax 10 (ex. "19.25", "0" pour exonéré).
taxAmountnumberMontant 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
200Certification 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