API REST · v1

Connectez BLEME à vos outils

Lisez et créez des dossiers, poussez vos factures impayées, et recevez les événements en temps réel. Une API REST simple, authentifiée par clé, strictement limitée à votre organisation.

Introduction

Toutes les requêtes se font en HTTPS vers la base ci-dessous. Les réponses sont en JSON (UTF-8). Les montants sont toujours en centimes (entiers), les dates en ISO 8601.

Base URL
https://bleme.fr/api/v1

L’envoi de courrier n’est jamais accessible par l’API. Valider et expédier une relance ou une mise en demeure exige une validation humaine tracée (pilier juridique de BLEME). L’API permet de lire les courriers et leur suivi, et de créer des dossiers en brouillon — jamais de déclencher un envoi.

Démarrage rapide

  1. 1. Dans BLEME, ouvrez Paramètres → Clés API et créez une clé en cochant les droits voulus.
  2. 2. Copiez la clé blm_live_… — elle n’est affichée qu’une seule fois.
  3. 3. Passez-la dans l’en-tête Authorization de chaque requête.
cURL
curl https://bleme.fr/api/v1/cases \
  -H "Authorization: Bearer $BLEME_KEY"

L’API et les webhooks font partie du forfait Pro.

Authentification

Chaque requête porte l’en-tête Authorization: Bearer VOTRE_CLÉ. La clé est liée à une organisation et à un jeu de droits (scopes) figé à sa création — elle ne peut rien faire de plus que ces droits, même si vous êtes propriétaire.

DroitPermet
cases.viewLire les dossiers, leurs courriers et le suivi
cases.createCréer des dossiers
compta.viewLire les factures importées
compta.managePousser des factures (et créer le dossier lié)

Une clé se révoque à tout moment depuis le même écran ; elle est aussi révoquée automatiquement si son créateur perd l’accès à l’organisation.

Conventions

Pagination

Les listes sont paginées par curseur. Chaque réponse renvoie data et next_cursor (ou null en fin de liste). Passez ce curseur au paramètre cursor de la requête suivante. limit : 25 par défaut, 100 maximum.

JSON
{
  "data": [ /* … */ ],
  "next_cursor": "eyJ…"
}

Erreurs

Les erreurs renvoient un statut HTTP et un corps normalisé { "error": { "code", "message" } }.

HTTPcodeSignification
401unauthorizedClé absente, invalide, expirée ou révoquée.
403forbiddenLa clé n’a pas le droit (scope) requis pour cet appel.
404not_foundRessource introuvable (ou hors de votre organisation).
413payload_too_largeCorps de requête trop volumineux.
422invalid_requestCorps invalide (détails dans error.details).
429rate_limitedTrop de requêtes — voir l’en-tête Retry-After.
500internalErreur interne. Réessayez.

Limites

120 requêtes par minute et par clé. Au-delà, réponse 429 avec l’en-tête Retry-After (secondes).

Dossiers

GET/v1/casesdroit cases.view

Liste des dossiers. Filtres : status, case_type (unpaid_invoice, client_dispute, admin_request). Pagination par cursor.

cURL
curl "https://bleme.fr/api/v1/cases?status=active&limit=50" \
  -H "Authorization: Bearer $BLEME_KEY"
GET/v1/cases/{id}droit cases.view

Détail d’un dossier : ses informations, ses courriers, ses pièces (métadonnées) et sa chronologie. Renvoie 404 si le dossier n’appartient pas à votre organisation.

POST/v1/casesdroit cases.create

Crée un dossier en brouillon (aucun courrier, aucun envoi). Champs : case_type et debtor_name requis ; amount_claimed_cents, title, summary, debtor_siren, debtor_email optionnels.

cURL
curl -X POST https://bleme.fr/api/v1/cases \
  -H "Authorization: Bearer $BLEME_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "case_type": "unpaid_invoice",
    "debtor_name": "SARL Dupont",
    "amount_claimed_cents": 240000,
    "debtor_email": "compta@dupont.fr"
  }'

Courriers & suivi

GET/v1/cases/{id}/lettersdroit cases.view

Les courriers d’un dossier (relances, mise en demeure…) et, pour chacun, son suivi d’acheminement (tracking : remis, distribué, ouvert, réponse reçue…). Lecture seule : l’envoi n’est pas disponible par l’API.

Factures

GET/v1/invoicesdroit compta.view

Liste des factures importées. Filtres : paid, archived, provider.

POST/v1/invoicesdroit compta.manage

Pousse une facture dans BLEME. Idempotent sur external_id : rejouer le même identifiant met à jour la facture, sans doublon. Avec create_case: true (et le droit cases.create), un dossier est créé et lié en un clic ; un pdf_base64 optionnel est joint comme pièce. La réponse renvoie case_id et, le cas échéant, pdf_attached.

cURL
curl -X POST https://bleme.fr/api/v1/invoices \
  -H "Authorization: Bearer $BLEME_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "F-2026-042",
    "customer_name": "SARL Dupont",
    "customer_email": "compta@dupont.fr",
    "remaining_cents": 240000,
    "deadline_on": "2026-05-30",
    "create_case": true
  }'

Webhooks

Plutôt que d’interroger l’API en boucle, laissez BLEME notifier votre outil quand un événement se produit. Créez un endpoint dans Paramètres → Webhooks (URL en https), choisissez les événements, et copiez le secret de signature (affiché une fois).

Événements

  • case.created

    Un dossier a été créé

  • case.resolved

    Un dossier a été soldé (payé)

  • invoice.payment_detected

    Paiement détecté sur une facture

  • letter.sent

    Un courrier a été validé / envoyé

  • letter.tracking_updated

    Le suivi d’un courrier a évolué

  • reply.received

    Une réponse a été reçue

Format d’un événement

Le corps ne contient que des références (identifiants) — jamais de donnée personnelle du débiteur. Rappelez l’API avec votre clé pour obtenir le détail.

JSON
{
  "id": "d1f2…",            // identifiant de livraison (X-Bleme-Id)
  "type": "invoice.payment_detected",
  "occurred_at": "2026-07-12T09:30:00.000Z",
  "organization_id": "org_…",
  "data": { "case_id": "c_…" }
}

Vérifier la signature

Chaque requête porte les en-têtes X-Bleme-Signature: t=…,v1=…, X-Bleme-Id et X-Bleme-Event. Recalculez le HMAC-SHA256 de la chaîne t + "." + corps_brut avec votre secret, comparez en temps constant, et rejetez au-delà de 5 minutes d’écart.

Node.js
import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyBleme(rawBody, header, secret) {
  const parts = Object.fromEntries(
    header.split(",").map((p) => p.split("=")),
  );
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false; // rejeu
  const expected = createHmac("sha256", secret)
    .update(`${t}.${rawBody}`)
    .digest("hex");
  const a = Buffer.from(parts.v1 ?? "", "hex");
  const b = Buffer.from(expected, "hex");
  return a.length === b.length && timingSafeEqual(a, b);
}

Reprises & fiabilité

Répondez 2xx pour accuser réception. En cas d’échec, BLEME réessaie avec un délai croissant, puis abandonne. La livraison est au moins une fois : dédupliquez sur X-Bleme-Id. Un endpoint qui échoue trop longtemps est désactivé automatiquement (vous êtes prévenu par email). Le bouton Ping de test envoie un événement ping pour valider votre intégration.

Prêt à connecter votre outil ?

Générez votre première clé et faites votre premier appel en deux minutes.

Créer une clé API