Kauti
Retour à l'accueil

API standard

Vos cautions, pilotées depuis votre logiciel

PMS, channel manager, outil de conciergerie : l'API Kauti crée la caution au moment de la réservation, suit le locataire jusqu'à l'enregistrement de sa carte, et vous laisse encaisser ou libérer sans ouvrir l'interface Kauti.

Créer un compteDémarrage rapide

Comment ça marche

  1. 1

    Créez une clé

    Depuis Compte › API. Une clé par logiciel connecté.

  2. 2

    Créez la caution

    À la réservation, votre logiciel appelle POST /deposits. Le locataire reçoit le lien et enregistre sa carte, sans être débité.

  3. 3

    Suivez-la

    Kauti prévient votre serveur à chaque étape. Vous encaissez ou libérez par un appel, ou laissez la libération automatique faire.

Une caution créée par l'API suit exactement les mêmes règles qu'une caution créée dans l'interface : même page pour le locataire, mêmes e-mails, même libération automatique, même facturation. Elle apparaît aussi dans votre tableau de bord.

Démarrage rapide

Toutes les requêtes passent par https://www.kauti.fr/api/v1, en HTTPS, avec la clé dans l'en-tête Authorization. Les montants sont en centimes, les dates au format AAAA-MM-JJ, les heures en HH:MM, à l'heure locale du compte. Une location couvre 90 jours au plus entre start_date et end_date, et start_date tombe entre hier et 365 jours après aujourd'hui.

curl https://www.kauti.fr/api/v1/deposits \
  -H "Authorization: Bearer kauti_sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 50000,
    "guest": { "email": "locataire@exemple.fr", "phone": "+33612345678" },
    "rental": {
      "start_date": "2026-11-12", "start_time": "16:00",
      "end_date": "2026-11-19", "end_time": "10:00",
      "reference": "BOOKING-4123456789"
    },
    "external_id": "resa-8812",
    "send_email": true
  }'

La réponse décrit la caution. Avec "send_email": false, Kauti n'écrit pas au locataire : envoyez-lui vous-même checkout_url, par SMS ou dans votre propre message de confirmation. external_id, facultatif, est votre identifiant de réservation : une seconde création avec le même renvoie une erreur au lieu d'une caution en double.

{
  "object": "deposit",
  "id": "5b0d9c3e-8f1a-4b8e-9d3a-2f6c1e7a4b90",
  "external_id": "resa-8812",
  "status": "pending_guest",
  "amount": 50000,
  "currency": "eur",
  "guest": { "email": "locataire@exemple.fr", "phone": "+33612345678", "email_bounced": false },
  "rental": {
    "reference": "BOOKING-4123456789",
    "start_date": "2026-11-12", "start_time": "16:00",
    "end_date": "2026-11-19", "end_time": "10:00"
  },
  "checkout_url": "https://www.kauti.fr/c/…",
  "card_saved": false,
  "terms_accepted_at": null,
  "authorized_amount": 0,
  "authorized_at": null,
  "authorization_expires_at": null,
  "automatic_release_at": "2026-11-21T09:00:00.000Z",
  "incident": null,
  "captured_amount": 0,
  "captured_at": null,
  "released_at": null,
  "source": "api",
  "created_at": "2026-10-02T09:12:44.381Z",
  "updated_at": "2026-10-02T09:12:44.381Z"
}

Pour essayer sans rien engager : une caution annulée avant que le locataire ait enregistré sa carte ne compte pas dans votre forfait.

Points d’accès

MéthodeCheminRôle
GET/accountLe compte auquel la clé donne accès.
POST/depositsCrée une caution et, par défaut, envoie la demande de carte au locataire.
GET/depositsListe les cautions, les plus récentes d'abord. Filtres : status, external_id, limit, page.
GET/deposits/{id}Une caution.
POST/deposits/{id}/resendRenvoie la demande de carte, à une adresse corrigée si guest_email est fourni.
POST/deposits/{id}/incidentDéclare un dommage : amount (centimes) et description.
POST/deposits/{id}/captureEncaisse le montant de l'incident déclaré.
POST/deposits/{id}/cancelAnnule la caution, ou libère le montant bloqué.
POST/paymentsDemande un paiement : amount (centimes), description, guest.email. Envoie le lien par défaut.
GET/paymentsListe les paiements, les plus récents d'abord. Filtres : status, external_id, limit, page.
GET/payments/{id}Un paiement.
POST/payments/{id}/resendRenvoie la demande de paiement, à une adresse corrigée si guest_email est fourni.
POST/payments/{id}/cancelAnnule une demande pas encore payée.
POST/payments/{id}/refundRembourse le paiement : amount (centimes) pour une partie, sans amount pour le reste.

Les opérations sur une caution renvoient la caution telle qu'elle est après coup : c'est son statut qui dit si un encaissement a abouti. L'encaissement d'un incident se fait dans les 48 heures qui suivent sa déclaration. Le blocage se choisit à la création, avec "hold": true : Kauti le pose de lui-même au début de la location, ou dès l'enregistrement de la carte si elle a déjà commencé. Il ne peut pas être ajouté ensuite à une caution créée sans. La banque fixe son échéance, renvoyée dans authorization_expires_at (sept jours en général) ; si elle tombe avant la libération, le montant n'est garanti que jusque-là, et la carte reste enregistrée jusqu'à la libération.

Statuts d’une caution

StatutSignification
pending_guestEn attente du locataire : il n'a pas encore enregistré sa carte.
card_savedCarte enregistrée, rien n'est bloqué.
authorization_processingBlocage en cours chez Stripe.
authorizedMontant bloqué sur la carte.
authorization_failedLa banque a refusé le blocage.
incident_reportedIncident déclaré : à encaisser dans les 48 heures.
capturedMontant encaissé. Caution close.
releasedMontant libéré. Caution close.
cancelledCaution annulée. Caution close.

Paiements

Un paiement est une somme que votre locataire règle une fois, par carte, sur votre compte Stripe : solde du séjour, ménage, frais. Les notifications portent data.payment au lieu de data.deposit. Commission Kauti : 0,5 % + 0,50 € HT par paiement réglé, 2,00 € HT minimum, sur votre facture Kauti ; les frais Stripe sont déduits du paiement. Un remboursement ne rend ni l'une ni les autres.

StatutSignification
pendingEn attente : le locataire n'a pas encore payé. payment_url est le lien de paiement.
paidPayé. kauti_fee est la commission hors taxes portée sur votre facture Kauti.
partially_refundedRemboursé en partie : refunded_amount dit combien.
refundedRemboursé en totalité.
cancelledDemande annulée avant paiement.

Notifications

Renseignez une adresse HTTPS dans Compte › API. À chaque changement de statut, Kauti y envoie un POST JSON : { id, object: "event", type, created_at, data: { deposit } }. Le journal des derniers envois, avec la réponse de votre serveur, est visible au même endroit.

ÉvénementQuand
deposit.createdCaution créée.
deposit.card_savedLe locataire a enregistré sa carte.
deposit.authorizedLe montant est bloqué.
deposit.authorization_failedLe blocage a été refusé.
deposit.incident_reportedUn incident a été déclaré.
deposit.capturedLe montant de l'incident a été encaissé.
deposit.releasedLe montant a été libéré.
deposit.cancelledLa caution a été annulée.
payment.createdPaiement demandé.
payment.paidLe locataire a payé.
payment.refundedUn remboursement a été fait, depuis Kauti ou depuis Stripe.
payment.cancelledLa demande de paiement a été annulée.

Chaque envoi est signé. L'en-tête Kauti-Signature vaut t=<horodatage>,v1=<signature>, où la signature est le HMAC-SHA256, en hexadécimal, de <horodatage>.<corps brut> avec le secret affiché dans Compte › API. Rejetez tout envoi dont la signature ne correspond pas ou dont l'horodatage a plus de cinq minutes.

import crypto from "node:crypto";

// rawBody : le corps de la requête tel que reçu, sans le reformater.
function verifyKautiSignature(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${parts.t}.${rawBody}`)
    .digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

Erreurs

Une erreur répond { "error": { "code", "message" } } : le code est stable, à utiliser dans votre programme ; le message, en français, s'adresse à un humain.

HTTPCodeCause
401unauthorizedClé absente, mal formée, inconnue ou révoquée.
402account_suspendedUne facture Kauti est impayée : la création de cautions est suspendue.
403plan_requiredLe compte n'a pas de forfait payant.
403forbiddenOpération indisponible avec cette clé : les paiements demandent une clé de compte.
404not_foundLa caution n'existe pas, ou appartient à un autre compte.
409invalid_stateL'opération est impossible dans le statut actuel de la caution.
409duplicate_external_idUne caution existe déjà avec cet external_id.
422invalid_requestCorps ou paramètres invalides ; details indique le champ en cause.
500server_errorErreur de notre côté. Réessayez, ou écrivez au support.

Sécurité

Vous éditez un logiciel ?

L'API en marque blanche

PMS, outil de conciergerie, channel manager : proposez la caution à tous vos clients, sous votre marque, avec une seule clé pour votre logiciel. Chaque client vous autorise depuis son compte Kauti.

Découvrir la marque blanche
API | Kauti