Intégrez Kaution.io à votre ERP ou système d'information. Créez des cautions, suivez leur statut, encaissez et libérez. Le tout via une API REST sécurisée et des webhooks temps réel.
Toutes les requêtes API doivent être envoyées à l'URL de base suivante :
https://kaution.io/functions/v1/api-v1L'API Kaution.io utilise des clés API au format kio_....Chaque clé est liée à un compte marchand et permet d'agir sur ses cautions uniquement.
Les clés API se créent depuis le tableau de bord Kaution.io, onglet « Clés API ».. La clé complète n'est affichée qu'une seule fois à la création — conservez-la en lieu sûr.
Incluez votre clé API dans l'en-tête Authorization de chaque requête :
Authorization: Bearer kio_votre_cle_apiKaution.io dispose d'un environnement de test intégré via Stripe. Vous pouvez tester l'intégralité du flux (création, validation, capture, libération, webhooks) sans aucun mouvement d'argent réel.
Utilisez les cartes de test suivantes dans l'environnement sandbox :
| Numéro de carte | Scénario |
|---|---|
| 4242 4242 4242 4242 | Paiement réussi |
| 4000 0027 6000 3184 | Pré-autorisation réussie (caution) |
| 4000 0000 0000 9995 | Fonds insuffisants (échec) |
| 4000 0000 0000 0069 | Carte expirée (échec) |
Date d'expiration : toute date future (ex: 12/34) — CVC : any 3 digits
Le passage en production ne nécessite aucune modification de code côté ERP. Il suffit que les clés Stripe de la plateforme et du compte marchand connecté soient en mode production (sk_live_...).L'API, les webhooks et tous les endpoints fonctionnent à l'identique.
Crée une nouvelle caution (pré-autorisation / empreinte bancaire) ou un paiement direct. Un lien de paiement Stripe est généré et retourné dans la réponse.
/cautions| Champ | Type | Requis | Description |
|---|---|---|---|
| client_name | string | Oui | Nom du client (max 120) |
| client_email | string | Oui | Email valide du client |
| client_phone | string | Non | Téléphone (max 32) |
| amount | integer | Oui* | Montant en centimes (min 50, max 1 000 000 00). *Non requis en mode tokenisation |
| description | string | Non | Description (max 500) |
| mode | string | Non | "caution" (défaut), "paiement" ou "tokenisation" |
mode: "caution"
Pré-autorisation (empreinte bancaire). Les fonds sont bloqués mais non débités. Capturez ou libérez ultérieurement. Valide 7 jours. La carte est automatiquement tokenisée pour une réutilisation ultérieure via /authorize.
mode: "paiement"
Paiement direct. Le montant est encaissé immédiatement (capture automatique). Le statut passe directement à saisie. La carte est automatiquement tokenisée pour une réutilisation ultérieure via /authorize.
mode: "tokenisation"
Enregistrement de carte seule. Aucun blocage de plafond. Utilisez ensuite POST /cautions/:id/authorize pour pré-autoriser le montant souhaité au bon moment.
curl -X POST https://kaution.io/functions/v1/api-v1/cautions \
-H "Authorization: Bearer kio_votre_cle_api" \
-H "Content-Type: application/json" \
-d '{
"client_name": "Jean Dupont",
"client_email": "jean@exemple.fr",
"client_phone": "0612345678",
"amount": 50000,
"description": "Caution location voiture",
"mode": "caution"
}'{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "en_attente",
"checkout_url": "https://checkout.stripe.com/c/pay/cs_test_...",
"short_url": "https://kaution.io/k/Ab3x9Q",
"mode": "caution",
"amount": 50000,
"client_name": "Jean Dupont",
"client_email": "jean@exemple.fr",
"created_at": "2026-09-28T10:00:00.000Z"
}Le checkout_url doit être envoyé au client pour qu'il valide sa carte.Le short_url est une version raccourcie utilisable en QR code.
Récupère la liste des cautions du compte marchand, avec pagination et filtre par statut.
/cautions| Paramètre | Type | Défaut | Description |
|---|---|---|---|
| limit | integer | 50 | Nombre de résultats (max 100) |
| offset | integer | 0 | Décalage pour la pagination |
| status | string | — | Filtrer par statut (en_attente, validee, saisie, liberee, expiree) |
curl https://kaution.io/functions/v1/api-v1/cautions?limit=10&status=validee \
-H "Authorization: Bearer kio_votre_cle_api"{
"cautions": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"client_name": "Jean Dupont",
"client_email": "jean@exemple.fr",
"amount": 50000,
"status": "validee",
"mode": "caution",
"description": "Caution location voiture",
"created_at": "2026-09-28T10:00:00.000Z",
"hold_expires_at": "2026-10-05T10:00:00.000Z",
"captured_amount": null,
"short_code": "Ab3x9Q"
}
]
}Récupère les détails complets d'une caution spécifique, incluant son statut, le montant, les informations client et les références Stripe.
/cautions/:idcurl https://kaution.io/functions/v1/api-v1/cautions/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "Authorization: Bearer kio_votre_cle_api"{
"caution": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"client_name": "Jean Dupont",
"client_email": "jean@exemple.fr",
"client_phone": "0612345678",
"amount": 50000,
"captured_amount": null,
"status": "validee",
"mode": "caution",
"description": "Caution location voiture",
"short_code": "Ab3x9Q",
"stripe_checkout_session_id": "cs_test_...",
"stripe_payment_intent_id": "pi_...",
"stripe_customer_id": "cus_...",
"hold_expires_at": "2026-10-05T10:00:00.000Z",
"created_at": "2026-09-28T10:00:00.000Z"
}
}Encaisse tout ou partie d'une caution validée (pré-autorisation). Le montant est débité de la carte du client. La caution doit être au statut validee.
/cautions/:id/capture| Champ | Type | Requis | Description |
|---|---|---|---|
| amount | integer | Non | Montant à capturer en centimes. Si omis, capture totale. Si inférieur au montant de la caution, capture partielle. |
curl -X POST https://kaution.io/functions/v1/api-v1/cautions/a1b2c3d4/capture \
-H "Authorization: Bearer kio_votre_cle_api" \
-H "Content-Type: application/json"curl -X POST https://kaution.io/functions/v1/api-v1/cautions/a1b2c3d4/capture \
-H "Authorization: Bearer kio_votre_cle_api" \
-H "Content-Type: application/json" \
-d '{ "amount": 20000 }'{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "saisie",
"captured_amount": 20000
}Libère une caution validée. Les fonds bloqués sur la carte du client sont immédiatement débloqués. Aucun débit n'est effectué. La caution doit être au statut validee.
/cautions/:id/releasecurl -X POST https://kaution.io/functions/v1/api-v1/cautions/a1b2c3d4/release \
-H "Authorization: Bearer kio_votre_cle_api"{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "liberee"
}Chaque caution passe par un cycle de vie défini. Le statut est accessible via l'API (GET /cautions/:id) et via les webhooks.
en_attente — En attente
La caution a été créée. Le client n'a pas encore validé sa carte sur la page Stripe Checkout.
validee — Validée (pré-autorisée)
Le client a validé sa carte. Les fonds sont bloqués (caution) ou encaissés (paiement). La pré-autorisation expire après 7 jours.
saisie — Saisie (encaissée)
Le montant (total ou partiel) a été capturé. Les fonds sont transférés au marchand.
liberee — Libérée
La caution a été libérée. Les fonds bloqués sont rendus au client. Aucun débit.
Kaution.io envoie des notifications HTTP POST vers vos endpoints configurés lorsqu'un événement se produit sur une caution. Les webhooks se configurent depuis le tableau de bord, onglet « Webhooks ».
| Événement | Déclenchement |
|---|---|
| deposit.requested | Une caution est créée (lien de paiement généré) |
| deposit.authorized | Le client a validé sa carte (pré-autorisation confirmée) |
| deposit.captured | La caution a été encaissée (totale ou partielle) |
| deposit.released | La caution a été libérée (fonds rendus au client) |
Chaque webhook envoie un corps JSON au format suivant :
{
"event": "deposit.authorized",
"data": {
"caution_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"client_name": "Jean Dupont",
"client_email": "jean@exemple.fr",
"amount": 50000,
"description": "Caution location voiture",
"mode": "caution",
"status": "validee"
},
"timestamp": "2026-09-28T10:05:00.000Z"
}| En-tête | Description |
|---|---|
| Content-Type | application/json |
| Kaution-Event | Type d'événement (ex: deposit.authorized) |
| Kaution-Webhook-Signature | Signature HMAC pour vérification (voir ci-dessous) |
Chaque webhook est signé avec HMAC SHA-256. L'en-tête Kaution-Webhook-Signaturecontient t=timestamp,v1=signature. Pour vérifier :
// Exemple de vérification (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(rawBody, signatureHeader, secret) {
const parts = Object.fromEntries(
signatureHeader.split(',').map(p => p.split('='))
);
const timestamp = parts.t;
const v1 = parts.v1;
const expectedSig = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
// Comparaison sécurisée (protection contre timing attacks)
return crypto.timingSafeEqual(
Buffer.from(v1, 'hex'),
Buffer.from(expectedSig, 'hex')
);
}
// Dans votre handler Express:
// const rawBody = req.rawBody; // body brut (non parsé)
// const sig = req.headers['kaution-webhook-signature'];
// const secret = 'votre_secret_webhook';
// if (!verifyWebhookSignature(rawBody, sig, secret)) {
// return res.status(401).send('Signature invalide');
// }Le secret du webhook est généré automatiquement à la création et visible dans le tableau de bord.
200 rapidement (sous 10 secondes)| Code HTTP | Message | Cause |
|---|---|---|
| 400 | Paramètres invalides | Champ manquant, format incorrect, montant hors limites |
| 401 | Clé API invalide ou révoquée | Clé manquante, incorrecte ou désactivée |
| 403 | Quota mensuel atteint / Aucun abonnement | Limite du plan atteinte ou abonnement inactif |
| 404 | Caution introuvable | ID inexistant ou n'appartenant pas au marchand |
| 500 | Erreur serveur | Erreur Stripe ou problème technique interne |
{
"error": "Montant invalide (en centimes, 50 minimum)"
}/cautionsCréer une caution, un paiement ou une tokenisation/cautionsLister les cautions (pagination + filtre)/cautions/:idRécupérer une caution et son statut/cautions/:id/captureEncaisser (total ou partiel)/cautions/:id/authorizePré-autoriser un montant sur une carte enregistrée/cautions/:id/releaseLibérer la caution