Aller au contenu principal

API Kountabl

Accedez a vos donnees Kountabl par programmation. API REST en lecture seule avec authentification par cle API.

Authentification

Generez une cle API dans Parametres > Administration > API. Chaque cle commence par le prefixe mk_live_ et est liee a votre entreprise.

Envoyez la cle dans le header Authorization :

Authorization: Bearer mk_live_your_api_key_here

Exemple cURL

curl -H"Authorization: Bearer mk_live_your_key" \
 https://kountabl.com/api/v1/invoices

Exemple JavaScript

const res = await fetch('https://kountabl.com/api/v1/invoices', {
 headers: {
 'Authorization': 'Bearer mk_live_your_key',
 'Content-Type': 'application/json',
 },
});

const { data, meta } = await res.json();
console.log(data); // Array of invoices
console.log(meta); // { page, per_page, total, total_pages }

Rate Limiting

L'API est limitee a 100 requetes par minute par cle API. Les headers suivants sont inclus dans chaque reponse :

ParametreTypeRequisDescription
X-RateLimit-LimitnumberNonNombre maximum de requetes par fenetre (100)
X-RateLimit-RemainingnumberNonRequetes restantes dans la fenetre courante
X-RateLimit-ResetnumberNonTimestamp Unix de la prochaine remise a zero
Si vous depassez la limite, l'API retourne un status 429 Too Many Requests avec un header Retry-After indiquant le nombre de secondes a attendre.

Endpoints

Tous les endpoints suivent le format /api/v1/{entity}. Les reponses utilisent une enveloppe standard avec data et meta.

Factures (Invoices)

GET /api/v1/invoices

GET /api/v1/invoices/:id

ParametreTypeRequisDescription
pagenumberNonNumero de page (defaut : 1)
per_pagenumberNonElements par page (defaut : 20, max: 100)
statusstringNonFiltrer par statut: draft, final, cancelled
date_fromstringNonDate de debut (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)

Exemple de reponse

{
"data": [
 {
"id":"a1b2c3d4-...",
"invoice_number":"2026-0001",
"status":"final",
"issue_date":"2026-03-01",
"due_date":"2026-04-01",
"buyer_name":"ACME SARL",
"total_ht":"5000.00",
"created_at":"2026-03-01T10:00:00Z"
 }
 ],
"meta": {
"page": 1,
"per_page": 20,
"total": 42,
"total_pages": 3
 }
}

Clients

GET /api/v1/clients

GET /api/v1/clients/:id

ParametreTypeRequisDescription
pagenumberNonNumero de page (defaut : 1)
per_pagenumberNonElements par page (defaut : 20, max: 100)
qstringNonRecherche par nom

Devis (Quotes)

GET /api/v1/quotes

GET /api/v1/quotes/:id

ParametreTypeRequisDescription
pagenumberNonNumero de page (defaut : 1)
per_pagenumberNonElements par page (defaut : 20, max: 100)
statusstringNonFiltrer par statut: draft, sent, accepted, rejected, converted
date_fromstringNonDate de debut (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)

Recettes (Revenue)

GET /api/v1/revenue

GET /api/v1/revenue/:id

ParametreTypeRequisDescription
pagenumberNonNumero de page (defaut : 1)
per_pagenumberNonElements par page (defaut : 20, max: 100)
date_fromstringNonDate de debut (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)
payment_methodstringNonFiltrer par methode de paiement

Depenses (Expenses)

GET /api/v1/expenses

GET /api/v1/expenses/:id

ParametreTypeRequisDescription
pagenumberNonNumero de page (defaut : 1)
per_pagenumberNonElements par page (defaut : 20, max: 100)
categorystringNonFiltrer par categorie de depense
date_fromstringNonDate de debut (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)

Webhooks

Les webhooks vous permettent de recevoir des notifications en temps reel lorsqu'un evenement se produit dans votre compte Kountabl.

Enregistrement

Enregistrez un endpoint webhook via l'API :

curl -X POST https://kountabl.com/api/v1/webhooks \
 -H"Authorization: Bearer mk_live_your_key" \
 -H"Content-Type: application/json" \
 -d '{
"url":"https://your-server.com/webhooks/kountabl",
"events": ["invoice.created","invoice.paid"]
 }'
La reponse inclut un champ secret qui ne sera affiche qu'une seule fois. Conservez-le pour verifier les signatures des payloads.

Gestion des webhooks

GET /api/v1/webhooksLister vos endpoints

DELETE /api/v1/webhooks/:idSupprimer un endpoint

Types d'evenements

EvenementDescription
invoice.createdUne facture a ete finalisee
invoice.paidUn paiement a ete enregistre pour une facture
invoice.cancelledUne facture a ete annulee
quote.createdUn devis a ete finalise et envoye
quote.acceptedUn devis a ete accepte par le client
revenue.createdUne recette a ete enregistree
expense.createdUne depense a ete enregistree
client.createdUn nouveau client a ete cree
invoice.whatsapp_sentinvoice.whatsapp_sent
reminder.whatsapp_sentreminder.whatsapp_sent

Format du payload

{
"event":"invoice.created",
"timestamp":"2026-03-23T10:00:00.000Z",
"data": {
"id":"a1b2c3d4-...",
"invoice_number":"2026-0001",
"status":"final",
"total_ht":"5000.00",
"issue_date":"2026-03-01"
 },
"idempotency_key":"f47ac10b-58cc-4372-a567-0e02b2c3d479"
}

Verification de signature

Chaque requete webhook inclut un header X-Mokawil-Signature contenant un HMAC-SHA256 du body signe avec votre secret. Verifiez-le avant de traiter le payload :

import { createHmac, timingSafeEqual } from 'crypto';

function verifyWebhookSignature(body, signature, secret) {
 const expected = createHmac('sha256', secret)
 .update(body)
 .digest('hex');

 const sig = Buffer.from(signature, 'hex');
 const exp = Buffer.from(expected, 'hex');

 return sig.length === exp.length && timingSafeEqual(sig, exp);
}

// In your webhook handler:
app.post('/webhooks/kountabl', (req, res) => {
 const signature = req.headers['x-mokawil-signature'];
 const isValid = verifyWebhookSignature(
 JSON.stringify(req.body),
 signature,
 process.env.KOUNTABL_WEBHOOK_SECRET
 );

 if (!isValid) {
 return res.status(401).json({ error: 'Invalid signature' });
 }

 // Process the webhook event
 const { event, data } = req.body;
 console.log('Received event:', event, data);

 res.status(200).json({ received: true });
});

Retentatives (Retry)

Si votre endpoint ne repond pas avec un status 2xx, Kountabl reessaiera avec un backoff exponentiel :

TentativeDelai
1Immediate
21 minute
35 minutes
430 minutes
51 heure
62 heures
74 heures
88 heures
912 heures
1024 heures
Apres 10 tentatives echouees, la livraison est abandonnee. Les webhooks expirent apres un timeout de 5 secondes.

Erreurs

Les erreurs utilisent une enveloppe standard :

{
"error": {
"code":"unauthorized",
"message":"Invalid or missing API key"
 }
}

Codes d'erreur

Status HTTPCodeDescription
400validation_errorParametres de requete invalides
401unauthorizedCle API manquante ou invalide
404not_foundRessource introuvable
429rate_limitedLimite de requetes atteinte
500server_errorErreur interne du serveur