Los complementos de conversión para reservas en restaurantes de ChatGPT están actualmente en beta y se están probando con socios aprobados. Para solicitar acceso, completa este formulario
aquí
Objetivo
Nuestro objetivo es permitir que ChatGPT invoque directamente complementos de socios para casos de uso con una clara intención de realizar una acción, como reservar en un restaurante.
Una vez que los socios nos proporcionen un feed de datos para las búsquedas, podemos conectar sus servidores MCP para realizar acciones de conversión en la etapa final del embudo. Para ello, los complementos de los socios deben seguir un contrato estandarizado para el nombre del widget, el nombre de la herramienta y sus datos de entrada.
Si quieres crear un complemento que cumpla con esta especificación, solicita acceso mediante el formulario para comerciantes de ChatGPT.
Experiencia de usuario
Cuando los usuarios buscan restaurantes cercanos, la tarjeta del restaurante y la barra lateral incluyen un botón Reservar que permite abrir la interfaz del proveedor de reservas del restaurante.
Botón Reservar en la interfaz del restaurante:

Ventana modal de reservas que se abre desde ese botón:

Contrato obligatorio (actualmente)
Para la integración actual de reservas, solo se requiere lo siguiente:
- Nombre del widget:
ui://widget/restaurant-reservation.html - Nombre de la herramienta:
restaurant_reservation
restaurant_reservation debe establecer:
_meta.ui.resourceUri = "ui://widget/restaurant-reservation.html";
Toda herramienta que se llame directamente desde un widget debe establecer:
_meta["openai/widgetAccessible"] = true;
Datos de entrada de restaurant_reservation
Carga útil mínima (se envía siempre):
{
"restaurant_id": "string"
}
También podríamos enviar la siguiente carga útil. Puedes usarla para el renderizado optimista de la ventana modal (por ejemplo, para evitar mostrar estructuras de contenido provisionales o estados de carga mientras se hidratan los datos):
{
"restaurant_name": "string",
"restaurant_image": "string",
"restaurant_address": {
"address": "string",
"city": "string",
"state": "string",
"zipcode": "string",
"country": "string"
}
}
Requisito del feed de datos (integración de búsqueda)
Para habilitar el enrutamiento del botón Reservar, incorporamos un feed de datos de negocios proporcionado por los socios.
Objetivo y alcance
Este contrato del feed de datos define:
- Los datos mínimos de los negocios necesarios para encontrar y ordenar coincidencias.
- Una API de listado paginado.
- La detección de cambios para evitar obtener todos los datos cuando no sea necesario.
Registro del negocio (campos mínimos obligatorios)
Un objeto Business debe incluir:
id(string): estable y único dentro del proveedor.name(string)address(objectostringcon formato)location(objectcon latitud/longitud)phone_number(string, preferiblemente en formato E.164)website_url(string, URL)platform_url(string, URL de tu ficha canónica)
Estructura mínima recomendada:
{
"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 no se dispone de los componentes estructurados de la dirección, address puede ser una sola
cadena con formato, pero debe ser consistente y legible para las personas.
Punto de acceso de listado paginado
Ejemplo de punto de acceso:
GET /v1/businesses
Parámetros de consulta:
- Paginación: usa un solo estilo
page+page_sizeoffset+limit- o
next_page_token(token opaco; preferible cuando se admite) changes_token(string, opcional): indica si los datos cambiaron desde el último punto de control de sincronización.
La respuesta debe incluir:
checksum(boolean): indica si hubo algún cambio desde elchanges_tokenproporcionado (otruesi no se proporcionó ninguno).businesses(Business[]): carga útil de la página actual.- Metadatos de paginación para el estilo seleccionado:
page,page_size,total_pages(opcional), ooffset,limit,total(opcional), onext_page_token(string | null)
Ejemplo de solicitud y respuesta
Solicitud:
GET /v1/businesses?page=1&page_size=2&changes_token=sync_2026_03_10
Respuesta:
{
"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"
}
]
}
Cómo usamos este feed de datos para las búsquedas
Tratamos el feed de datos de negocios como un índice de búsqueda. Al realizar una consulta, recuperamos candidatos mediante coincidencias aproximadas (nombre + ubicación/dirección). Luego los ordenamos y eliminamos los duplicados según la similitud del nombre y la dirección, con la ubicación, el teléfono y la URL como señales adicionales.
Ampliación recomendable (actualmente no obligatoria)
Para completar todo el proceso dentro del chat, recomendamos agregar:
refresh_availabilitymake_reservationreservation_confirmation