Os plugins de conversão para reservas em restaurantes no ChatGPT estão em fase beta. Estamos testando esses plugins com parceiros aprovados. Para solicitar acesso, preencha
o formulário
Objetivo
Nosso objetivo é permitir que o ChatGPT acione diretamente os plugins dos parceiros quando o usuário demonstra uma intenção clara de realizar uma ação, como reservar uma mesa.
Depois que os parceiros nos fornecem um feed para a pesquisa, podemos conectar seus servidores MCP para realizar ações de conversão na etapa final do funil. Para isso, os plugins dos parceiros devem seguir um contrato padronizado que define o nome do widget, o nome da ferramenta e os dados de entrada da ferramenta.
Se quiser criar um plugin que siga esta especificação, solicite acesso pelo formulário do ChatGPT para estabelecimentos comerciais.
Experiência do usuário
Quando o usuário pesquisa restaurantes próximos, tanto o cartão do restaurante quanto a barra lateral exibem o botão Reservar, que pode abrir a interface do serviço de reservas usado pelo restaurante.
Botão Reservar na interface do restaurante:

Janela de reserva aberta pelo botão:

Requisitos atuais do contrato
A integração atual de reservas exige apenas os seguintes nomes:
- Nome do widget:
ui://widget/restaurant-reservation.html - Nome da ferramenta:
restaurant_reservation
A ferramenta restaurant_reservation deve definir:
_meta.ui.resourceUri = "ui://widget/restaurant-reservation.html";
Toda ferramenta chamada diretamente por um widget deve definir:
_meta["openai/widgetAccessible"] = true;
Dados de entrada de restaurant_reservation
Sempre enviamos este payload mínimo:
{
"restaurant_id": "string"
}
Também podemos enviar o payload abaixo. Você pode usá-lo para renderização otimista na janela de reserva. Por exemplo, durante a hidratação dos dados, você pode exibir as informações do restaurante sem precisar mostrar um esqueleto da interface ou um indicador de carregamento.
{
"restaurant_name": "string",
"restaurant_image": "string",
"restaurant_address": {
"address": "string",
"city": "string",
"state": "string",
"zipcode": "string",
"country": "string"
}
}
Requisito de feed para integração com a pesquisa
Para encaminhar o usuário ao serviço de reservas quando ele seleciona o botão Reservar, importamos um feed de estabelecimentos fornecido pelos parceiros.
Objetivo e escopo
O contrato do feed define:
- Os dados mínimos de cada estabelecimento para identificar e classificar correspondências.
- Uma API de listagem paginada.
- Um mecanismo de detecção de alterações para evitar consultas desnecessárias ao feed completo.
Registro do estabelecimento (campos mínimos obrigatórios)
Um objeto Business deve incluir:
id(string): identificador estável e único dentro da plataforma do provedor.name(string)address(objectoustringformatada)location(objectcom latitude e longitude)phone_number(string, de preferência no formato E.164)website_url(string, URL)platform_url(string, URL da página canônica do estabelecimento na sua plataforma)
Estrutura 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"
}
Se os componentes do endereço não estiverem disponíveis em formato estruturado, address pode conter uma única string formatada. A formatação deve ser consistente e o endereço deve ser legível.
Endpoint de listagem paginada
Exemplo de endpoint:
GET /v1/businesses
Parâmetros de consulta:
- Para a paginação, use apenas um dos seguintes formatos:
page+page_sizeoffset+limit- ou
next_page_token(token opaco, preferencial quando houver suporte) changes_token(string, opcional): indica se os dados mudaram desde o último ponto de controle da sincronização.
A resposta deve incluir:
checksum(boolean): indica se houve alguma alteração desde o ponto de sincronização identificado pelochanges_token. Se a requisição omitir o token, retornetruenesse campo.businesses(Business[]): payload da página atual.- Metadados de paginação correspondentes ao formato escolhido:
page,page_sizee, opcionalmente,total_pagesoffset,limite, opcionalmente,total- ou
next_page_token(string | null)
Exemplo de requisição e resposta
Requisição:
GET /v1/businesses?page=1&page_size=2&changes_token=sync_2026_03_10
Resposta:
{
"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"
}
]
}
Como usamos o feed na pesquisa
Usamos o feed de estabelecimentos como índice de pesquisa. A cada consulta, buscamos correspondências aproximadas pelo nome e pela localização ou pelo endereço. Em seguida, classificamos os resultados e removemos duplicatas com base na semelhança entre os nomes e entre os endereços. Também consideramos a localização, o telefone e a URL.
Ampliação recomendada (opcional no momento)
Para que o usuário possa concluir todo o processo de reserva na conversa, recomendamos adicionar:
refresh_availabilitymake_reservationreservation_confirmation