Rendez-vous
L’API Appointments vous permet de réserver des rendez-vous pour vos contacts sur vos types d’événements, puis de les récupérer, de les lister, de les mettre à jour, de les annuler ou de les supprimer. Elle répond également à la question qui se pose en premier dans la plupart des flux de réservation — quels créneaux sont réellement libres — et couvre le volet calendrier : lister les agendas Google que vous avez connectés et importer les événements qui y figurent déjà. Lorsqu’une connexion Google Calendar est active, l’événement de calendrier correspondant est créé et maintenu synchronisé automatiquement en arrière-plan. Les restaurants utilisant Zenchef, Formitable, OpenTable ou TheFork pour leur propre système de réservation peuvent également être vérifiés et connectés ici, afin que l’agent IA réserve de vraies tables au lieu de rendez-vous internes — et les entreprises de services sur rendez-vous gérant leur planning dans Trafft peuvent se connecter de la même manière.
Tous les chemins sur cette page sont relatifs à l’URL de base https://api.youraiconnector.com/v1. Chaque requête nécessite votre clé API — consultez Authentification pour obtenir la liste complète des méthodes pour l’envoyer. Les exemples ci-dessous utilisent l’en-tête X-API-Key, avec un exemple cURL montrant également le formulaire de requête ?apiKey=.
Événements vs rendez-vous : Un type d’événement est une définition de créneau réservable (le type de réunion, sa durée, ses salles). Un rendez-vous est une instance réservée d’un type d’événement pour un contact spécifique. Vous réservez un rendez-vous en référençant le contact et le type d’événement.
L’objet rendez-vous
Chaque point de terminaison qui renvoie un rendez-vous utilise la même structure :
| Champ | Description |
|---|---|
id |
Identifiant unique du rendez-vous. |
contact_id |
Identifiant du contact avec lequel le rendez-vous est pris. |
event_id |
Identifiant du type d’événement pour lequel le rendez-vous a été pris. null pour les réservations externes — rendez-vous enregistrés sans type d’événement. |
status |
Confirmed ou Canceled. |
start_time |
Début du rendez-vous, au format ISO 8601 en UTC. |
end_time |
Fin du rendez-vous, au format ISO 8601 en UTC. |
created_at |
Date de création du rendez-vous. |
last_modified_at |
Date de la dernière modification du rendez-vous. |
room_name |
Salle ou ressource dans laquelle le rendez-vous est réservé, lorsque le type d’événement utilise des salles. |
description |
Description libre du rendez-vous. |
summary |
Résumé ou titre court. Pour une réservation externe, il s’agit du title avec lequel elle a été enregistrée. |
external_reference |
Votre propre identifiant pour cette réservation (depuis votre CRM ou système de réservation), tel que vous l’avez envoyé, ou null. |
cancelation_reason |
Motif fourni lors de l’annulation du rendez-vous, le cas échéant. |
google_calendar_event_id |
Identifiant de l’événement Google Calendar lié. Défini une fois la synchronisation du calendrier terminée ; null lorsqu’aucun calendrier n’est connecté ou pendant que la synchronisation est en cours. |
calendar_synced |
true une fois le rendez-vous lié à un événement du calendrier. |
imported |
true lorsque le rendez-vous a été importé depuis un calendrier externe plutôt que réservé directement. |
is_recurring |
true lorsque le rendez-vous fait partie d’une série récurrente. |
recurrence_frequency |
Fréquence de répétition du rendez-vous, en cas de récurrence. |
recurring_event_id |
Identifiant de la série récurrente à laquelle appartient ce rendez-vous. |
recurring_interval |
Intervalle entre les répétitions, en cas de récurrence. |
recurring_sequence |
Position de ce rendez-vous au sein de sa série récurrente. |
end_after_x_occurrences |
Nombre d’occurrences après lesquelles la série récurrente se termine. |
booking_provider |
Système source d’où provient la réservation, lorsqu’elle est effectuée via un fournisseur de réservation connecté. |
À propos de la synchronisation du calendrier : Juste après avoir réservé ou modifié un rendez-vous,
google_calendar_event_idpeut encore êtrenulletcalendar_syncedpeut êtrefalsecar la synchronisation s’exécute en arrière-plan un instant plus tard. Récupérez à nouveau le rendez-vous peu après pour voir les champs de calendrier renseignés.
Trouver les créneaux disponibles
GET /appointments/available-slots
Renvoie les heures réellement libres pour un type d’événement donné entre deux moments. Il s’agit normalement du premier appel dans un flux de réservation : affichez ces créneaux, laissez la personne en choisir un, puis envoyez l’heure choisie à Réserver un rendez-vous.
La réponse prend déjà en compte les heures d’ouverture et la durée des créneaux du type d’événement, ses salles, les rendez-vous que vous avez déjà réservés, ainsi que tout ce qui est bloqué sur les agendas Google connectés — un créneau renvoyé ici est donc un créneau que vous pouvez réserver.
| Paramètre de requête | Requis | Description |
|---|---|---|
event_id |
Oui | Le type d’événement à vérifier. Doit appartenir à votre compte. Trouvez-le dans l’application en ouvrant le type d’événement sur la page Rendez-vous (onglet Types d’événements) : la fenêtre de modification affiche son ID de type d’événement avec un bouton de copie. |
start_time |
Oui | Début de la fenêtre pour laquelle vous souhaitez obtenir des créneaux, date-heure au format ISO 8601. |
end_time |
Oui | Fin de la fenêtre, date-heure au format ISO 8601. La journée de fin entière est incluse. |
Les résultats sont renvoyés regroupés par jour — et, lorsque le type d’événement utilise des salles, un groupe par salle et par jour :
| Champ | Description |
|---|---|
date |
Le jour couvert par le groupe, écrit DD/MM/YYYY. |
day |
Nom du jour de la semaine en minuscules, par exemple monday. |
room_name |
La salle ou la ressource à laquelle appartient ce groupe, lorsque le type d’événement utilise des salles. |
available_slots |
Les blocs réservables ce jour-là, du plus tôt au plus tard. |
Chaque entrée dans available_slots contient :
| Champ | Description |
|---|---|
start_time |
Début du bloc au format HH:mm. |
end_time |
Fin du bloc au format HH:mm. |
available |
true — seul le temps libre est renvoyé. |
spots_left |
Combien de réservations tiennent encore dans ce bloc. Uniquement présent sur les types d’événements acceptant plus d’une réservation par créneau. |
Les heures sont locales au type d’événement, et non en UTC.
date,start_timeetend_timesont des valeurs d’horloge dans le fuseau horaire propre au type d’événement (son remplacement, ou le fuseau horaire de votre compte s’il n’en a pas). Réserver un rendez-vous attend un instant UTC ISO 8601, convertissez donc le créneau que vous avez choisi avant de l’envoyer.
cURL
curl "https://api.youraiconnector.com/v1/appointments/available-slots?event_id=event_xyz789&start_time=2026-06-15T00:00:00.000Z&end_time=2026-06-19T00:00:00.000Z" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({
event_id: "event_xyz789",
start_time: "2026-06-15T00:00:00.000Z",
end_time: "2026-06-19T00:00:00.000Z",
});
const res = await fetch(
`https://api.youraiconnector.com/v1/appointments/available-slots?${params}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.data);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments/available-slots",
headers={"X-API-Key": "YOUR_API_KEY"},
params={
"event_id": "event_xyz789",
"start_time": "2026-06-15T00:00:00.000Z",
"end_time": "2026-06-19T00:00:00.000Z",
},
)
print(res.json()["data"])
Réponse (200 OK) :
{
"success": true,
"data": [
{
"date": "15/06/2026",
"day": "monday",
"room_name": "Room A",
"available_slots": [
{ "start_time": "10:00", "end_time": "10:30", "available": true },
{ "start_time": "10:30", "end_time": "11:00", "available": true }
]
},
{
"date": "16/06/2026",
"day": "tuesday",
"room_name": "Room A",
"available_slots": [
{ "start_time": "09:00", "end_time": "09:30", "available": true, "spots_left": 2 }
]
}
]
}
Un jour sans aucune disponibilité n’apparaît tout simplement pas. L’absence de event_id, start_time ou end_time renvoie 400 ; un type d’événement qui n’est pas sur votre compte renvoie 404.
Réserver un rendez-vous
POST /appointments
Crée un rendez-vous pour l’un de vos contacts. Il existe deux façons de l’utiliser :
- Sur l’un de vos types d’événement — envoyez
event_id, et la réservation fonctionne exactement comme d’habitude : la disponibilité et la capacité sont respectées, l’heure de fin est calculée à partir de la durée du créneau du type d’événement, et le rendez-vous est synchronisé avec votre Google Calendar lorsqu’il est connecté. - En tant que réservation externe — omettez
event_idet envoyez untitleà la place. Cela enregistre une réservation effectuée ailleurs (votre propre CRM, un emploi du temps de cours, un autre outil de réservation) afin qu’elle apparaisse sur la page Rendez-vous avec les autres.
Une réservation pour un type d’événement avec salles doit être effectuée à une heure proposée par Trouver des créneaux disponibles : pendant les heures d’ouverture de la salle, en dehors du délai de préavis, dans la limite de la période de réservation autorisée pour le type d’événement, sur la grille des créneaux, pas dans le passé, et non bloquée sur un calendrier connecté. Toute autre heure est refusée avec une 400 et rien n’est créé. Il en va de même pour une room_name qui ne correspond à aucune des salles du type d’événement (le message liste les noms valides). Les temps de battement définis sur le type d’événement (Battement avant et Battement après dans l’éditeur de type d’événement, buffer_before et buffer_after en minutes) sont maintenus libres autour de chaque réservation.
Une réservation sur un type d’événement fait également l’objet d’une vérification de conflit : si le créneau est déjà complet, la demande échoue avec une 409 et rien n’est créé. Une réservation externe n’est associée à aucun type d’événement, donc rien n’est vérifié par rapport à votre disponibilité ou votre capacité et rien n’est synchronisé avec un calendrier.
Il est sûr de réessayer. Si le même contact a déjà une réservation confirmée sur le même type d’événement au même début (dans la même salle, lorsque vous en nommez une), par exemple parce que votre première demande a expiré après avoir été traitée, vous récupérez cette réservation avec une 200 et "replayed": true au lieu d’une seconde réservation ou d’une 409.
Un external_reference fonctionne comme une clé d’idempotence. Il est unique sur votre compte : si un rendez-vous porte déjà la référence que vous envoyez, ce rendez-vous est renvoyé avec un 200 et un "replayed": true et rien de nouveau n’est créé, même si la nouvelle tentative indique une heure ou un contact différent et quel que soit le statut de ce rendez-vous. Utilisez-le pour les réservations payantes (envoyez votre ID de paiement ou de commande), et envoyez une nouvelle référence pour une réservation réellement nouvelle.
| Champ | Requis | Description |
|---|---|---|
contact_id |
Oui | ID du contact pour lequel réserver. Doit appartenir à votre compte. |
start_time |
Oui | Début souhaité sous forme de date-heure ISO 8601. Une heure envoyée sans décalage horaire est lue dans le fuseau horaire de votre compte. |
event_id |
Non | ID du type d’événement à réserver. Doit appartenir à votre compte. Laissez vide pour enregistrer une réservation externe. |
title |
Uniquement sans event_id |
Le nom sous lequel le rendez-vous apparaît sur la page Rendez-vous — le nom du cours, par exemple. Jusqu’à 200 caractères. Il est renvoyé sous le nom summary. |
end_time |
Non | Fin d’une réservation externe sous forme de date-heure ISO 8601, postérieure à start_time. Inutile avec un event_id : l’heure de fin provient alors de la durée du créneau du type d’événement. |
duration_minutes |
Non | Durée d’une réservation externe, un nombre entier de minutes de 1 à 1440. Utilisez ceci ou end_time, pas les deux. Sans aucun des deux, une réservation externe dure 60 minutes. |
description |
Non | Notes libres à conserver avec le rendez-vous. |
room_name |
Non | Nom de la salle ou de la ressource, lorsque le type d’événement utilise des salles. Doit correspondre à l’une de ses salles. Laissez vide pour réserver la première salle libre. |
external_reference |
Non | Votre propre ID pour cette réservation, afin que vous puissiez la faire correspondre à l’enregistrement dans votre CRM ou système de réservation. Jusqu’à 255 caractères. Il est renvoyé à chaque lecture et dans les webhooks de rendez-vous réservé, annulé et reprogrammé. Unique sur votre compte : une référence déjà utilisée renvoie ce rendez-vous au lieu de réserver à nouveau (voir ci-dessus). |
Envoyez event_id et title ensemble, ou aucun des deux, et la requête renvoie une 400 — tout comme l’envoi simultané de end_time et duration_minutes.
cURL (utilisant le formulaire de requête ?apiKey=)
curl -X POST "https://api.youraiconnector.com/v1/appointments?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"start_time": "2026-06-15T10:00:00.000Z",
"room_name": "Room A"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/appointments", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
contact_id: "contact_abc123",
event_id: "event_xyz789",
start_time: "2026-06-15T10:00:00.000Z",
room_name: "Room A",
}),
});
const data = await res.json();
console.log(data.appointment_id);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"start_time": "2026-06-15T10:00:00.000Z",
"room_name": "Room A",
},
)
print(res.json()["appointment_id"])
Réponse (201 Created) :
{
"success": true,
"appointment_id": "aBcD1234eFgH5678",
"appointment": {
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-15T10:00:00.000Z",
"end_time": "2026-06-15T10:30:00.000Z",
"created_at": "2026-06-10T09:00:00.000Z",
"last_modified_at": "2026-06-10T09:00:00.000Z",
"room_name": "Room A",
"google_calendar_event_id": null,
"calendar_synced": false
}
}
Enregistrement d’une réservation effectuée ailleurs
Même point de terminaison, sans type d’événement : un title et un start_time suffisent, et duration_minutes définit la durée de la réservation.
cURL
curl -X POST "https://api.youraiconnector.com/v1/appointments" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contact_id": "contact_abc123",
"title": "Beginner guitar class",
"start_time": "2026-06-15T10:00:00.000Z",
"duration_minutes": 90,
"external_reference": "class-slot-4812"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/appointments", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
contact_id: "contact_abc123",
title: "Beginner guitar class",
start_time: "2026-06-15T10:00:00.000Z",
duration_minutes: 90,
}),
});
const data = await res.json();
console.log(data.appointment_id);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"contact_id": "contact_abc123",
"title": "Beginner guitar class",
"start_time": "2026-06-15T10:00:00.000Z",
"duration_minutes": 90,
},
)
print(res.json()["appointment_id"])
Réponse (201 Created) :
{
"success": true,
"appointment_id": "eFgH5678aBcD1234",
"appointment": {
"id": "eFgH5678aBcD1234",
"contact_id": "contact_abc123",
"event_id": null,
"status": "Confirmed",
"start_time": "2026-06-15T10:00:00.000Z",
"end_time": "2026-06-15T11:30:00.000Z",
"created_at": "2026-06-10T09:00:00.000Z",
"last_modified_at": "2026-06-10T09:00:00.000Z",
"summary": "Beginner guitar class",
"google_calendar_event_id": null,
"calendar_synced": false
}
}
Les réservations externes sont ensuite des rendez-vous ordinaires : ils apparaissent sur la page Rendez-vous et dans Lister les rendez-vous, ils peuvent être reprogrammés, annulés ou supprimés dans l’application ou via cette API, l’e-mail de notification de réservation est envoyé comme d’habitude, et le déclencheur d’automatisation Rendez-vous réservé ainsi que le webhook se déclenchent pour eux comme pour toute autre réservation effectuée via l’API. Les seules différences sont celles mentionnées ci-dessus — aucune vérification de disponibilité ou de capacité, aucune synchronisation de calendrier, et event_id reste null.
Obtenir un rendez-vous
GET /appointments/{appointmentId}
Renvoie un rendez-vous unique par son ID, y compris son état de synchronisation avec le calendrier.
cURL
curl "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.appointment);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["appointment"])
Réponse (200 OK) :
{
"success": true,
"appointment": {
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-15T10:00:00.000Z",
"end_time": "2026-06-15T10:30:00.000Z",
"room_name": "Room A",
"google_calendar_event_id": "abc123googleevent",
"calendar_synced": true
}
}
Lister les rendez-vous
GET /appointments
Liste les rendez-vous de votre compte, du plus récent au plus ancien, avec une pagination basée sur un curseur.
| Paramètre de requête | Requis | Description |
|---|---|---|
contact_id |
Non | Renvoie uniquement les rendez-vous pour ce contact. Les listes filtrées par contact incluent uniquement les rendez-vous confirmés. |
date |
Non | Renvoie uniquement les rendez-vous de ce jour calendaire (YYYY-MM-DD). Nécessite contact_id. |
status |
Non | Filtrer par Confirmed ou Canceled. Disponible uniquement sans contact_id. |
limit |
Non | Taille de la page, un entier entre 1 et 100. Par défaut 50. |
cursor |
Non | La valeur next_cursor issue d’une réponse précédente. |
Quelques règles à garder à l’esprit :
- Sans filtres, vous obtenez tous les rendez-vous du compte, page par page.
- Par contact — définissez
contact_idpour voir les rendez-vous confirmés d’un seul contact. Vous pouvez restreindre cela à une seule journée en transmettant égalementdate. - Par statut — définissez
status(sanscontact_id) pour lister uniquement les rendez-vousConfirmedou uniquementCanceledsur l’ensemble du compte. - Le filtre
datesanscontact_id, oustatus=Canceledaveccontact_id, renvoie une400.
cURL
curl "https://api.youraiconnector.com/v1/appointments?contact_id=contact_abc123&date=2026-06-15" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({
contact_id: "contact_abc123",
date: "2026-06-15",
});
const res = await fetch(
`https://api.youraiconnector.com/v1/appointments?${params}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.appointments, data.next_cursor);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"contact_id": "contact_abc123", "date": "2026-06-15"},
)
data = res.json()
print(data["appointments"], data["next_cursor"])
Réponse (200 OK) :
{
"success": true,
"appointments": [
{
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-15T10:00:00.000Z",
"end_time": "2026-06-15T10:30:00.000Z",
"calendar_synced": true
}
],
"next_cursor": null
}
Pour parcourir les résultats, transmettez le next_cursor d’une réponse en tant que cursor de la requête suivante. Continuez jusqu’à ce que next_cursor soit null. Consultez Erreurs et pagination pour le modèle de pagination partagé.
Mettre à jour un rendez-vous
PUT /appointments/{appointmentId}
Reprogrammez un rendez-vous ou modifiez ses détails. Envoyez uniquement les champs que vous souhaitez modifier — au moins un est requis. La combinaison du début et de la fin doit rester dans l’ordre chronologique (end_time doit être après start_time). Les modifications sont automatiquement synchronisées avec l’événement du calendrier lié.
Le déplacement d’une réservation confirmée sur un type d’événement (un nouveau start_time ou room_name) fait l’objet d’une vérification de conflit comme pour une nouvelle réservation : un créneau déjà complet répond 409 et rien ne change, et une room_name qui ne correspond à aucune des salles du type d’événement répond 400. Envoyez uniquement start_time et la réservation conserve sa durée. Vos propres heures d’ouverture et période de préavis ne sont pas appliquées ici, vous pouvez donc toujours déplacer une réservation à n’importe quel moment libre.
| Champ | Description |
|---|---|
start_time |
Nouveau début, date-heure ISO 8601. Une heure envoyée sans décalage horaire est lue dans le fuseau horaire du type d’événement (ou de votre compte), comme lors de la réservation. |
end_time |
Nouvelle fin, date-heure ISO 8601, lue de la même manière. Doit être postérieure à l’heure de début. |
room_name |
Nouveau nom de salle ou de ressource. |
description |
Nouvelle description, ou null pour l’effacer. |
summary |
Nouveau résumé, ou null pour l’effacer. |
external_reference |
Nouvelle référence (jusqu’à 255 caractères), ou null pour l’effacer. Une référence qu’un autre rendez-vous possède déjà est refusée avec un 409 et un "code": "external_reference_taken". |
cURL
curl -X PUT "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"start_time": "2026-06-16T10:00:00.000Z",
"end_time": "2026-06-16T10:30:00.000Z"
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
start_time: "2026-06-16T10:00:00.000Z",
end_time: "2026-06-16T10:30:00.000Z",
}),
}
);
const data = await res.json();
console.log(data.appointment);
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"start_time": "2026-06-16T10:00:00.000Z",
"end_time": "2026-06-16T10:30:00.000Z",
},
)
print(res.json()["appointment"])
Réponse (200 OK) :
{
"success": true,
"appointment_id": "aBcD1234eFgH5678",
"appointment": {
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-16T10:00:00.000Z",
"end_time": "2026-06-16T10:30:00.000Z",
"calendar_synced": true
}
}
Annuler un rendez-vous
POST /appointments/{appointmentId}/cancel
Annule un rendez-vous confirmé, en enregistrant éventuellement un motif. Le rendez-vous reste dans votre compte avec le statut Canceled, et l’événement de calendrier associé est supprimé automatiquement en arrière-plan. L’annulation d’un rendez-vous déjà annulé renvoie une erreur 400.
| Champ | Requis | Description |
|---|---|---|
cancellation_reason |
Non | Motif de l’annulation, enregistré sur le rendez-vous. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/cancel" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"cancellation_reason": "Client asked to reschedule next month"
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/cancel",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
cancellation_reason: "Client asked to reschedule next month",
}),
}
);
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/cancel",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"cancellation_reason": "Client asked to reschedule next month"},
)
print(res.json()["success"])
Réponse (200 OK) :
{
"success": true,
"appointment_id": "aBcD1234eFgH5678"
}
Renvoyer la confirmation de réservation
POST /appointments/{appointmentId}/resend-confirmation
Renvoie au contact sa confirmation de réservation, par exemple s’il indique ne jamais l’avoir reçue ou qu’elle est arrivée dans ses courriers indésirables. Deux éléments sont envoyés, sauf si vous en désactivez un : l’e-mail de confirmation (le même que celui reçu par le contact lors de sa réservation) et, si le rendez-vous figure dans votre Google Agenda, l’invitation Google Agenda. Les deux sont envoyés à l’adresse e-mail du contact.
| Champ | Requis | Description |
|---|---|---|
email |
Non | false ignore l’e-mail de confirmation. La valeur par défaut est true. |
calendar_invite |
Non | false ignore l’invitation Google Agenda. La valeur par défaut est true. |
Chaque partie renvoie son propre résultat : sent, not_requested, no_contact_email, turned_off_for_event_type (l’option Envoyer un e-mail de rendez-vous au contact du type d’événement est désactivée), not_on_google_calendar, imported (les rendez-vous importés depuis votre calendrier ne reçoivent pas d’e-mail de confirmation) ou failed.
200lorsqu’au moins une partie a été envoyée.recipientest l’adresse vers laquelle l’envoi a été effectué.409pour un rendez-vous annulé, un rendez-vous déjà passé, ou une réservation effectuée via Zenchef, Formitable, OpenTable, TheFork ou Trafft (ce système envoie sa propre confirmation).codeestappointment_canceled,appointment_in_pastoumanaged_by_provider.422lorsqu’aucun envoi n’a pu être effectué, avec la raison danserror.
cURL
curl -X POST "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/resend-confirmation" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/resend-confirmation",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ calendar_invite: false }),
}
);
const data = await res.json();
console.log(data.email, data.recipient);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/resend-confirmation",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={},
)
print(res.json())
Réponse (200 OK) :
{
"success": true,
"appointment_id": "aBcD1234eFgH5678",
"email": "sent",
"calendar_invite": "sent",
"recipient": "jane@example.com"
}
Supprimer un rendez-vous
DELETE /appointments/{appointmentId}
Supprime définitivement un rendez-vous et ses références. Si vous souhaitez seulement annuler la réservation tout en conservant l’enregistrement, utilisez plutôt annuler.
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.delete(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["success"])
Réponse (200 OK) :
{
"success": true
}
Lister vos agendas Google connectés
GET /appointments/google-calendars
Renvoie les agendas Google disponibles sur ce compte, directement depuis Google — utile pour montrer au titulaire du compte un sélecteur de l’agenda à partir duquel importer ci-dessous, ou simplement pour confirmer que la connexion est active.
Cela ne fonctionne qu’une fois que le compte a connecté Google Calendar (Paramètres → Intégrations) avec au moins un accès en lecture. Si ce n’est pas le cas, ou si l’accès accordé n’inclut plus la portée de lecture du calendrier, vous recevrez une 400 vous demandant de le (re)connecter.
cURL
curl "https://api.youraiconnector.com/v1/appointments/google-calendars" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/appointments/google-calendars", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.data);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments/google-calendars",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["data"])
Réponse (200 OK) :
{
"success": true,
"data": [
{
"id": "primary",
"summary": "jane@example.com",
"timeZone": "America/New_York",
"accessRole": "owner",
"primary": true
},
{
"id": "abcdefg1234567890@group.calendar.google.com",
"summary": "Bookings",
"timeZone": "America/New_York",
"accessRole": "writer"
}
]
}
Chaque entrée correspond à la forme CalendarListEntry de Google, donc les noms des champs suivent la camelCase de Google, et non la snake_case habituelle de cette API — il s’agit des données de Google transmises telles quelles, et non des nôtres. Une connexion manquante ou révoquée renvoie 400 avec une erreur expliquant que Google Calendar doit être (re)connecté.
Importer des événements depuis un Google Calendar
POST /appointments/import-calendar-events
Récupère les événements déjà présents dans le ou les Google Calendar connectés d’une campagne ou d’un agent IA et les transforme en rendez-vous — utile la première fois que vous connectez un calendrier qui contient déjà des réservations. Cela peut prendre un certain temps (chaque événement passe par une extraction pour déterminer à qui il est destiné), donc cela ne s’exécute jamais en ligne : la requête met en file d’attente une tâche en arrière-plan et vous renvoie un job_id à interroger.
| Champ | Requis | Description |
|---|---|---|
campaign_id |
L’un de ces deux | La campagne dont le ou les calendriers connectés doivent être importés. |
agent_id |
L’un de ces deux | L’agent IA dont le ou les calendriers connectés doivent être importés. |
identifier |
Oui | "EMAIL" ou "PHONE_NUMBER" — quelle information de contact extraire de chaque événement de calendrier pour faire correspondre ou créer le contact auquel il appartient. |
Envoyez exactement l’un des deux campaign_id / agent_id, jamais les deux et jamais aucun des deux — toute autre combinaison renvoie une 400. Celui que vous envoyez doit appartenir à votre compte, sinon vous recevrez une 404.
cURL
curl -X POST "https://api.youraiconnector.com/v1/appointments/import-calendar-events?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "agent_abc123",
"identifier": "EMAIL"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/appointments/import-calendar-events", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
agent_id: "agent_abc123",
identifier: "EMAIL",
}),
});
const data = await res.json();
console.log(data.job_id);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments/import-calendar-events",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"agent_id": "agent_abc123", "identifier": "EMAIL"},
)
print(res.json()["job_id"])
Réponse (202 Accepted) :
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "queued",
"campaign_id": null,
"agent_id": "agent_abc123"
}
campaign_id et agent_id renvoient celui que vous avez envoyé ; l’autre est toujours null.
Interroger la tâche d’importation
GET /appointments/import-calendar-events/{jobId}
curl "https://api.youraiconnector.com/v1/appointments/import-calendar-events/jK9mQ2xR7pL4wN1t" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) :
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "completed",
"message": "Imported 12 events as appointments.",
"error": null
}
status |
Signification |
|---|---|
queued |
Pas encore pris en charge. Continuez à interroger. |
processing |
L’importation est en cours. Continuez à interroger. |
completed |
Terminé — message contient un court résumé lisible par l’homme. |
failed |
Quelque chose a mal tourné — error contient la raison. |
GET sur un jobId qui n’existe pas (ou qui appartient à un compte différent) renvoie 404.
Intégrations de réservation externes (Zenchef / Formitable / OpenTable / TheFork / Trafft)
Zenchef et Formitable sont des systèmes de réservation de restaurant via lesquels votre agent IA peut réserver de vraies tables ; Trafft est une plateforme de planification pour les entreprises fonctionnant sur rendez-vous, connectée une fois par compte plutôt que par restaurant. Les deux plateformes de restauration disposent chacune d’un widget de réservation public et non authentifié (https://api.youraiconnector.com/v1/zenchef-widget/... et https://api.youraiconnector.com/v1/formitable-widget/...) qui s’affiche dans le chat pour le client — ces routes de widget sont de simples pages HTML destinées à être ouvertes dans un navigateur, et non des points de terminaison d’API JSON, elles ne sont donc pas documentées ici. Ce qui suit concerne les points de terminaison de gestion de compte : vérifier qu’un identifiant de restaurant appartient au titulaire du compte, puis l’ajouter, le mettre à jour ou le supprimer.
Zenchef
La connexion d’un restaurant Zenchef est une vérification en deux étapes, afin que le titulaire du compte prouve qu’il gère réellement le restaurant avant qu’il ne soit relié au bot : vérifiez d’abord que l’identifiant existe (sans révéler le nom), puis demandez-lui de saisir lui-même le nom du restaurant et vérifiez qu’il correspond.
Étape 1 — Vérifier l’existence d’un identifiant de restaurant
POST /appointments/zenchef-restaurants/check
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | L’identifiant du restaurant Zenchef à vérifier. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/check?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "12345" }'
Réponse (200 OK) :
{
"success": true,
"data": { "exists": true, "requiresNameVerification": true }
}
exists: false signifie qu’aucun restaurant Zenchef ne possède cet identifiant — rien d’autre à faire. Limité à 10 vérifications par tranche de 5 minutes par compte ; tout dépassement renvoie 429.
Étape 2 — Vérifier le nom du restaurant
POST /appointments/zenchef-restaurants/verify-name
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | L’identifiant du restaurant Zenchef de l’étape 1. |
user_input_name |
Oui | Le nom saisi par le titulaire du compte — comparé au nom réel du restaurant sur Zenchef (insensible à la casse et aux espaces). |
curl -X POST "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/verify-name?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "12345", "user_input_name": "The Blue Door Bistro" }'
Réponse (200 OK) :
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"id": "12345",
"name": "The Blue Door Bistro",
"address": "1 Rue de Rivoli, Paris",
"status": "active"
}
}
}
verified: false signifie que le nom ne correspond pas — restaurantDetails est omis, demandez au titulaire du compte de réessayer. Limité à 3 tentatives par tranche de 5 minutes (plus strict que la vérification d’existence, car il s’agit de l’étape de preuve réelle). Un restaurant_id qui ne correspond plus sur Zenchef renvoie 404.
Étape 3 — Enregistrer le restaurant
POST /appointments/zenchef-restaurants
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | 1 à 64 caractères, lettres/chiffres/underscore/tiret. |
restaurant_name |
Oui | Le nom du restaurant vérifié à l’étape 2. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "12345", "restaurant_name": "The Blue Door Bistro" }'
Réponse (201 Created) :
{ "success": true, "data": { "restaurantId": "12345" } }
Mettre à jour un restaurant Zenchef enregistré
PUT /appointments/zenchef-restaurants/{restaurantId}
| Champ | Requis | Description |
|---|---|---|
restaurant_name |
Non | Nouveau nom d’affichage. |
is_active |
Non | Définissez false pour empêcher le bot de réserver dans ce restaurant sans le supprimer. |
curl -X PUT "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/12345" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
Réponse (200 OK) : même structure que la réponse d’enregistrement ci-dessus.
Supprimer un restaurant Zenchef
DELETE /appointments/zenchef-restaurants/{restaurantId}
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/12345" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) : { "success": true, "data": { "restaurantId": "12345" } }
Un restaurantId qui n’est pas actuellement sur le compte renvoie 404 lors d’une mise à jour ou d’une suppression.
Formitable
Formitable n’a pas besoin de la vérification de nom en deux étapes comme Zenchef — ses identifiants de restaurant sont déjà limités par entreprise, donc un seul appel de vérification suffit. Il dispose également d’une recherche de détails utilisée pour mettre en cache l’URL du site web du restaurant lors de la configuration.
Vérifier un identifiant de restaurant
POST /appointments/formitable-restaurants/verify
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | L’identifiant de restaurant Formitable. |
language |
Non | Balise de langue pour la requête de test. La valeur par défaut est "nl". |
curl -X POST "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/verify?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "the-blue-door", "language": "en" }'
Réponse (200 OK) :
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"restaurantId": "the-blue-door",
"productCount": 4,
"sampleProductTitle": "Dinner for two",
"language": "en"
}
}
}
Un restaurant_id que Formitable ne reconnaît pas renvoie 404. Limité à 10 tentatives par tranche de 5 minutes par compte.
Obtenir les détails du restaurant
GET /appointments/formitable-restaurants/{restaurantId}/details?language=en
Récupère le profil public du restaurant depuis Formitable, y compris son site web — utilisé pour mettre en cache l’URL du site web lors de la configuration du restaurant. language est un paramètre de requête optionnel, dont la valeur par défaut est "en".
curl "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door/details?language=en" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) :
{
"success": true,
"data": {
"uid": "the-blue-door",
"name": "The Blue Door Bistro",
"website": "https://thebluedoorbistro.com",
"email": "info@thebluedoorbistro.com",
"telephone": "+31201234567",
"streetAddress": "Prinsengracht 1",
"zipcode": "1015 AB",
"city": "Amsterdam",
"country": "Netherlands",
"countryCode": "NL",
"currency": "EUR"
}
}
Enregistrer le restaurant
POST /appointments/formitable-restaurants
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | 1–64 caractères, lettres/chiffres/underscore/tiret. |
restaurant_name |
Oui | Nom d’affichage. |
language |
Oui | Étiquette de langue ISO, par ex. "en" ou "en-GB". |
website_url |
Non | Le site web du restaurant, issu de la recherche de détails ci-dessus. Doit être http(s)://. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/formitable-restaurants?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"restaurant_id": "the-blue-door",
"restaurant_name": "The Blue Door Bistro",
"language": "en",
"website_url": "https://thebluedoorbistro.com"
}'
Réponse (201 Created) : { "success": true, "data": { "restaurantId": "the-blue-door" } }
Mettre à jour un restaurant Formitable enregistré
PUT /appointments/formitable-restaurants/{restaurantId}
| Champ | Requis | Description |
|---|---|---|
restaurant_name |
Non | Nouveau nom d’affichage. |
language |
Non | Nouvelle étiquette de langue ISO. |
is_active |
Non | Définissez false pour empêcher le bot de réserver auprès de ce restaurant sans le supprimer. |
website_url |
Non | Nouvelle URL de site web. |
curl -X PUT "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
Réponse (200 OK) : même structure que la réponse d’enregistrement ci-dessus.
Supprimer un restaurant Formitable
DELETE /appointments/formitable-restaurants/{restaurantId}
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) : { "success": true, "data": { "restaurantId": "the-blue-door" } }
Un restaurantId qui n’est pas actuellement sur le compte renvoie 404 lors d’une mise à jour ou d’une suppression.
OpenTable
Les restaurants OpenTable sont accessibles via les identifiants de partenaire OpenTable de la plateforme, et OpenTable ne permet à ces identifiants de voir que les restaurants ayant connecté l’inscription de la plateforme dans la Marketplace d’intégrations d’OpenTable. Ainsi, tout comme pour Formitable, un appel de vérification suffit : un ID de restaurant accessible (le « RID » numérique) prouve à la fois que le restaurant existe et qu’il a connecté l’intégration. Tant que l’inscription partenaire OpenTable n’est pas activée sur la plateforme, l’appel de vérification répond 503.
Vérifier un restaurant OpenTable
POST /appointments/opentable-restaurants/verify
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | L’ID de restaurant OpenTable (RID), un nombre tel que 1038007. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/opentable-restaurants/verify?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "1038007" }'
Réponse (200 OK) :
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"restaurantId": "1038007",
"diningAreaCount": 2,
"diningAreaNames": ["Main Room", "Garden"],
"tableTypes": ["default", "outdoor", "bar"]
}
}
}
verified: false signifie qu’aucun restaurant OpenTable ne possède cet ID. Un 403 signifie que le restaurant existe mais n’a pas encore connecté l’intégration de la plateforme dans OpenTable. Limité à 10 tentatives par tranche de 5 minutes par compte.
Ajouter un restaurant OpenTable
POST /appointments/opentable-restaurants
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | L’ID de restaurant vérifié. |
restaurant_name |
Oui | Nom d’affichage (une étiquette ; c’est aussi ainsi que l’IA appelle le restaurant). |
website_url |
Non | Une URL http(s) montrée aux invités lorsque l’IA les redirige vers le restaurant. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/opentable-restaurants?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "1038007", "restaurant_name": "The Blue Door", "website_url": "https://thebluedoor.example" }'
Réponse (201 Created) : { "success": true, "data": { "restaurantId": "1038007" } }
Mettre à jour un restaurant OpenTable enregistré
PUT /appointments/opentable-restaurants/{restaurantId}
Envoyez l’un des éléments suivants : restaurant_name, is_active (mettez en pause avec false) ou website_url (une chaîne vide efface le champ) ; les champs omis restent inchangés.
curl -X PUT "https://api.youraiconnector.com/v1/appointments/opentable-restaurants/1038007" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
Réponse (200 OK) : { "success": true, "data": { "restaurantId": "1038007" } }
Supprimer un restaurant OpenTable
DELETE /appointments/opentable-restaurants/{restaurantId}
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/opentable-restaurants/1038007" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) : { "success": true, "data": { "restaurantId": "1038007" } }
Un restaurantId qui n’est pas actuellement sur le compte renvoie 404 lors d’une mise à jour.
TheFork
Les restaurants TheFork sont accessibles via les identifiants de partenaire TheFork de la plateforme, et TheFork ne permet à ces identifiants de voir que les restaurants ayant activé le partenaire de la plateforme sur leur compte TheFork. Ainsi, tout comme pour Formitable et OpenTable, un seul appel de vérification suffit : un ID de restaurant accessible prouve à la fois que le restaurant existe et que le partenaire est activé pour celui-ci. L’ID est l’UUID que TheFork attribue au restaurant dans TheFork Manager, envoyé sous forme de chaîne de caractères. Tant que TheFork n’a pas approuvé la plateforme en tant que partenaire et n’a pas émis les identifiants, l’appel de vérification répond 503 — voir TheFork pour savoir ce que cela signifie aujourd’hui.
Vérifier un restaurant TheFork
POST /appointments/thefork-restaurants/verify
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | L’ID du restaurant TheFork, un UUID tel que 9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/thefork-restaurants/verify?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60" }'
Réponse (200 OK) :
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"restaurantId": "9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60",
"partySizes": [1, 2, 3, 4, 5, 6, 7, 8]
}
}
}
partySizes correspond aux tailles de groupe que le restaurant accepte en ligne au cours des 30 prochains jours. Un 404 ou 403 signifie que TheFork ne nous a pas fourni de restaurant avec cet ID — soit l’ID est incorrect, soit le partenaire de la plateforme n’est pas encore activé sur ce restaurant ; un 400 signifie que l’ID n’est pas un UUID. Limité à 10 tentatives par tranche de 5 minutes par compte.
Ajouter un restaurant TheFork
POST /appointments/thefork-restaurants
| Champ | Requis | Description |
|---|---|---|
restaurant_id |
Oui | L’ID du restaurant vérifié (UUID). |
restaurant_name |
Oui | Nom d’affichage (une étiquette ; c’est aussi le nom utilisé par l’IA pour désigner le restaurant). |
website_url |
Non | Une URL http(s) affichée aux invités lorsque l’IA les redirige vers le restaurant. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/thefork-restaurants?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60", "restaurant_name": "The Blue Door", "website_url": "https://thebluedoor.example" }'
Réponse (201 Created) : { "success": true, "data": { "restaurantId": "9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60" } }
Mettre à jour un restaurant TheFork enregistré
PUT /appointments/thefork-restaurants/{restaurantId}
Envoyez l’un des éléments suivants : restaurant_name, is_active (mettez en pause avec false) ou website_url (une chaîne vide efface le champ) ; les champs omis restent inchangés.
curl -X PUT "https://api.youraiconnector.com/v1/appointments/thefork-restaurants/9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
Réponse (200 OK) : { "success": true, "data": { "restaurantId": "9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60" } }
Supprimer un restaurant TheFork
DELETE /appointments/thefork-restaurants/{restaurantId}
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/thefork-restaurants/9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) : { "success": true, "data": { "restaurantId": "9f2a1c34-5b6d-4e7f-8a90-1b2c3d4e5f60" } }
Un restaurantId qui n’est pas actuellement sur le compte renvoie 404 lors d’une mise à jour ou d’une suppression.
Trafft
Trafft est connecté une fois pour l’ensemble du compte, et non par emplacement : une adresse d’entreprise plus les identifiants API provenant du panneau d’administration Trafft (Features & Integrations → API & Connectors, inclus dans le plan Business de Trafft). L’appel de connexion vérifie ces identifiants auprès de Trafft avant de stocker quoi que ce soit ; ainsi, une adresse erronée, des identifiants incorrects ou un plan sans accès API échoueront ici plutôt que lors d’une conversation avec un client. Le secret client est stocké de manière chiffrée et n’est jamais renvoyé par aucun point de terminaison.
Les trois appels d’écriture (POST, PUT, DELETE) nécessitent l’autorisation edit sur les intégrations ; le statut GET nécessite l’autorisation view sur les intégrations.
Connecter Trafft
POST /appointments/trafft/connect
| Champ | Requis | Description |
|---|---|---|
subdomain |
Oui | L’adresse de l’entreprise — la partie avant .admin.trafft.com dans l’URL de connexion, par ex. acme. Une adresse complète est acceptée et réduite à la même valeur. |
client_id |
Oui | Identifiant client (Client ID) depuis la page API & Connectors de Trafft. |
client_secret |
Oui | Secret client (Client Secret) depuis la même page. Stocké de manière chiffrée, jamais renvoyé. |
company_name |
Non | Une étiquette pour votre propre liste. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/trafft/connect?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"subdomain": "acme",
"client_id": "YOUR_TRAFFT_CLIENT_ID",
"client_secret": "YOUR_TRAFFT_CLIENT_SECRET",
"company_name": "Acme Salon"
}'
Réponse (200 OK) :
{
"success": true,
"data": {
"subdomain": "acme",
"service_count": 12,
"employee_count": 4,
"location_count": 2
}
}
Les décomptes sont renvoyés par Trafft lors de la vérification — c’est le moyen le plus rapide de confirmer que les identifiants pointent vers le compte souhaité.
Obtenir le statut de la connexion
GET /appointments/trafft
curl "https://api.youraiconnector.com/v1/appointments/trafft" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) :
{
"success": true,
"data": {
"connected": true,
"subdomain": "acme",
"hostname": "acme.admin.trafft.com",
"client_id": "YOUR_TRAFFT_CLIENT_ID",
"company_name": "Acme Salon",
"is_active": true,
"service_count": 12,
"employee_count": 4,
"location_count": 2
}
}
connected: false signifie que rien n’est encore configuré. Le secret client n’est jamais inclus dans cette réponse.
Mettre à jour la connexion
PUT /appointments/trafft
| Champ | Requis | Description |
|---|---|---|
is_active |
Non | Définissez false sur pause — l’IA cesse de réserver dans Trafft, la connexion est maintenue. true la reprend. |
company_name |
Non | Nouvelle étiquette. |
curl -X PUT "https://api.youraiconnector.com/v1/appointments/trafft" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
Réponse (200 OK) : le même objet de connexion que le GET ci-dessus.
Déconnecter Trafft
DELETE /appointments/trafft
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/trafft" \
-H "X-API-Key: YOUR_API_KEY"
Réponse (200 OK) : { "success": true }
La déconnexion supprime uniquement les identifiants stockés. Les rendez-vous déjà présents dans Trafft ne sont pas modifiés.
Format d’erreur sur tous les endpoints Zenchef/Formitable/OpenTable/TheFork : contrairement au reste de cette page, les erreurs ici portent leur statut deux fois — une fois en tant que statut HTTP et une fois en tant que
error_codedans le corps de la réponse — par exemple{ "success": false, "error": "Restaurant not found", "error_code": 404 }. Gérez-les de la même manière que toute autre erreur : vérifiezsuccess, lisezerrorpour le message.
Erreurs de l’API Rendez-vous
Les points de terminaison des rendez-vous renvoient l’enveloppe d’erreur standard :
{
"success": false,
"error": "Appointment not found"
}
| Statut | Quand cela se produit sur un point de terminaison de rendez-vous |
|---|---|
400 |
Un champ requis est manquant ou invalide — par exemple un mauvais start_time, un end_time non postérieur à start_time, une combinaison de filtres invalide, aucun champ à mettre à jour, ou un rendez-vous déjà annulé. Lors de la réservation : ni event_id ni title envoyés, les deux envoyés ensemble, à la fois end_time et duration_minutes envoyés, un title de plus de 200 caractères, ou un duration_minutes en dehors de 1–1440. |
404 |
Le rendez-vous, le contact ou le type d’événement n’a pas été trouvé. |
409 |
Le créneau horaire demandé est déjà pris (conflit de réservation), ou lors d’une mise à jour, le external_reference est déjà utilisé par un autre rendez-vous. |
Les codes partagés que chaque point de terminaison peut renvoyer — 401, 403 (votre forfait n’inclut pas l’accès à l’API), 429 (limite de débit) et 500 — sont répertoriés avec des conseils de nouvelle tentative dans Erreurs et pagination.
Étapes suivantes
- Contacts — créez et recherchez les contacts pour lesquels vous effectuez des réservations.
- Messages et conversations — envoyez une confirmation ou un rappel à un contact.
- Webhooks — soyez averti lorsque des rendez-vous sont modifiés.