Agendamentos
A API de Agendamentos permite que você marque compromissos para seus contatos em seus tipos de evento e, em seguida, busque, liste, atualize, cancele ou exclua esses compromissos. Ela também responde à pergunta que surge primeiro na maioria dos fluxos de agendamento — quais horários estão realmente livres — e cobre o lado do calendário: listando os Google Calendars que você conectou e importando eventos que já existem neles. Quando uma conexão com o Google Calendar está ativa, o evento de calendário correspondente é criado e mantido sincronizado automaticamente em segundo plano. Restaurantes que usam Zenchef ou Formitable para seus próprios sistemas de reserva também podem ser verificados e conectados aqui, para que o Agente de IA reserve mesas reais em vez de compromissos internos.
Todos os caminhos nesta página são relativos à URL base https://api.youraiconnector.com/v1. Cada solicitação precisa da sua chave de API — consulte Autenticação para obter a lista completa de formas de enviá-la. Os exemplos abaixo usam o cabeçalho X-API-Key, com um exemplo cURL mostrando também o formato de consulta ?apiKey=.
Eventos vs. agendamentos: Um tipo de evento é uma definição de intervalo reservável (o tipo de reunião, sua duração, suas salas). Um agendamento é uma instância reservada de um tipo de evento para um contato específico. Você reserva um agendamento referenciando o contato e o tipo de evento.
O objeto de agendamento
Cada endpoint que retorna um agendamento usa a mesma estrutura:
| Campo | Descrição |
|---|---|
id |
ID exclusivo do agendamento. |
contact_id |
ID do contato com o qual o agendamento foi marcado. |
event_id |
ID do tipo de evento no qual o agendamento foi marcado. |
status |
Confirmed ou Canceled. |
start_time |
Início do agendamento, ISO 8601 em UTC. |
end_time |
Fim do agendamento, ISO 8601 em UTC. |
created_at |
Quando o agendamento foi criado. |
last_modified_at |
Quando o agendamento foi alterado pela última vez. |
room_name |
Sala ou recurso no qual o agendamento foi marcado, quando o tipo de evento usa salas. |
description |
Descrição de formato livre do agendamento. |
summary |
Resumo ou título curto. |
cancelation_reason |
Motivo fornecido quando o agendamento foi cancelado, se houver. |
google_calendar_event_id |
ID do evento vinculado do Google Agenda. Definido assim que a sincronização do calendário for concluída; null quando nenhum calendário estiver conectado ou enquanto a sincronização ainda estiver em andamento. |
calendar_synced |
true assim que o agendamento estiver vinculado a um evento de calendário. |
imported |
true quando o agendamento foi importado de um calendário externo em vez de reservado diretamente. |
is_recurring |
true quando o agendamento faz parte de uma série recorrente. |
recurrence_frequency |
Com que frequência o agendamento se repete, quando recorrente. |
recurring_event_id |
ID da série recorrente à qual este agendamento pertence. |
recurring_interval |
Intervalo entre repetições, quando recorrente. |
recurring_sequence |
Posição deste agendamento dentro de sua série recorrente. |
end_after_x_occurrences |
Número de ocorrências após as quais a série recorrente termina. |
booking_provider |
Sistema de origem de onde veio a reserva, quando feita por meio de um provedor de reserva conectado. |
Sobre a sincronização de calendário: Logo após você reservar ou alterar um agendamento,
google_calendar_event_idpode ainda sernullecalendar_syncedpode serfalseporque a sincronização é executada em segundo plano um momento depois. Busque o agendamento novamente pouco tempo depois para ver os campos de calendário preenchidos.
Encontrar horários disponíveis
GET /appointments/available-slots
Retorna os horários que estão genuinamente livres em um tipo de evento entre dois momentos. Esta é normalmente a primeira chamada em um fluxo de agendamento: mostre esses horários, deixe a pessoa escolher um e, em seguida, envie o horário escolhido para Agendar um compromisso.
A resposta já leva em conta o horário de funcionamento e a duração do intervalo do próprio tipo de evento, suas salas, compromissos que você já agendou nele e tudo o que está bloqueado nos Google Calendars conectados — portanto, um horário que aparece aqui é um que você pode reservar.
| Parâmetro de consulta | Obrigatório | Descrição |
|---|---|---|
event_id |
Sim | O tipo de evento a ser verificado. Deve pertencer à sua conta. |
start_time |
Sim | Início da janela para a qual você deseja horários, data e hora em ISO 8601. |
end_time |
Sim | Fim da janela, data e hora em ISO 8601. O dia final completo está incluído. |
Os resultados são retornados agrupados por dia — e, quando o tipo de evento usa salas, um grupo por sala por dia:
| Campo | Descrição |
|---|---|
date |
O dia que o grupo cobre, escrito DD/MM/YYYY. |
day |
Nome do dia da semana em letras minúsculas, por exemplo monday. |
room_name |
A sala ou recurso ao qual este grupo pertence, quando o tipo de evento usa salas. |
available_slots |
Os blocos reserváveis naquele dia, do mais cedo para o mais tarde. |
Cada entrada em available_slots possui:
| Campo | Descrição |
|---|---|
start_time |
Início do bloco como HH:mm. |
end_time |
Fim do bloco como HH:mm. |
available |
true — apenas o tempo livre é retornado. |
spots_left |
Quantas reservas ainda cabem neste bloco. Presente apenas em tipos de evento que aceitam mais de uma reserva por intervalo. |
Os horários são locais ao tipo de evento, não UTC.
date,start_timeeend_timesão valores de relógio de parede no fuso horário do próprio tipo de evento (sua substituição, ou o fuso horário da sua conta quando não houver nenhum). Agendar um compromisso espera um instante UTC em ISO 8601, portanto, converta o horário que você escolheu antes de enviá-lo.
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"])
Resposta (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 }
]
}
]
}
Um dia sem nada livre simplesmente não aparece. A falta de event_id, start_time ou end_time retorna 400; um tipo de evento que não está na sua conta retorna 404.
Reservar um agendamento
POST /appointments
Reserva um novo agendamento para um contato em um dos seus tipos de evento. O horário de término é calculado automaticamente a partir da duração do intervalo do tipo de evento.
A reserva passa por uma verificação de conflito: se o intervalo solicitado sobrepuser um agendamento confirmado existente no mesmo tipo de evento, a solicitação falhará com um 409 e nada será criado.
| Campo | Obrigatório | Descrição |
|---|---|---|
contact_id |
Sim | ID do contato para o qual reservar. Deve pertencer à sua conta. |
event_id |
Sim | ID do tipo de evento no qual reservar. Deve pertencer à sua conta. |
start_time |
Sim | Início desejado como uma data-hora ISO 8601. |
room_name |
Não | Nome da sala ou recurso, quando o tipo de evento usa salas. |
cURL (usando o formato de consulta ?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"])
Resposta (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
}
}
Obter um agendamento
GET /appointments/{appointmentId}
Retorna um único agendamento pelo seu ID, incluindo seu estado de sincronização de calendário.
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"])
Resposta (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
}
}
Listar agendamentos
GET /appointments
Lista os agendamentos da sua conta, do mais recente para o mais antigo, com paginação baseada em cursor.
| Parâmetro de consulta | Obrigatório | Descrição |
|---|---|---|
contact_id |
Não | Retorna apenas agendamentos para este contato. Listagens filtradas por contato incluem apenas agendamentos confirmados. |
date |
Não | Retorna apenas agendamentos neste dia do calendário (YYYY-MM-DD). Requer contact_id. |
status |
Não | Filtra por Confirmed ou Canceled. Disponível apenas sem contact_id. |
limit |
Não | Tamanho da página, um número inteiro entre 1 e 100. O padrão é 50. |
cursor |
Não | O valor next_cursor de uma resposta anterior. |
Algumas regras para ter em mente:
- Sem filtros, você obtém todos os agendamentos da conta, página por página.
- Por contato — defina
contact_idpara ver os agendamentos confirmados de um contato. Você pode restringir isso a um único dia passando tambémdate. - Por status — defina
status(semcontact_id) para listar apenas agendamentosConfirmedou apenasCanceledem toda a conta. - O filtro
datesemcontact_id, oustatus=Canceledjunto comcontact_id, retorna um400.
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"])
Resposta (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
}
Para navegar pelos resultados, passe o next_cursor de uma resposta como o cursor da próxima solicitação. Continue até que next_cursor seja null. Consulte Erros e Paginação para o padrão de paginação compartilhado.
Atualizar um agendamento
PUT /appointments/{appointmentId}
Remarque um agendamento ou altere seus detalhes. Envie apenas os campos que deseja alterar — pelo menos um é obrigatório. O início e o fim combinados devem permanecer em ordem cronológica (end_time deve ser posterior a start_time). As alterações são sincronizadas automaticamente com o evento de calendário vinculado.
| Campo | Descrição |
|---|---|
start_time |
Nova data e hora de início, no formato ISO 8601. |
end_time |
Nova data e hora de término, no formato ISO 8601. Deve ser posterior ao horário de início. |
room_name |
Novo nome da sala ou recurso. |
description |
Nova descrição, ou null para limpá-la. |
summary |
Novo resumo, ou null para limpá-lo. |
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"])
Resposta (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
}
}
Cancelar um agendamento
POST /appointments/{appointmentId}/cancel
Cancela um agendamento confirmado, registrando opcionalmente um motivo. O agendamento permanece em sua conta com o status Canceled, e o evento de calendário vinculado é removido automaticamente em segundo plano. Cancelar um agendamento já cancelado retorna um 400.
| Campo | Obrigatório | Descrição |
|---|---|---|
cancellation_reason |
Não | Motivo do cancelamento, armazenado no agendamento. |
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"])
Resposta (200 OK):
{
"success": true,
"appointment_id": "aBcD1234eFgH5678"
}
Excluir um agendamento
DELETE /appointments/{appointmentId}
Exclui permanentemente um agendamento e suas referências. Se você deseja apenas cancelar a reserva mantendo o registro, use cancelar em vez disso.
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"])
Resposta (200 OK):
{
"success": true
}
Listar seus Google Calendars conectados
GET /appointments/google-calendars
Retorna os Google Calendars disponíveis nesta conta, diretamente do Google — útil para mostrar ao titular da conta um seletor de qual calendário importar abaixo, ou apenas para confirmar que a conexão está ativa.
Isso só funciona depois que a conta tiver conectado o Google Calendar (Configurações → Integrações) com pelo menos acesso de leitura. Se não tiver, ou se o acesso concedido não incluir mais o escopo de leitura de calendário, você receberá um 400 solicitando que você o conecte (ou reconecte).
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"])
Resposta (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"
}
]
}
Cada entrada segue o formato CalendarListEntry do próprio Google, portanto, os nomes dos campos seguem a camelCase do Google, não o snake_case usual desta API — esses são dados do Google passados como estão, não os nossos. Uma conexão ausente ou revogada retorna 400 com um erro explicando que o Google Calendar precisa ser conectado (ou reconectado).
Importar eventos de um Google Calendar
POST /appointments/import-calendar-events
Puxa os eventos que já estão no(s) Google Calendar(s) conectado(s) de uma campanha ou Agente de IA e os transforma em agendamentos — útil na primeira vez que você conecta um calendário que já possui reservas. Isso pode levar algum tempo (cada evento passa por uma extração para descobrir para quem é), por isso nunca é executado em linha: a solicitação enfileira um trabalho em segundo plano e retorna um job_id para consulta.
| Campo | Obrigatório | Descrição |
|---|---|---|
campaign_id |
Um destes dois | A campanha cujo(s) calendário(s) conectado(s) será(ão) usado(s) para importação. |
agent_id |
Um destes dois | O Agente de IA cujo(s) calendário(s) conectado(s) será(ão) usado(s) para importação. |
identifier |
Sim | "EMAIL" ou "PHONE_NUMBER" — qual informação de contato extrair de cada evento de calendário para corresponder ou criar o contato ao qual ele pertence. |
Envie exatamente um entre campaign_id / agent_id, nunca ambos e nunca nenhum — qualquer combinação retorna um 400. O que você enviar deve pertencer à sua conta, caso contrário, você receberá um 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"])
Resposta (202 Accepted):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "queued",
"campaign_id": null,
"agent_id": "agent_abc123"
}
campaign_id e agent_id retornam o que você enviou; o outro é sempre null.
Consultar o trabalho de importação
GET /appointments/import-calendar-events/{jobId}
curl "https://api.youraiconnector.com/v1/appointments/import-calendar-events/jK9mQ2xR7pL4wN1t" \
-H "X-API-Key: YOUR_API_KEY"
Resposta (200 OK):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "completed",
"message": "Imported 12 events as appointments.",
"error": null
}
status |
Significado |
|---|---|
queued |
Ainda não iniciado. Continue consultando. |
processing |
A importação está em execução. Continue consultando. |
completed |
Concluído — message contém um breve resumo legível. |
failed |
Algo deu errado — error contém o motivo. |
GET em um jobId que não existe (ou pertence a uma conta diferente) retorna 404.
Integrações de reserva de restaurantes (Zenchef / Formitable)
Zenchef e Formitable são sistemas de reserva de restaurantes pelos quais seu Agente de IA pode reservar mesas reais. Cada um possui um widget de reserva público e não autenticado (https://api.youraiconnector.com/v1/zenchef-widget/... e https://api.youraiconnector.com/v1/formitable-widget/...) que é renderizado dentro do chat para o cliente — essas rotas de widget são páginas HTML simples destinadas a serem abertas em um navegador, não endpoints de API JSON, portanto, não estão documentadas aqui. O que se segue são os endpoints de gerenciamento de conta: verificar se um ID de restaurante pertence ao titular da conta e, em seguida, adicioná-lo, atualizá-lo ou removê-lo.
Zenchef
Conectar um restaurante Zenchef é uma verificação de duas etapas, para que o titular da conta prove que realmente administra o restaurante antes que ele seja conectado ao bot: primeiro, verifique se o ID existe (sem revelar o nome), depois peça que eles mesmos digitem o nome do restaurante e verifique se corresponde.
Etapa 1 — Verificar se um ID de restaurante existe
POST /appointments/zenchef-restaurants/check
| Campo | Obrigatório | Descrição |
|---|---|---|
restaurant_id |
Sim | O ID do restaurante Zenchef a ser verificado. |
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" }'
Resposta (200 OK):
{
"success": true,
"data": { "exists": true, "requiresNameVerification": true }
}
exists: false significa que nenhum restaurante Zenchef possui esse ID — nada mais a fazer. Limitado a 10 verificações a cada 5 minutos por conta; exceder esse limite retorna 429.
Etapa 2 — Verificar o nome do restaurante
POST /appointments/zenchef-restaurants/verify-name
| Campo | Obrigatório | Descrição |
|---|---|---|
restaurant_id |
Sim | O ID do restaurante Zenchef da etapa 1. |
user_input_name |
Sim | O nome que o titular da conta digitou — comparado com o nome real do restaurante no Zenchef (insensível a maiúsculas/minúsculas e espaços em branco). |
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" }'
Resposta (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 significa que o nome não correspondeu — restaurantDetails é omitido, peça ao titular da conta que tente novamente. Limitado a 3 tentativas a cada 5 minutos (mais rigoroso que a verificação de existência, já que esta é a etapa de prova real). Um restaurant_id que não é mais resolvido no Zenchef retorna 404.
Etapa 3 — Salvar o restaurante
POST /appointments/zenchef-restaurants
| Campo | Obrigatório | Descrição |
|---|---|---|
restaurant_id |
Sim | 1–64 caracteres, letras/números/sublinhado/hífen. |
restaurant_name |
Sim | O nome do restaurante verificado da etapa 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" }'
Resposta (201 Created):
{ "success": true, "data": { "restaurantId": "12345" } }
Atualizar um restaurante Zenchef salvo
PUT /appointments/zenchef-restaurants/{restaurantId}
| Campo | Obrigatório | Descrição |
|---|---|---|
restaurant_name |
Não | Novo nome de exibição. |
is_active |
Não | Defina false para impedir que o bot faça reservas neste restaurante sem removê-lo. |
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 }'
Resposta (200 OK): mesmo formato da resposta de salvamento acima.
Remover um restaurante 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"
Resposta (200 OK): { "success": true, "data": { "restaurantId": "12345" } }
Um restaurantId que não está atualmente na conta retorna 404 ao atualizar ou excluir.
Formitable
O Formitable não precisa da prova de nome em duas etapas que o Zenchef exige — seus IDs de restaurante já são delimitados por empresa, portanto, uma chamada de verificação é suficiente. Ele também possui uma consulta de detalhes usada para armazenar em cache a URL do site do restaurante durante a configuração.
Verificar um ID de restaurante
POST /appointments/formitable-restaurants/verify
| Campo | Obrigatório | Descrição |
|---|---|---|
restaurant_id |
Sim | O ID do restaurante Formitable. |
language |
Não | Tag de idioma para a solicitação de teste. O padrão é "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" }'
Resposta (200 OK):
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"restaurantId": "the-blue-door",
"productCount": 4,
"sampleProductTitle": "Dinner for two",
"language": "en"
}
}
}
Um restaurant_id que o Formitable não reconhece retorna 404. Limitado a 10 tentativas a cada 5 minutos por conta.
Obter detalhes do restaurante
GET /appointments/formitable-restaurants/{restaurantId}/details?language=en
Busca o perfil público do restaurante no Formitable, incluindo seu site — usado para armazenar em cache a URL do site durante a configuração do restaurante. language é um parâmetro de consulta opcional, com padrão para "en".
curl "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door/details?language=en" \
-H "X-API-Key: YOUR_API_KEY"
Resposta (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"
}
}
Salvar o restaurante
POST /appointments/formitable-restaurants
| Campo | Obrigatório | Descrição |
|---|---|---|
restaurant_id |
Sim | 1–64 caracteres, letras/números/sublinhado/hífen. |
restaurant_name |
Sim | Nome de exibição. |
language |
Sim | Tag de idioma ISO, ex: "en" ou "en-GB". |
website_url |
Não | O site do restaurante, a partir da consulta de detalhes acima. Deve ser 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"
}'
Resposta (201 Created): { "success": true, "data": { "restaurantId": "the-blue-door" } }
Atualizar um restaurante Formitable salvo
PUT /appointments/formitable-restaurants/{restaurantId}
| Campo | Obrigatório | Descrição |
|---|---|---|
restaurant_name |
Não | Novo nome de exibição. |
language |
Não | Nova tag de idioma ISO. |
is_active |
Não | Defina false para impedir que o bot faça reservas neste restaurante sem removê-lo. |
website_url |
Não | Nova URL do site. |
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 }'
Resposta (200 OK): mesmo formato da resposta de salvamento acima.
Remover um restaurante 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"
Resposta (200 OK): { "success": true, "data": { "restaurantId": "the-blue-door" } }
Um restaurantId que não está atualmente na conta retorna 404 ao atualizar ou excluir.
Formato de erro em todos os endpoints Zenchef/Formitable: ao contrário do restante desta página, os erros aqui carregam seu status duas vezes — uma como o status HTTP e outra como
error_codeno corpo — por exemplo{ "success": false, "error": "Restaurant not found", "error_code": 404 }. Trate-o da mesma forma que qualquer outro erro: verifiquesuccess, leiaerrorpara a mensagem.
Erros da API de Agendamentos
Os endpoints de agendamento retornam o envelope de erro padrão:
{
"success": false,
"error": "Appointment not found"
}
| Status | Quando ocorre em um endpoint de agendamento |
|---|---|
400 |
Um campo obrigatório está faltando ou é inválido — por exemplo, um start_time incorreto, um end_time que não é posterior a start_time, uma combinação de filtros inválida, nenhum campo para atualizar ou um agendamento já cancelado. |
404 |
O agendamento, contato ou tipo de evento não foi encontrado. |
409 |
O intervalo de tempo solicitado já está ocupado (conflito de agendamento). |
Os códigos compartilhados que todo endpoint pode retornar — 401, 403 (seu plano não inclui acesso à API), 429 (limite de taxa) e 500 — estão listados com orientações de nova tentativa em Erros e Paginação.
Próximos passos
- Contatos — crie e consulte os contatos para os quais você faz reservas.
- Mensagens e Conversas — envie uma confirmação ou lembrete a um contato.
- Webhooks — receba notificações quando agendamentos forem alterados.