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_hereExemple cURL
curl -H"Authorization: Bearer mk_live_your_key" \
https://kountabl.com/api/v1/invoicesExemple 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 :
| Parametre | Type | Requis | Description |
|---|---|---|---|
| X-RateLimit-Limit | number | Non | Nombre maximum de requetes par fenetre (100) |
| X-RateLimit-Remaining | number | Non | Requetes restantes dans la fenetre courante |
| X-RateLimit-Reset | number | Non | Timestamp Unix de la prochaine remise a zero |
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
| Parametre | Type | Requis | Description |
|---|---|---|---|
| page | number | Non | Numero de page (defaut : 1) |
| per_page | number | Non | Elements par page (defaut : 20, max: 100) |
| status | string | Non | Filtrer par statut: draft, final, cancelled |
| date_from | string | Non | Date de debut (YYYY-MM-DD) |
| date_to | string | Non | Date 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
| Parametre | Type | Requis | Description |
|---|---|---|---|
| page | number | Non | Numero de page (defaut : 1) |
| per_page | number | Non | Elements par page (defaut : 20, max: 100) |
| q | string | Non | Recherche par nom |
Devis (Quotes)
GET /api/v1/quotes
GET /api/v1/quotes/:id
| Parametre | Type | Requis | Description |
|---|---|---|---|
| page | number | Non | Numero de page (defaut : 1) |
| per_page | number | Non | Elements par page (defaut : 20, max: 100) |
| status | string | Non | Filtrer par statut: draft, sent, accepted, rejected, converted |
| date_from | string | Non | Date de debut (YYYY-MM-DD) |
| date_to | string | Non | Date de fin (YYYY-MM-DD) |
Recettes (Revenue)
GET /api/v1/revenue
GET /api/v1/revenue/:id
| Parametre | Type | Requis | Description |
|---|---|---|---|
| page | number | Non | Numero de page (defaut : 1) |
| per_page | number | Non | Elements par page (defaut : 20, max: 100) |
| date_from | string | Non | Date de debut (YYYY-MM-DD) |
| date_to | string | Non | Date de fin (YYYY-MM-DD) |
| payment_method | string | Non | Filtrer par methode de paiement |
Depenses (Expenses)
GET /api/v1/expenses
GET /api/v1/expenses/:id
| Parametre | Type | Requis | Description |
|---|---|---|---|
| page | number | Non | Numero de page (defaut : 1) |
| per_page | number | Non | Elements par page (defaut : 20, max: 100) |
| category | string | Non | Filtrer par categorie de depense |
| date_from | string | Non | Date de debut (YYYY-MM-DD) |
| date_to | string | Non | Date 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"]
}'secret qui ne sera affiche qu'une seule fois. Conservez-le pour verifier les signatures des payloads.Gestion des webhooks
GET /api/v1/webhooks — Lister vos endpoints
DELETE /api/v1/webhooks/:id — Supprimer un endpoint
Types d'evenements
| Evenement | Description |
|---|---|
| invoice.created | Une facture a ete finalisee |
| invoice.paid | Un paiement a ete enregistre pour une facture |
| invoice.cancelled | Une facture a ete annulee |
| quote.created | Un devis a ete finalise et envoye |
| quote.accepted | Un devis a ete accepte par le client |
| revenue.created | Une recette a ete enregistree |
| expense.created | Une depense a ete enregistree |
| client.created | Un nouveau client a ete cree |
| invoice.whatsapp_sent | invoice.whatsapp_sent |
| reminder.whatsapp_sent | reminder.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 :
| Tentative | Delai |
|---|---|
| 1 | Immediate |
| 2 | 1 minute |
| 3 | 5 minutes |
| 4 | 30 minutes |
| 5 | 1 heure |
| 6 | 2 heures |
| 7 | 4 heures |
| 8 | 8 heures |
| 9 | 12 heures |
| 10 | 24 heures |
Erreurs
Les erreurs utilisent une enveloppe standard :
{
"error": {
"code":"unauthorized",
"message":"Invalid or missing API key"
}
}Codes d'erreur
| Status HTTP | Code | Description |
|---|---|---|
| 400 | validation_error | Parametres de requete invalides |
| 401 | unauthorized | Cle API manquante ou invalide |
| 404 | not_found | Ressource introuvable |
| 429 | rate_limited | Limite de requetes atteinte |
| 500 | server_error | Erreur interne du serveur |