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.
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
| Route | Ce qu’elle fait | Clé |
|---|---|---|
| GET /me | Votre compte et le type de clé | Lecture seule |
| GET /event-types | Vos types de réunion, avec leur lien public | Lecture seule |
| GET /event-types/{id}/slots?from&to&timezone | Les créneaux libres, tels que votre page les propose | Lecture seule |
| GET /bookings?status=upcoming|past|cancelled|all | Vos réservations (pagination par curseur) | Lecture seule |
| GET /bookings/{id} | Une réservation | Lecture seule |
| POST /bookings | Réserver un créneau | Lecture et réservation |
| POST /bookings/{id}/reschedule | Changer l’heure | Lecture et réservation |
| POST /bookings/{id}/cancel | Annuler | Lecture et réservation |
| POST /single-use-links | Un lien qui n’accepte qu’une seule réservation | Lecture 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.