Les plugins qui permettent de réserver une table dans ChatGPT sont actuellement en bêta. Nous les testons avec des partenaires agréés. Pour demander un accès, remplissez
ce formulaire
Objectif
Nous voulons permettre à ChatGPT d’appeler directement les plugins des partenaires lorsque les utilisateurs ont une intention précise, comme réserver une table.
Une fois que les partenaires nous ont fourni un flux de données pour la recherche, nous pouvons connecter leurs serveurs MCP pour permettre aux utilisateurs de passer à l’étape de conversion. Les plugins des partenaires doivent pour cela respecter un contrat commun qui définit le nom du widget, le nom de l’outil et ses données d’entrée.
Pour créer un plugin conforme à cette spécification, demandez un accès via le formulaire ChatGPT destiné aux commerçants.
Expérience utilisateur
Lorsqu’un utilisateur recherche des restaurants à proximité, un bouton Réserver apparaît sur la fiche du restaurant et dans la barre latérale. Ce bouton permet d’ouvrir l’interface du service de réservation utilisé par le restaurant.
Bouton Réserver dans l’interface du restaurant :

Fenêtre modale de réservation ouverte depuis ce bouton :

Contrat à respecter actuellement
Pour l’intégration actuelle des réservations, seuls les éléments suivants sont requis :
- Nom du widget :
ui://widget/restaurant-reservation.html - Nom de l’outil :
restaurant_reservation
restaurant_reservation doit définir la valeur suivante :
_meta.ui.resourceUri = "ui://widget/restaurant-reservation.html";
Tout outil appelé directement depuis un widget doit définir la valeur suivante :
_meta["openai/widgetAccessible"] = true;
Données d’entrée de restaurant_reservation
Données minimales (toujours envoyées) :
{
"restaurant_id": "string"
}
Nous pouvons également envoyer les données ci-dessous. Vous pouvez les utiliser pour un rendu optimiste dans la fenêtre de réservation, par exemple pour éviter d’afficher des blocs vides ou des indicateurs de chargement pendant l’hydratation des données :
{
"restaurant_name": "string",
"restaurant_image": "string",
"restaurant_address": {
"address": "string",
"city": "string",
"state": "string",
"zipcode": "string",
"country": "string"
}
}
Flux de données requis pour la recherche
Pour que le bouton Réserver ouvre le service correspondant au restaurant, nous importons un flux de données sur les établissements fourni par les partenaires.
Objectif et périmètre
Le contrat du flux définit :
- Les données minimales nécessaires pour identifier les établissements correspondants et classer les résultats.
- Une API qui renvoie la liste des établissements par pages.
- Un mécanisme de détection des changements pour éviter de récupérer inutilement l’intégralité du flux.
Fiche d’établissement (champs obligatoires)
Un objet Business doit contenir les champs suivants :
id(string) : identifiant stable et unique chez le fournisseur.name(string)address(objectoustringformatée)location(objectcontenant la latitude et la longitude)phone_number(string, de préférence au format E.164)website_url(string, URL)platform_url(string, URL de la fiche canonique sur votre plateforme)
Structure minimale recommandée :
{
"id": "biz_123",
"name": "Acme Coffee",
"address": {
"line1": "123 Market St",
"line2": "Suite 5",
"locality": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US",
"formatted": "123 Market St, Suite 5, San Francisco, CA 94105, US"
},
"location": {
"latitude": 37.793,
"longitude": -122.396
},
"phone_number": "+14155551234",
"website_url": "https://acmecoffee.example",
"platform_url": "https://provider.example/biz/biz_123"
}
Si les éléments de l’adresse ne sont pas disponibles sous forme structurée, address peut contenir une seule chaîne de caractères. Celle-ci doit suivre un format cohérent et être facile à lire.
Point de terminaison pour la liste paginée
Exemple de point de terminaison :
GET /v1/businesses
Paramètres de requête :
- Pagination : utilisez une seule des méthodes suivantes.
page+page_sizeoffset+limit- ou
next_page_token(jeton opaque, à privilégier si cette méthode est prise en charge) changes_token(string, facultatif) : indique si les données ont changé depuis le dernier point de synchronisation.
La réponse doit inclure :
checksum(boolean) : indique si des données ont changé depuis le point de synchronisation correspondant auchanges_tokenfourni (ou vauttruesi aucun jeton n’a été fourni).businesses(Business[]) : données de la page courante.- Les métadonnées de pagination correspondant à la méthode choisie :
page,page_size,total_pages(facultatif), ouoffset,limit,total(facultatif), ounext_page_token(string | null)
Exemple de requête et de réponse
Requête :
GET /v1/businesses?page=1&page_size=2&changes_token=sync_2026_03_10
Réponse :
{
"checksum": true,
"page": 1,
"page_size": 2,
"total_pages": 120,
"businesses": [
{
"id": "biz_123",
"name": "Acme Coffee",
"address": {
"line1": "123 Market St",
"locality": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US",
"formatted": "123 Market St, San Francisco, CA 94105, US"
},
"location": {
"latitude": 37.793,
"longitude": -122.396
},
"phone_number": "+14155551234",
"website_url": "https://acmecoffee.example",
"platform_url": "https://provider.example/biz/biz_123"
},
{
"id": "biz_124",
"name": "Golden Diner",
"address": "200 Howard St, San Francisco, CA 94105, US",
"location": {
"latitude": 37.789,
"longitude": -122.391
},
"phone_number": "+14155559876",
"website_url": "https://goldendiner.example",
"platform_url": "https://provider.example/biz/biz_124"
}
]
}
Utilisation du flux pour la recherche
Nous utilisons le flux des établissements comme index de recherche. À chaque requête, nous recherchons des correspondances approximatives à partir du nom et de la localisation ou de l’adresse. Nous classons ensuite les résultats et éliminons les doublons en comparant les noms et les adresses. Nous tenons également compte de la localisation, du numéro de téléphone et de l’URL.
Extensions recommandées (actuellement facultatives)
Pour permettre aux utilisateurs d’effectuer toute la réservation dans la discussion, nous recommandons d’ajouter les outils suivants :
refresh_availabilitymake_reservationreservation_confirmation