Développeurs

L'API Kompta

Reliez Kompta à vos autres outils : lisez vos clients, devis et factures, et créez des brouillons automatiquement depuis Zapier, Make, votre site internet ou votre CRM.

Inclus dans les plans Solo et Équipe · API REST · JSON

Une clé par outil

Créée dans Kompta, révocable à tout moment, en lecture seule ou en lecture et création.

Vos données seulement

Une clé donne accès à une seule entreprise, jamais aux autres.

Rien ne part tout seul

L'API crée des brouillons. L'envoi au client reste toujours votre décision, dans Kompta.

Simple à brancher

REST, JSON, une seule en-tête d'authentification. Un appel curl suffit pour tester.

Démarrer en 3 minutes

  1. 1. Créez une clé

    Dans Kompta, menu Plus d'outils → API. Donnez-lui le nom de l'outil qui l'utilisera et choisissez ses droits. La clé commence par kpt_ et n'est affichée qu'une seule fois : copiez-la tout de suite.

  2. 2. Testez-la

    Terminal

    curl https://kompta.pro/api/v1/me \
      -H "Authorization: Bearer kpt_votre_cle"
  3. 3. Créez un devis en brouillon

    Requête

    curl -X POST https://kompta.pro/api/v1/quotes \
      -H "Authorization: Bearer $KOMPTA_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "client_id": "3c1f6a2e-8b4d-4f7a-9e21-5d0c7b9a1f42",
        "validity_date": "2026-12-31",
        "items": [
          { "description": "Dépose et pose de carrelage", "quantity": 12, "unit": "m²", "unit_price": 45, "vat_rate": 10 },
          { "description": "Plinthes assorties", "quantity": 14, "unit": "ml", "unit_price": 12, "vat_rate": 10 }
        ],
        "notes": "Demande reçue via le formulaire du site"
      }'

    Réponse

    HTTP/1.1 201 Created
    
    {
      "data": {
        "id": "9b2e…",
        "quote_number": "DEV-2026-00042",
        "quote_date": "2026-11-09",
        "status": "draft",
        "amount_ht": 708,
        "vat_amount": 70.8,
        "amount_ttc": 778.8,
        "client": { "id": "3c1f…", "name": "MARTIN Julie" },
        "items": [ … ],
        …
      }
    }

    Le devis apparaît aussitôt dans Kompta, numéroté, au statut brouillon. Vous le relisez et l'envoyez vous-même à votre client.

Conventions

Adresse et authentification

Toutes les requêtes passent par https://kompta.pro/api/v1, en HTTPS, avec l'en-tête Authorization: Bearer kpt_…. Gardez la clé côté serveur : ne la mettez jamais dans le code d'une page web ou d'une application mobile.

Pagination

Les listes acceptent limit (1 à 100, 50 par défaut) et offset. La réponse indique le total et s'il reste des éléments.

GET /invoices?status=paid&from=2026-01-01&limit=50

{
  "data": [ { "id": "…", "invoice_number": "FAC-2026-00012", "status": "paid", "amount_ttc": 1250, … } ],
  "pagination": { "limit": 50, "offset": 0, "total": 134, "has_more": true }
}

Filtres

  • from / to : dates AAAA-MM-JJ, sur la date du document.
  • client_id : devis ou factures d'un client.
  • q : recherche texte (clients, prospects, catalogue), 2 caractères minimum.
  • stage des prospects : nouveau, contacte, devis_envoye, negociation, gagne, perdu ; archived=true pour les archivés.
  • status des devis : draft, sent, accepted, refused, invoiced, expired, cancelled.
  • status des factures : draft, pending, sent, paid, overdue, cancelled, irrecoverable.

Pas de doublon (idempotence)

Ajoutez à une création l'en-tête Idempotency-Key avec une valeur unique (un UUID par exemple). Si votre outil renvoie la même requête (coupure réseau, nouvel essai automatique), Kompta ne crée rien de plus et renvoie la réponse d'origine, avec l'en-tête Idempotent-Replayed: true. Fortement conseillé pour les factures, qui consomment un numéro. La clé est retenue 24 heures.

En-tête

Idempotency-Key: 6f1c2a9e-7b1d-4c2e-9a5f-1d2c3b4a5e6f

Limites

120 requêtes par minute et par clé, dont 30 créations. Au-delà, la réponse 429 indique dans Retry-After combien de secondes attendre.

Erreurs

Une erreur renvoie toujours un code HTTP et un objet error avec un code stable, à tester dans votre programme, et un message en français.

Exemple

HTTP/1.1 422 Unprocessable Entity

{
  "error": {
    "code": "validation_error",
    "message": "items.0.unit_price : doit être supérieur ou égal à 0",
    "docs": "https://kompta.pro/developpeurs"
  }
}
400invalid_parameter / invalid_jsonParamètre de liste ou corps JSON mal formé.
401missing_api_key / invalid_api_keyClé absente, inconnue ou révoquée.
403insufficient_scopeClé en lecture seule utilisée pour créer.
403plan_requiredL'abonnement de l'entreprise ne comprend plus l'API.
403plan_limit_reachedQuota mensuel de devis ou de factures atteint.
404not_foundRessource inexistante ou appartenant à une autre entreprise.
409idempotency_conflictUne requête avec la même Idempotency-Key est encore en cours.
415unsupported_media_typeCorps envoyé sans « Content-Type: application/json ».
422validation_errorChamp manquant, invalide ou inconnu : le message indique lequel.
422idempotency_key_reusedIdempotency-Key déjà utilisée pour un autre contenu.
429rate_limitedTrop de requêtes : attendez le nombre de secondes de l'en-tête Retry-After.
500internal_errorErreur de notre côté : réessayez plus tard.

Référence

Adresses relatives à https://kompta.pro/api/v1.

Compte

  • GET/me

    Entreprise, abonnement et droits de la clé. Idéal pour tester une clé.

Clients

  • GET/clients

    Liste des clients, du plus récent au plus ancien.

    Paramètres : limit, offset, q (nom ou email)

  • GET/clients/{id}

    Un client.

  • POST/clientsclé « Lecture et création »

    Crée une fiche client.

Devis

  • GET/quotes

    Liste des devis, par date de devis décroissante.

    Paramètres : limit, offset, status, from, to, client_id

  • GET/quotes/{id}

    Un devis, avec ses lignes.

  • POST/quotesclé « Lecture et création »

    Crée un devis en brouillon.

Factures clients

  • GET/invoices

    Liste des factures clients, par date de facture décroissante.

    Paramètres : limit, offset, status, from, to, client_id

  • GET/invoices/{id}

    Une facture client, avec ses lignes.

  • GET/invoices/{id}/pdf

    Le PDF Factur-X de la facture, identique à celui de l'application.

  • POST/invoicesclé « Lecture et création »

    Crée une facture en brouillon.

Factures fournisseurs

  • GET/supplier-invoices

    Liste des factures fournisseurs (achats).

    Paramètres : limit, offset, from, to

  • GET/supplier-invoices/{id}

    Une facture fournisseur.

Prospects

  • GET/prospects

    Pipeline commercial, hors prospects archivés.

    Paramètres : limit, offset, stage, q, archived

  • GET/prospects/{id}

    Un prospect.

  • POST/prospectsclé « Lecture et création »

    Ajoute un prospect à l'étape « nouveau » (ex. formulaire de votre site).

Catalogue

  • GET/catalog-items

    Articles et ouvrages du catalogue.

    Paramètres : limit, offset, q

  • GET/catalog-items/{id}

    Un article.

  • POST/catalog-itemsclé « Lecture et création »

    Ajoute un article simple.

Webhooks

  • GET/webhooks

    Adresses abonnées aux événements (sans leur secret).

  • POST/webhooksclé « Lecture et création »

    Abonne une adresse à des événements. Le secret de signature n'est renvoyé qu'ici.

  • DELETE/webhooks/{id}clé « Lecture et création »

    Désabonne une adresse.

Champs de création

Les champs inconnus sont refusés : une faute de frappe donne une erreur claire au lieu d'être ignorée.

POST /clients

name (obligatoire), email, phone, address, siret (14 chiffres), country (code à 2 lettres, FR par défaut).

POST /quotes

items (obligatoire), client_id, quote_date (aujourd'hui par défaut), validity_date, notes, deposit_percent, payment_terms_days (30 par défaut), planned_start_date, planned_duration_days.

POST /invoices

items (obligatoire), client_id, invoice_date (aujourd'hui par défaut), due_date, notes, is_reverse_charge (autoliquidation, TVA à 0).

POST /prospects

contact_name (obligatoire), company_name, email, phone, address, notes, estimated_amount (HT), next_action_at.

POST /catalog-items

label, unit_price (HT) et vat_rate obligatoires ; details, unit (u par défaut), category.

POST /webhooks

url (https, serveur public) et events (liste) obligatoires ; description.

Une ligne (items)

description, quantity, unit_price (HT, positif) et vat_rate (en %, ex. 20, 10, 5.5) obligatoires ; unit et details facultatifs. Sur un devis seulement, optional: true propose une ligne en option. Les totaux sont toujours recalculés par Kompta.

Webhooks

Plutôt que d'interroger l'API en boucle, laissez Kompta vous prévenir : une requête POST part vers votre adresse dès qu'un événement se produit.

Événements

  • quote.signed : devis signé par le client.
  • quote.refused : devis refusé par le client.
  • invoice.paid : facture payée.
  • prospect.created : nouveau prospect (site vitrine, saisie manuelle, API).

Ajoutez une adresse dans Kompta (Plus d'outils → API) ou par POST /webhooks. Le bouton « Tester » envoie un événement ping.

Contenu envoyé

L'objet concerné, avec les mêmes champs que l'API. Les en-têtes Kompta-Event, Kompta-Event-Id et Kompta-Signature accompagnent chaque envoi.

POST vers votre adresse

Kompta-Event: quote.signed
Kompta-Event-Id: 0f6b1c7e-…
Kompta-Signature: t=1762700000,v1=5f2c…

{
  "id": "0f6b1c7e-…",
  "type": "quote.signed",
  "created_at": "2026-11-09T14:12:03.120Z",
  "data": {
    "object": {
      "id": "9b2e…",
      "quote_number": "DEV-2026-00042",
      "status": "accepted",
      "amount_ttc": 778.8,
      "signed_at": "2026-11-09T14:12:02.884Z",
      "client": { "id": "3c1f…", "name": "MARTIN Julie" },
      …
    }
  }
}

Vérifier la signature

Kompta-Signature: t=…,v1=… : v1 est le HMAC-SHA256, avec le secret de l'adresse (whsec_…), de t + "." + corps brut. Refusez une signature fausse ou trop ancienne.

Node.js

import crypto from "node:crypto";

// rawBody : le corps EXACT reçu (texte), avant tout JSON.parse.
function verifyKomptaSignature(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${parts.t}.${rawBody}`)
    .digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  const a = Buffer.from(expected);
  const b = Buffer.from(parts.v1 ?? "");
  return fresh && a.length === b.length && crypto.timingSafeEqual(a, b);
}

Réponse et nouvelles tentatives

Répondez par un code 2xx en moins de 10 secondes. Sinon, Kompta réessaie après 1 min, 5 min, 30 min, 2 h, 6 h puis 24 h. Les redirections ne sont pas suivies. Après 30 échecs d'affilée, l'adresse est désactivée : vous la réactivez en un clic dans Kompta. Un même événement peut arriver deux fois : dédoublonnez sur Kompta-Event-Id.

Avec Zapier ou Make

Sans écrire de code : créez un déclencheur « Webhooks by Zapier → Catch Hook » ou, dans Make, un module « Webhooks → Custom webhook », puis collez l'adresse obtenue dans Kompta. Pour les actions (créer un client, un devis…), utilisez le module HTTP avec votre clé API.

Kompta dans votre assistant IA (MCP)

Kompta parle le Model Context Protocol : reliez-le à Claude, Cursor ou tout outil compatible, et posez vos questions en français.

  • • « Combien j'ai facturé ce mois-ci, et qu'est-ce qui reste à encaisser ? »
  • • « Quels devis attendent encore une signature ? »
  • • « Prépare un devis pour Mme Martin : 12 m² de carrelage à 45 € HT, TVA 10 %. »

Avec votre compte Kompta (recommandé)

Dans Claude ou un autre assistant compatible, ajoutez un connecteur personnalisé avec l'adresse https://kompta.pro/api/mcp. L'assistant vous envoie sur Kompta : vous vous connectez, choisissez « Lecture » ou « Lecture et brouillons », puis cliquez sur « Autoriser ». Aucune clé à copier ; vous coupez l'accès quand vous voulez depuis Plus d'outils → API.

Fonctionne avec Claude, ChatGPT (connecteurs personnalisés) et Cursor. Ajouter à Cursor en un clic.

Pour les développeurs : OAuth 2.1 avec PKCE (S256) et enregistrement dynamique des clients. Métadonnées sur /.well-known/oauth-protected-resource et /.well-known/oauth-authorization-server.

Avec une clé API

Pour les outils qui acceptent un en-tête : Authorization: Bearer kpt_…. Une clé en lecture seule ne donne accès qu'aux questions ; une clé « Lecture et création » permet aussi de préparer des brouillons, jamais de les envoyer.

Claude Code

claude mcp add --transport http kompta https://kompta.pro/api/mcp \
  --header "Authorization: Bearer kpt_votre_cle"

Cursor, Claude Desktop… (fichier de configuration MCP)

{
  "mcpServers": {
    "kompta": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://kompta.pro/api/mcp",
               "--header", "Authorization: Bearer kpt_votre_cle"]
    }
  }
}

Outils disponibles : synthèse d'activité, clients, devis, factures, factures fournisseurs, prospects, catalogue, et la préparation de brouillons.

Ce que l'API ne fait pas (encore)

  • • Elle n'envoie rien : ni email au client, ni transmission par la plateforme agréée. Un document créé par l'API reste un brouillon jusqu'à ce que vous l'envoyiez depuis Kompta.
  • • Elle ne modifie ni ne supprime : pas de changement de statut, pas de marquage « payée ».
  • • Pas de PDF de devis par l'API : le devis se consulte et s'imprime depuis Kompta.
  • • Un devis ou une facture créé reçoit son numéro tout de suite, comme dans l'application.

Un besoin qui n'est pas couvert ? Écrivez-nous : l'API évolue avec les demandes de ses utilisateurs.