Pour les développeurs

API, webhooks et widget, gratuits

Consultez les créneaux, créez et annulez des réservations depuis votre logiciel, recevez un avis signé à chaque changement et intégrez votre agenda à votre site. Ce que d’autres facturent est gratuit ici.

Commencer gratuitement · Aller à API et webhooks

Authentification

Créez une clé dans Paramètres → API et webhooks. Choisissez « Lecture seule » (types de réunion, disponibilités et réservations) ou « Lecture et réservation » (en plus : réserver, déplacer, annuler et créer des liens à usage unique). La clé ne s’affiche qu’une seule fois.

Envoyez-la dans l’en-tête X-API-Key. Toutes les routes se trouvent sous https://calendavibe.com/api/v1. Une clé ne voit et ne modifie que les données de son propre compte.

Vos types de réunion

curl https://calendavibe.com/api/v1/event-types \
  -H "X-API-Key: cvwh_…"

Routes

RouteCe qu’elle faitClé
GET /meVotre compte et le type de cléLecture seule
GET /event-typesVos types de réunion, avec leur lien publicLecture seule
GET /event-types/{id}/slots?from&to&timezoneLes créneaux libres, tels que votre page les proposeLecture seule
GET /bookings?status=upcoming|past|cancelled|allVos réservations (pagination par curseur)Lecture seule
GET /bookings/{id}Une réservationLecture seule
POST /bookingsRéserver un créneauLecture et réservation
POST /bookings/{id}/rescheduleChanger l’heureLecture et réservation
POST /bookings/{id}/cancelAnnulerLecture et réservation
POST /single-use-linksUn lien qui n’accepte qu’une seule réservationLecture et réservation

Réserver (avec une Idempotency-Key, pour ne jamais réserver deux fois si la requête est répétée)

curl -X POST https://calendavibe.com/api/v1/bookings \
  -H "X-API-Key: cvwh_…" -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-1234" \
  -d '{
    "eventTypeId": "ckx…",
    "startTime": "2026-11-03T09:00:00.000Z",
    "guest": { "name": "Ana García", "email": "ana@example.com", "timezone": "Europe/Madrid", "locale": "es" },
    "consent": true
  }'

Règles des réservations

Une réservation par l’API suit les mêmes règles que votre page : uniquement des heures vraiment libres (votre calendrier compris), l’invité reçoit ses e-mails et apparaît dans vos contacts.

Envoyez consent: true lorsque l’invité a accepté le traitement de ses données dans votre formulaire.

Si deux systèmes demandent le même créneau en même temps, le second reçoit 409 SLOT_UNAVAILABLE et en choisit un autre. Avec la même Idempotency-Key, une requête répétée renvoie la même réservation pendant 24 heures.

Une réunion payante ne se réserve pas par l’API : la réponse est 402 PAYMENT_REQUIRED avec bookingUrl, le lien pour que l’invité réserve et paie.

Limites

Offre gratuite : 60 appels par minute et 10 000 par jour et par compte, et jusqu’à 10 webhooks. Davantage avec Closevibe.

Au-delà de la limite, la réponse est 429 avec l’en-tête Retry-After.

Les erreurs ont toujours la forme { "error": { "code", "message" } }.

Webhooks

Dans Paramètres → API et webhooks, ajoutez une URL de destination (https et publique) et choisissez les avis : Nouvelle réservation (meeting.booked), Annulation (meeting.cancelled), Changement d’heure (meeting.rescheduled) et Paiement reçu (meeting.paid).

Chaque avis est un POST avec les données de la réservation, jamais le lien privé de l’invité. Si votre serveur échoue, nous réessayons après 1 min, 5 min, 30 min, 2 h, 6 h et 12 h. Après 20 échecs consécutifs, l’URL est désactivée et nous vous prévenons par e-mail.

Vérifiez la signature : l’en-tête X-Webhook-Signature vaut sha256= suivi du HMAC-SHA256 du corps tel qu’il arrive, calculé avec le secret de signature de cette URL.

Un avis

{
  "id": "evt_…",
  "event": "meeting.booked",
  "createdAt": "2026-11-01T10:15:00.000Z",
  "data": {
    "booking": {
      "id": "ckx…", "status": "CONFIRMED",
      "eventType": { "id": "ckx…", "slug": "primera-consulta", "name": "Primera consulta", "duration": 30 },
      "startTime": "2026-11-03T09:00:00.000Z", "endTime": "2026-11-03T09:30:00.000Z", "timezone": "Europe/Madrid",
      "guest": { "name": "Ana García", "email": "ana@example.com", "phone": null, "timezone": "Europe/Madrid", "locale": "es", "notes": null },
      "answers": [{ "question": "Motivo", "answer": "Revisión" }],
      "meetingUrl": "https://meet.google.com/…", "payment": null
    }
  }
}

Vérifier la signature (Node.js)

const crypto = require('crypto');

// rawBody: the request body exactly as received (a Buffer or string, before JSON.parse).
function isFromCalendaVibe(rawBody, header, secret) {
  const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  return header && expected.length === header.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(header));
}

Widget pour votre site

Dans la page ou dans une fenêtre pop-up (bouton ou bulle), avec votre couleur et votre langue. Si vous connaissez déjà le visiteur, transmettez son nom et son e-mail : ils seront préremplis. Sur mobile, la fenêtre occupe tout l’écran et se ferme avec la croix ou Échap.

Quand quelqu’un réserve dans le widget, votre page reçoit l’événement calendavibe:booked avec l’heure et le type de réunion.

Dans la page

<div class="calendavibe-inline" data-url="https://calendavibe.com/ana/primera-consulta"
     data-color="#6d28d9" data-lang="es"></div>
<script src="https://calendavibe.com/embed.js" async></script>

Pop-up depuis un bouton ou une bulle

<a href="https://calendavibe.com/ana/primera-consulta" data-calendavibe-popup
   data-color="#6d28d9" data-name="Ana García" data-email="ana@example.com">Reservar</a>

<script src="https://calendavibe.com/embed.js" async
        data-calendavibe-bubble="https://calendavibe.com/ana" data-text="Reservar" data-color="#6d28d9"></script>

Questions fréquentes

Est-ce payant ?

Non. L’API, les webhooks et le widget sont gratuits avec l’offre gratuite, dans les limites indiquées ci-dessus.

Ça fonctionne avec Zapier ou Make ?

Oui : utilisez leur module HTTP avec votre clé pour l’API, et un webhook CalendaVibe comme déclencheur.

Puis-je faire payer une réunion par l’API ?

Non : l’invité paie sur votre page. L’API vous renvoie le lien à lui envoyer.