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.
https://bleme.fr/api/v1L’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. Dans BLEME, ouvrez Paramètres → Clés API et créez une clé en cochant les droits voulus.
- 2. Copiez la clé
blm_live_…— elle n’est affichée qu’une seule fois. - 3. Passez-la dans l’en-tête
Authorizationde chaque requête.
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.
| Droit | Permet |
|---|---|
cases.view | Lire les dossiers, leurs courriers et le suivi |
cases.create | Créer des dossiers |
compta.view | Lire les factures importées |
compta.manage | Pousser 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.
{
"data": [ /* … */ ],
"next_cursor": "eyJ…"
}Erreurs
Les erreurs renvoient un statut HTTP et un corps normalisé { "error": { "code", "message" } }.
| HTTP | code | Signification |
|---|---|---|
| 401 | unauthorized | Clé absente, invalide, expirée ou révoquée. |
| 403 | forbidden | La clé n’a pas le droit (scope) requis pour cet appel. |
| 404 | not_found | Ressource introuvable (ou hors de votre organisation). |
| 413 | payload_too_large | Corps de requête trop volumineux. |
| 422 | invalid_request | Corps invalide (détails dans error.details). |
| 429 | rate_limited | Trop de requêtes — voir l’en-tête Retry-After. |
| 500 | internal | Erreur 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
/v1/casesdroit cases.viewListe des dossiers. Filtres : status, case_type (unpaid_invoice, client_dispute, admin_request). Pagination par cursor.
curl "https://bleme.fr/api/v1/cases?status=active&limit=50" \
-H "Authorization: Bearer $BLEME_KEY"/v1/cases/{id}droit cases.viewDé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.
/v1/casesdroit cases.createCré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 -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
/v1/cases/{id}/lettersdroit cases.viewLes 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
/v1/invoicesdroit compta.viewListe des factures importées. Filtres : paid, archived, provider.
/v1/invoicesdroit compta.managePousse 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 -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.createdUn dossier a été créé
case.resolvedUn dossier a été soldé (payé)
invoice.payment_detectedPaiement détecté sur une facture
letter.sentUn courrier a été validé / envoyé
letter.tracking_updatedLe suivi d’un courrier a évolué
reply.receivedUne 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.
{
"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.
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