Arquitetura do Fluxo
- O AI Agent do Kommo não faz chamadas HTTP diretas a APIs externas
- O Worker recebe webhooks do Kommo, consulta a API externa e devolve a resposta
- O Worker também cria o booking no calendário nativo do Kommo via API
- Atua como camada de segurança, validação e transformação de dados
Requisitos de Infraestrutura da API
| Item | Descrição | Exemplo |
|---|---|---|
| URL base da API | Endereço raiz de todos os endpoints | https://api.sistema.com.br/v1 |
| Protocolo | Obrigatoriamente HTTPS | HTTPS |
| Formato de dados | JSON (request e response) | application/json |
| Encoding | UTF-8 | UTF-8 |
| Raté limit | Quantas requisições por segundo/minuto | 60 req/min |
| Ambiente de testes | URL de sandbox para desenvolvimento | https://sandbox.sistema.com.br/v1 |
A API precisa informar qual método de autenticação útiliza:
| Método | Como Funciona |
|---|---|
| API Key | Chave fixa enviada no header X-API-Key: xxx |
| OAuth 2.0 | Client ID + Client Secret para gerar access token |
| Bearer Token | Token fixo ou rotativo no header Authorization: Bearer xxx |
| Basic Auth | Usuario e senha codificados em base64 |
| Item | Necessidade |
|---|---|
| Documentação da API (Swagger/OpenAPI) | Ideal, mas não obrigatório |
| Colecao Postman ou Insomnia | Facilita os testes |
| Exemplos de request/response | OBRIGATÓRIO |
| Códigos de erro documentados | OBRIGATÓRIO |
| Contato técnico do fornecedor | OBRIGATÓRIO |
Endpoints Necessários
{
"data": [
{
"id": 101,
"name": "Dr. Augusto Pereira",
"crm": "CRM/GO 5892",
"specialty": "Oftalmologia Geral",
"specialties": ["Oftalmologia Geral", "Cirurgia Refrativa"],
"active": true,
"appointment_duration_minutes": 30
}
]
}
| Campo | Tipo | Descrição | |
|---|---|---|---|
id | integer | ID único do profissional | obrigatório |
name | string | Nome completo do médico | obrigatório |
specialty | string/array | Especialidade(s) do médico | obrigatório |
active | boolean | Se está aceitando agendamentos | obrigatório |
appointment_duration_minutes | integer | Duração padrão da consulta (min) | obrigatório |
crm | string | Registro no CRM | desejável |
insurance_accepted | array | Convênios que o médico aceita | desejável |
location_id | integer | Consultório/sala | desejável |
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
professional_id | integer | ID do médico | obrigatório |
date_start | YYYY-MM-DD | Data inicial da busca | obrigatório |
date_end | YYYY-MM-DD | Data final da busca | obrigatório |
appointment_type_id | integer | Tipo de consulta (filtra por duração) | opcional |
insurance_id | integer | Convênio (pode afetar horários) | opcional |
{
"professional_id": 101,
"professional_name": "Dr. Augusto Pereira",
"available_slots": [
{
"date": "2026-06-15",
"weekday": "segunda",
"slots": [
{ "start_time": "08:00", "end_time": "08:30", "available": true },
{ "start_time": "08:30", "end_time": "09:00", "available": true },
{ "start_time": "09:00", "end_time": "09:30", "available": false, "reason": "occupied" }
]
}
]
}
| Campo | Tipo | Descrição |
|---|---|---|
professional_id | integer | ID do médico consultado |
available_slots | array | Lista de dias com horários |
available_slots[].date | string | Data (YYYY-MM-DD) |
available_slots[].slots | array | Horários daquele dia |
slots[].start_time | string | Hora de início (HH:MM) |
slots[].end_time | string | Hora de fim (HH:MM) |
slots[].available | boolean | Se o horário está livre |
- Não retornar horários que já passaram
- Respeitar antecedência mínima de agendamento
- Considerar bloqueios manuais (férias, folgas, intervalos)
- Considerar duração do tipo de consulta ao calcular slots
- Considerar buffer entre consultas
{
"data": [
{
"id": 1,
"name": "Consulta Oftalmologia Geral",
"duration_minutes": 30,
"category": "consulta",
"requires_referral": false,
"allowed_insurance": ["IPASGO", "Unimed"]
}
]
}
| Campo | Tipo | Descrição | |
|---|---|---|---|
id | integer | ID único do tipo | obrigatório |
name | string | Nome do tipo de consulta | obrigatório |
duration_minutes | integer | Duração em minutos | obrigatório |
category | string | Categoria (consulta, exame, retorno) | desejável |
allowed_insurance | array | Convênios aceitos | desejável |
price | number | Valor particular | desejável |
{
"data": [
{ "id": 1, "name": "IPASGO", "active": true },
{ "id": 2, "name": "Unimed", "active": true },
{ "id": 3, "name": "Bradesco Saúde", "active": true },
{ "id": 99, "name": "Particular", "active": true }
]
}
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
phone | string | Telefone do paciente | obrigatório* |
cpf | string | CPF do paciente | obrigatório* |
name | string | Nome para busca aproximada | opcional |
*Pelo menos um dos campos obrigatórios deve ser informado.
{
"found": true,
"patient": {
"id": 5001,
"name": "Joao Silva",
"cpf": "123.456.789-00",
"phone": "62991510480",
"email": "joao@email.com",
"birth_date": "1985-03-15",
"insurance_id": 1,
"insurance_name": "IPASGO"
}
}
{
"name": "Joao Silva",
"phone": "62991510480",
"email": "joao@email.com",
"cpf": "123.456.789-00",
"birth_date": "1985-03-15",
"insurance_id": 1
}
| Campo | Tipo | Descrição | |
|---|---|---|---|
name | string | Nome completo | obrigatório |
phone | string | Telefone com DDD | obrigatório |
cpf | string | CPF do paciente | desejável |
email | string | desejável | |
birth_date | YYYY-MM-DD | Data de nascimento | desejável |
insurance_id | integer | ID do convênio | desejável |
{
"patient_id": 5001,
"professional_id": 101,
"appointment_type_id": 1,
"date": "2026-06-15",
"start_time": "08:00",
"insurance_id": 1,
"notes": "Agendado via chatbot Kommo - WhatsApp",
"source": "kommo_chatbot"
}
| Campo | Tipo | Descrição | |
|---|---|---|---|
patient_id | integer | ID do paciente no sistema | obrigatório |
professional_id | integer | ID do médico | obrigatório |
date | YYYY-MM-DD | Data da consulta | obrigatório |
start_time | HH:MM | Horário de início | obrigatório |
appointment_type_id | integer | Tipo de consulta | desejável |
insurance_id | integer | Convênio | desejável |
notes | string | Observações | desejável |
source | string | Origem do agendamento | desejável |
{
"success": true,
"appointment": {
"id": 80001,
"patient_id": 5001,
"professional_id": 101,
"professional_name": "Dr. Augusto Pereira",
"date": "2026-06-15",
"start_time": "08:00",
"end_time": "08:30",
"status": "scheduled"
}
}
{
"success": false,
"error": "slot_unavailable",
"message": "O horário selecionado não está mais disponível",
"next_available": [
{ "date": "2026-06-15", "start_time": "09:00" },
{ "date": "2026-06-15", "start_time": "09:30" }
]
}
{
"new_date": "2026-06-18",
"new_start_time": "10:00",
"reason": "Paciente solicitou reagendamento via chatbot"
}
{
"success": true,
"appointment": {
"id": 80001,
"old_date": "2026-06-15",
"old_start_time": "08:00",
"new_date": "2026-06-18",
"new_start_time": "10:00",
"status": "rescheduled"
}
}
{
"reason": "Paciente solicitou cancelamento via chatbot",
"cancelled_by": "patient"
}
{
"success": true,
"appointment_id": 80001,
"status": "cancelled",
"message": "Consulta cancelada com sucesso"
}
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
patient_id | integer | ID do paciente | obrigatório* |
patient_phone | string | Telefone (alternativa ao ID) | obrigatório* |
status | string | Filtrar: scheduled, cancelled, completed | opcional |
date_from | YYYY-MM-DD | Data inicial (padrão: hoje) | opcional |
{
"data": [
{
"id": 80001,
"date": "2026-06-15",
"start_time": "08:00",
"end_time": "08:30",
"professional_name": "Dr. Augusto Pereira",
"specialty": "Oftalmologia Geral",
"appointment_type": "Consulta Oftalmologia Geral",
"insurance": "IPASGO",
"status": "scheduled"
}
]
}
Tabelas de Mapeamento
| Medico | ID Sistema Externo | Especialidade | ID Usuario Kommo |
|---|---|---|---|
| Dr. Augusto Pereira | ? | Oftalmologia Geral | ? |
| (preencher) | ? | Oftalmopediatria | ? |
| (preencher) | ? | Retina e Vitreo | ? |
| (preencher) | ? | Glaucoma | ? |
| (preencher) | ? | Cornea | ? |
| (preencher) | ? | Oculoplastica | ? |
| (preencher) | ? | Cirurgia Refrativa | ? |
| (preencher) | ? | Lentes de Contato | ? |
| (preencher) | ? | Cardiologia | ? |
| (preencher) | ? | Odontologia | ? |
| Convênio (Kommo) | ID no Sistema Externo |
|---|---|
| AFFEGO | ? |
| Base Aérea | ? |
| Bonfinopolis | ? |
| Bradesco Saúde | ? |
| Caixa Saúde | ? |
| Campo Limpo | ? |
| CASSI | ? |
| CELGMED | ? |
| GEAP | ? |
| IPASGO | ? |
| Postal Saúde | ? |
| Unimed | ? |
| Urban | ? |
| COOTRAME | ? |
| FMS Anapolis | ? |
| Particular | ? |
| Especialidade (Kommo) | Tipo de Consulta (Sistema Externo) | ID Externo |
|---|---|---|
| Oftalmologia Geral | ? | ? |
| Oftalmopediatria | ? | ? |
| Retina e Vitreo | ? | ? |
| Glaucoma | ? | ? |
| Cornea | ? | ? |
| Oculoplastica | ? | ? |
| Cirurgia Refrativa | ? | ? |
| Lentes de Contato | ? | ? |
| Fisioterapia Ocular | ? | ? |
| Cardiologia | ? | ? |
| Odontologia | ? | ? |
Fluxos Detalhados da Integração
GET /availability na API externaGET /patients/search pelo telefone do WhatsAppPOST /patients para cadastrarPOST /appointments na API externaGET /appointments?patient_phone=...&status=scheduledGET /availabilityPATCH /appointments/{id}/rescheduleGET /appointmentsPATCH /appointments/{id}/cancelRequisitos Técnicos - Webhooks
O Worker usa a API do Kommo para refletir os agendamentos no calendário nativo:
POST https://{subdomain}.kommo.com/api/v4/tasks // Criar agendamento PATCH https://{subdomain}.kommo.com/api/v4/tasks/{id} // Reagendar PATCH https://{subdomain}.kommo.com/api/v4/leads/{id} // Mover lead no pipeline POST https://{subdomain}.kommo.com/api/v4/notes // Adicionar nota com detalhes
Tratamento de Erros
| Código | Situação | Acao do Sistema |
|---|---|---|
| 200 | Sucesso | Dados retornados / acao realizada |
| 201 | Criado | Agendamento ou paciente criado |
| 400 | Dados inválidos | Campos obrigatórios faltando ou formato incorreto |
| 401 | Não autenticado | Credenciais inválidas ou token expirado |
| 403 | Sem permissão | Sem acesso a este recurso |
| 404 | Não encontrado | Paciente/agendamento/médico não encontrado |
| 409 | Conflito | Horário já ocupado (retornar próximos disponíveis) |
| 422 | Regra de negocio | Ex: antecedência mínima não respeitada |
| 429 | Raté limit | Muitas requisições, aguardar |
| 500 | Erro interno | Erro no servidor do sistema |
{
"success": false,
"error": "slot_unavailable",
"message": "Descrição legivel do erro",
"details": { "campo": "informação adicional" }
}
Checklist para o Fornecedor
- URL base da API (produção)
- URL base da API (sandbox/testes)
- Credenciais de autenticação (tipo + chaves)
- Documentação da API (se existir)
- Contato técnico para suporte durante integração
- EP-01: Listar médicos/profissionais com especialidades
- EP-02: Consultar disponibilidade/horários livres por médico e data
- EP-03: Listar tipos de consulta/agendamento
- EP-04: Listar convênios cadastrados
- EP-05a: Buscar paciente por telefone ou CPF
- EP-05b: Cadastrar novo paciente
- EP-06: Criar agendamento
- EP-07: Reagendar consulta existente
- EP-08: Cancelar consulta
- EP-09: Listar agendamentos futuros de um paciente
- Lista completa de médicos com IDs
- Lista completa de especialidades com IDs
- Lista completa de convênios com IDs
- Lista completa de tipos de consulta com IDs e duracoes
- Regras de negocio (antecedência mínima, horários por médico, etc.)
- API aceita requisições em JSON via HTTPS
- API retorna respostas em JSON com códigos HTTP padrão
- API trata conflitos de horário (retorno 409 com alternativas)
- API suporta busca de paciente por telefone
- Raté limit documentado
Alternativas (caso não tenha API)
Curto prazo: Alternativa 1 (Kommo nativo) + entrada manual no sistema externo
Medio prazo: Alternativa 2 ou 3 (Google Calendar ou Cal.com)
Longo prazo: Alternativa 5 (migrar para sistema com API)
Resumo Executivo
O que precisamos do fornecedor do software
Precisamos que o software de agendamento da clínica disponibilize uma API (interface de programação) que permita, de forma automatizada:
- Consultar quais horários estao livres na agenda de cada médico
- Agendar uma consulta informando paciente, médico, data e horário
- Reagendar uma consulta existente para novo horário
- Cancelar uma consulta existente
- Buscar se um paciente já está cadastrado (pelo telefone)
- Cadastrar um novo paciente (nome e telefone no minimo)
Isso permitira que nosso chatbot no WhatsApp (via Kommo CRM) consulte a agenda real dos médicos em tempo real e agende consultas automáticamente, sem intervenção humana, 24 horas por dia.
Caso a API não estejá disponível, solicitamos informações sobre previsão de implementação ou alternativas de integração que o sistema suporte.