API de réservation
Permettez à un agent IA ou à un script de lire les disponibilités, puis de réserver, annuler ou déplacer des rendez-vous sur vos formulaires Nudge.
Vue d'ensemble
L'API de réservation IA est un endpoint unique qu'un agent (une action ChatGPT, un bot vocal, un site partenaire, votre propre script) appelle pour prendre rendez-vous avec votre équipe :
https://app.asknudge.ai/api/ai- Les lectures sont des requêtes
GETavec un paramètreaction. - Les écritures sont des requêtes
POSTdont le corps JSON porte un champaction. - Aucune clé d'API n'est nécessaire. On ne peut réserver que des créneaux proposés par Nudge, via des identifiants de créneau signés qui expirent au bout de 30 minutes.
- Les réponses portent
Access-Control-Allow-Origin: *.
| Action | Méthode | Rôle |
|---|---|---|
manifest | GET | Décrit le formulaire : durée, langues, questions, instructions pour les agents |
get_available_dates | GET | Liste les jours à venir |
get_availability | GET | Liste les créneaux réservables, chacun avec un id signé |
book | POST | Crée le contact et réserve un créneau |
get_booking_status | GET | Lit le statut d'un rendez-vous |
cancel | POST | Annule un rendez-vous |
reschedule | POST | Déplace un rendez-vous sur un autre créneau |
Un rendez-vous pris par cette API est un rendez-vous Nudge comme les autres : il arrive dans l'agenda de l'hôte avec un lien de visio, le contact reçoit l'e-mail de confirmation, votre équipe est prévenue, et le rendez-vous comme le contact sont enregistrés avec la source ai_api.
Avant de commencer
Trouvez les slugs
Ouvrez le lien public du formulaire. Dans https://app.asknudge.ai/acme/demo-request, le slug de l'espace (org) est acme et celui du formulaire (form) est demo-request.
Vérifiez que la réservation IA est active
Dans les réglages du formulaire, ouvrez la section Réservation IA. Activer la réservation IA est actif par défaut. Désactivé, tout appel sur ce formulaire répond 403 avec AI booking disabled for this form.
La même section vous donne l'URL du manifeste, l'Endpoint API, un extrait Découverte HTML prêt à coller dans le <head> de votre site, et un champ Instructions pour l'IA : les règles qu'un agent doit suivre avant de réserver (par exemple « ne réserver que des décideurs »). Elles sont renvoyées dans le manifeste sous ai_instructions.
Assurez-vous que le formulaire est réservable
Le formulaire doit avoir au moins un hôte actif avec des horaires de travail, et l'espace un abonnement actif. Sinon les disponibilités reviennent vides ou le formulaire répond comme introuvable.
Parcours type
1. GET ?action=manifest → règles, questions et durée
2. GET ?action=get_availability → créneaux avec un id signé (valable 30 min)
3. POST { action: "book", slot_id, email, … }
→ rendez-vous + cancel_url (gardez le jeton)
4. POST { action: "reschedule" | "cancel", booking_id, token, … }Lire le manifeste
curl "https://app.asknudge.ai/api/ai?action=manifest&org=acme&form=demo-request"{
"booking_supported": true,
"provider": "nudge",
"version": "1.0",
"api": {
"url": "https://app.asknudge.ai/api/ai",
"actions": ["get_availability", "get_available_dates", "get_booking_status", "book", "cancel", "reschedule"]
},
"form": {
"name": "Book a demo",
"description": "",
"slug": "demo-request",
"org": "acme",
"url": "https://app.asknudge.ai/acme/demo-request",
"languages": ["en", "fr"],
"default_language": "en"
},
"booking": {
"video_provider": "google_meet",
"duration_minutes": 30,
"buffer_minutes": 15,
"min_notice_minutes": 60,
"window_days": 14,
"time_format": "24h",
"allow_guests": true,
"max_guests": 5
},
"required_fields": [
{ "name": "company", "label": "Company", "type": "text", "required": true }
],
"ai_instructions": "Only book if the person is a decision-maker.",
"consent_required": false,
"consent_text": ""
}Transmettez les réponses aux required_fields dans form_responses au moment de réserver. Quand consent_required vaut true, montrez consent_text à la personne avant de réserver.
Lister les jours disponibles
curl "https://app.asknudge.ai/api/ai?action=get_available_dates&org=acme&form=demo-request&days=14"Champ
Type
{
"form": { "name": "Book a demo", "slug": "demo-request" },
"dates": [
{ "date": "2026-11-02", "has_bookings": false },
{ "date": "2026-11-03", "has_bookings": true }
]
}Les dates sont des jours calendaires en UTC. has_bookings indique seulement si l'espace a déjà des rendez-vous ce jour-là ; cela ne veut pas dire que la journée est pleine. Utilisez get_availability pour savoir quels horaires sont libres.
Lire les disponibilités
curl "https://app.asknudge.ai/api/ai?action=get_availability&org=acme&form=demo-request&date_from=2026-11-02&date_to=2026-11-06"Champ
Type
{
"form": { "name": "Book a demo", "slug": "demo-request", "duration_minutes": 30 },
"slots": [
{
"id": "eyJjIjoidG1fMnY1Yjhu….Xk3v…",
"start": "2026-11-02T09:00:00.000Z",
"end": "2026-11-02T09:30:00.000Z"
}
],
"timezone": "Europe/Paris",
"required_fields": [
{ "id": "company", "label": "Company", "type": "text", "required": true, "mapping": null }
],
"all_fields": []
}Champ
Type
Les disponibilités appliquent déjà tout ce que le formulaire et l'équipe définissent : horaires de travail, rendez-vous et événements d'agenda existants, délai minimum, tampons, limites journalières, fenêtre de réservation et rendez-vous collectifs. Si l'agenda d'un hôte ne peut pas être lu, cet hôte est écarté plutôt que de risquer une double réservation.
Réserver un rendez-vous
curl -X POST https://app.asknudge.ai/api/ai \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"action": "book",
"org": "acme",
"form": "demo-request",
"slot_id": "eyJjIjoidG1fMnY1Yjhu….Xk3v…",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": "+33612345678",
"form_responses": { "company": "Example Inc." }
}'Champ
Type
En-tête optionnel : Idempotency-Key (jusqu'à 255 caractères). Si vous rejouez un book avec une clé déjà utilisée avec succès sur cet espace, Nudge ne réserve pas deux fois et répond {"success": true, "duplicate": true}. Une clé dont la réservation a échoué est libérée : vous pouvez réessayer avec la même clé.
{
"success": true,
"booking": {
"id": "bk_4n7q2w9e5r1t8y3a",
"start_time": "2026-11-02T09:00:00.000Z",
"end_time": "2026-11-02T09:30:00.000Z",
"meet_link": "https://meet.google.com/abc-defg-hij",
"video_provider": "google_meet"
},
"contact": { "id": "cnt_6h3j8k1m4n7p2q5r" },
"cancel_url": "https://app.asknudge.ai/booking/bk_4n7q2w9e5r1t8y3a/cancel?token=…"
}Conservez booking.id et le paramètre token de cancel_url : il vous faut les deux pour annuler ou déplacer le rendez-vous. Vous pouvez aussi donner cancel_url à la personne : il ouvre la page d'annulation de Nudge.
Chaque appel book crée un nouveau contact dans l'espace avec les informations envoyées.
Lire le statut d'un rendez-vous
curl "https://app.asknudge.ai/api/ai?action=get_booking_status&short_id=48213&token=…"Champ
Type
{
"booking": {
"short_id": "48213",
"start_time": "2026-11-02T09:00:00.000Z",
"end_time": "2026-11-02T09:30:00.000Z",
"status": "scheduled",
"meet_link": "https://meet.google.com/abc-defg-hij",
"video_provider": "google_meet"
}
}Une référence inconnue et un mauvais jeton donnent la même réponse 404 Booking not found.
Annuler un rendez-vous
curl -X POST https://app.asknudge.ai/api/ai \
-H "Content-Type: application/json" \
-d '{ "action": "cancel", "booking_id": "bk_4n7q2w9e5r1t8y3a", "token": "…" }'Champ
Type
Réponse : {"success": true, "cancelled": true}. L'événement d'agenda est supprimé et l'hôte est prévenu. Erreurs : 404 rendez-vous inconnu, 403 mauvais jeton.
Déplacer un rendez-vous
Récupérez d'abord des disponibilités fraîches, puis envoyez le nouveau créneau :
curl -X POST https://app.asknudge.ai/api/ai \
-H "Content-Type: application/json" \
-d '{ "action": "reschedule", "booking_id": "bk_4n7q2w9e5r1t8y3a", "token": "…", "new_slot_id": "eyJj….Q2x…" }'Champ
Type
{
"success": true,
"booking": {
"id": "bk_9c3v6b2n8m5k1j7h",
"start_time": "2026-11-04T14:00:00.000Z",
"end_time": "2026-11-04T14:30:00.000Z",
"meet_link": "https://meet.google.com/xyz-abcd-efg"
}
}Nudge réserve d'abord le nouveau créneau et n'annule l'ancien qu'ensuite : un déplacement raté ne laisse jamais la personne sans rendez-vous. Le nouveau rendez-vous a un nouvel identifiant bk_ et son propre jeton, que cette réponse ne renvoie pas : le contact reçoit un nouvel e-mail de confirmation avec les liens pour le gérer.
Gérer un rendez-vous existant
Ces endpoints font tourner les pages « déplacer » et « annuler » de Nudge. Vous pouvez les appeler pour construire votre propre page autour d'un rendez-vous. {bookingId} est l'identifiant bk_.
| Méthode et chemin | Jeton | Rôle |
|---|---|---|
GET /api/booking/{bookingId} | Non | Lire le rendez-vous tel que le visiteur le voit |
GET /api/booking/{bookingId}/ics | Optionnel | Télécharger le rendez-vous au format .ics |
GET /api/booking/{bookingId}/slots | Non | Créneaux libres pour déplacer ce rendez-vous |
POST /api/booking/{bookingId}/reschedule | Oui | Déplacer le rendez-vous |
POST /api/booking/{bookingId}/cancel | Oui | Annuler le rendez-vous |
Ces endpoints n'envoient pas d'en-têtes CORS : appelez-les depuis votre serveur ou depuis une page du même domaine.
Lire un rendez-vous
curl https://app.asknudge.ai/api/booking/bk_4n7q2w9e5r1t8y3aRenvoie id, startTime, endTime, status (scheduled, cancelled, rescheduled, completed, no_show), meetLink, canReschedule, canCancel, depositPaid, contact (firstName, lastName, email), hostName, formName, formSlug, orgName, orgSlug, orgLogoUrl, orgWebsiteUrl, whiteLabel, display (brandColor, timeFormat, showHostAvatars, durationMinutes) et assistantEnabled. 404 not_found pour un identifiant inconnu.
Télécharger le fichier d'agenda
curl -o meeting.ics "https://app.asknudge.ai/api/booking/bk_4n7q2w9e5r1t8y3a/ics?token=…&lang=fr"Renvoie du text/calendar. Sans jeton, le fichier contient le titre, l'horaire et le lien de visio. Avec un jeton valide, il contient aussi les liens pour déplacer et annuler, dans la langue indiquée par lang. Un mauvais jeton donne 403 token_invalid ; un rendez-vous qui n'est plus planifié donne 409 not_scheduled.
Lister les créneaux pour déplacer un rendez-vous
curl https://app.asknudge.ai/api/booking/bk_4n7q2w9e5r1t8y3a/slotsRenvoie slots (closer_id, start, end), duration, timezone, closers (id, name, initials, avatar_url), collective et window. Quand le formulaire garde le même hôte lors d'un déplacement, seuls les créneaux de cet hôte sont listés. 409 not_reschedulable si le rendez-vous ne peut plus être déplacé.
Déplacer un rendez-vous
curl -X POST https://app.asknudge.ai/api/booking/bk_4n7q2w9e5r1t8y3a/reschedule \
-H "Content-Type: application/json" \
-d '{ "token": "…", "start": "2026-11-04T14:00:00Z", "end": "2026-11-04T14:30:00Z" }'Champ
Type
Réponse : {"rescheduled": true, "booking": {"id": "bk_…", "startTime": "…", "meetLink": "…"}}. Nudge revérifie le créneau contre les disponibilités réelles avant de le réserver.
Annuler un rendez-vous
curl -X POST https://app.asknudge.ai/api/booking/bk_4n7q2w9e5r1t8y3a/cancel \
-H "Content-Type: application/json" \
-d '{ "token": "…", "reason": "Je ne peux plus être présent." }'Champ
Type
Réponse : {"cancelled": true}, ou {"alreadyCancelled": true} s'il était déjà annulé.
Voir Erreurs pour tous les codes d'erreur de ces endpoints et Limites de débit pour leurs limites.