For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal
Theme
Visão geral Documentação para usuários do ChatGPT e do Codex Casos de uso

Especificação de conversão para reservas em restaurantes

Contrato para integrar um plugin de reservas em restaurantes ao fluxo de reservas do ChatGPT.

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:

Botão Reservar na interface do restaurante

Janela de reserva aberta pelo botão:

Janela de reserva aberta pelo botão Reservar

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 (object ou string formatada)
  • location (object com 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_size
  • offset + 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 pelo changes_token. Se a requisição omitir o token, retorne true nesse campo.
  • businesses (Business[]): payload da página atual.
  • Metadados de paginação correspondentes ao formato escolhido:
  • page, page_size e, opcionalmente, total_pages
  • offset, limit e, 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_availability
  • make_reservation
  • reservation_confirmation