Aller au contenu principal

API Kountabl

Accédez à vos données Kountabl par programmation. API REST en lecture seule avec authentification par clé API.

Authentification

Générez une clé API dans Paramètres > Administration > API. Chaque clé commence par le préfixe mk_live_ et est liée à votre entreprise.

Envoyez la clé 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 limitée à 100 requêtes par minute par clé API. Les headers suivants sont inclus dans chaque réponse :

ParamètreTypeRequisDescription
X-RateLimit-LimitnumberNonNombre maximum de requêtes par fenêtre (100)
X-RateLimit-RemainingnumberNonRequêtes restantes dans la fenêtre courante
X-RateLimit-ResetnumberNonTimestamp Unix de la prochaine remise à zéro
Si vous dépassez la limite, l'API retourne un status 429 Too Many Requests avec un header Retry-After indiquant le nombre de secondes à attendre.

Endpoints

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

Factures (Invoices)

GET /api/v1/invoices

GET /api/v1/invoices/:id

ParamètreTypeRequisDescription
pagenumberNonNuméro de page (défaut : 1)
per_pagenumberNonÉléments par page (défaut : 20, max : 100)
statusstringNonFiltrer par statut: draft, final, cancelled
date_fromstringNonDate de début (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)

Exemple de réponse

{
"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

ParamètreTypeRequisDescription
pagenumberNonNuméro de page (défaut : 1)
per_pagenumberNonÉléments par page (défaut : 20, max : 100)
qstringNonRecherche par nom

Devis (Quotes)

GET /api/v1/quotes

GET /api/v1/quotes/:id

ParamètreTypeRequisDescription
pagenumberNonNuméro de page (défaut : 1)
per_pagenumberNonÉléments par page (défaut : 20, max : 100)
statusstringNonFiltrer par statut: draft, sent, accepted, rejected, converted
date_fromstringNonDate de début (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)

Recettes (Revenue)

GET /api/v1/revenue

GET /api/v1/revenue/:id

ParamètreTypeRequisDescription
pagenumberNonNuméro de page (défaut : 1)
per_pagenumberNonÉléments par page (défaut : 20, max : 100)
date_fromstringNonDate de début (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)
payment_methodstringNonFiltrer par méthode de paiement

Dépenses (Expenses)

GET /api/v1/expenses

GET /api/v1/expenses/:id

ParamètreTypeRequisDescription
pagenumberNonNuméro de page (défaut : 1)
per_pagenumberNonÉléments par page (défaut : 20, max : 100)
categorystringNonFiltrer par catégorie de dépense
date_fromstringNonDate de début (YYYY-MM-DD)
date_tostringNonDate de fin (YYYY-MM-DD)

Webhooks

Les webhooks vous permettent de recevoir des notifications en temps reel lorsqu'un événement 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 réponse inclut un champ secret qui ne sera affiché qu'une seule fois. Conservez-le pour vérifier les signatures des payloads.

Gestion des webhooks

GET /api/v1/webhooksLister vos endpoints

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

Types d'événements

ÉvénementDescription
invoice.createdUne facture a été finalisée
invoice.paidUn paiement a été enregistré pour une facture
invoice.cancelledUne facture a été annulée
quote.createdUn devis a été finalisé et envoyé
quote.acceptedUn devis a été accepté par le client
revenue.createdUne recette a été enregistrée
expense.createdUne dépense a été enregistrée
client.createdUn nouveau client a été créé
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"
}

Vérification de signature

Chaque requête webhook inclut un header X-Mokawil-Signature contenant un HMAC-SHA256 du body signé avec votre secret. Vérifiez-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 });
});

Tentatives de renvoi (Retry)

Si votre endpoint ne répond pas avec un status 2xx, Kountabl réessaiera avec un backoff exponentiel :

TentativeDélai
1Immédiate
21 minute
35 minutes
430 minutes
51 heure
62 heures
74 heures
88 heures
912 heures
1024 heures
Après 10 tentatives échouées, la livraison est abandonnée. Les webhooks expirent après 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_errorParamètres de requête invalides
401unauthorizedClé API manquante ou invalide
404not_foundRessource introuvable
429rate_limitedLimite de requêtes atteinte
500server_errorErreur interne du serveur

Votre activité mérite mieux qu'un tableur Excel

Rejoignez les auto-entrepreneurs marocains qui gèrent leur conformité avec confiance grâce à Kountabl.

Sur invitation uniquement

API Documentation - Kountabl