Agenda
Agendas, horários livres, compromissos e bloqueios.
Leitura usa agenda:ler e escrita usa agenda:escrever. A API segue as mesmas regras do app e do agente de IA: horário de trabalho, bloqueios, intervalo e antecedência mínima. O módulo Agenda precisa estar no plano; se o plano perder o módulo, a chave deixa de funcionar na hora.
- Datas e horas sempre com o fuso, como
2026-10-12T14:00:00-03:00(ouZ). Sem o deslocamento a API recusa, nunca chuta o fuso. As respostas trazeminicioefimem UTC einicio_localefim_localno fuso da agenda. - Veja os horários livres em
GET /disponibilidade(janela de até 62 dias) e marque emPOST /compromissos. Duas chamadas ao mesmo tempo para o mesmo horário: uma marca e a outra recebe409 horario_ocupado, mesmo com muitas chamadas em paralelo. - Sem
agenda_id, o compromisso vai para a primeira agenda com o horário livre. O contato vem decontato_id,conversa_idoutelefone(só um deles). Pelo telefone, o contato é criado se ainda não existir. - Duração: mande
fimouduracao_min; sem nenhum, vale a duração padrão da agenda. - Remarcar, cancelar e confirmar têm rota própria. Compromisso cancelado não volta: marque um novo. Cancelar duas vezes é seguro.
PATCHmarca presença (estado:concluidooufaltou) e edita título, local, link e notas. - Eventos de webhook:
agendamento.criado,agendamento.remarcado(traz tambémanterior),agendamento.canceladoeagendamento.confirmado. Disparam para qualquer origem: app, agente de IA ou API. - Fora da API de propósito: apagar agenda, apagar compromisso (só cancelar), encaixe fora do horário, operações em massa e trocar o profissional de uma agenda. Apagar bloqueio existe, um por chamada.
- Não existe cadastro de serviços: cada agenda tem a sua duração padrão (
duracao_min).
Com contato que já existe e fim explícito
{
"agenda_id": "f7233bb7-10b6-49d2-aa3b-8c2e7d88064d",
"inicio": "2026-10-12T14:00:00-03:00",
"fim": "2026-10-12T14:45:00-03:00",
"contato_id": "08054a7f-a752-481e-9915-cf4cf944df39",
"titulo": "Avaliação",
"local": "Rua das Flores, 120 - sala 4"
}Endpoints#
- GETListar agendas
/agendas - POSTCriar agenda
/agendas - GETVer uma agenda
/agendas/{id} - PATCHAtualizar agenda
/agendas/{id} - GETHorários livres
/disponibilidade - GETListar compromissos
/compromissos - POSTMarcar compromisso
/compromissos - GETVer um compromisso
/compromissos/{id} - PATCHAtualizar compromisso
/compromissos/{id} - POSTRemarcar compromisso
/compromissos/{id}/remarcar - POSTCancelar compromisso
/compromissos/{id}/cancelar - POSTConfirmar compromisso
/compromissos/{id}/confirmar - GETListar bloqueios
/bloqueios - POSTCriar bloqueio
/bloqueios - GETVer um bloqueio
/bloqueios/{id} - PATCHAtualizar bloqueio
/bloqueios/{id} - DELApagar bloqueio
/bloqueios/{id}
Códigos de erro#
Além dos gerais (chave, limite, JSON), estes podem vir em erro.codigo nas rotas daqui. Todos estão em Erros.
| codigo | O que significa |
|---|---|
| horario_invalido | Data e hora inválidas. Use o formato 2026-10-12T14:00:00-03:00 (sempre com o fuso), com o fim depois do início. |
| janela_grande | A janela de consulta passa do máximo (62 dias). |
| duracao_invalida | Duração inválida: de 5 a 720 minutos (compromisso de até 12 horas). |
| campo_longo | Um dos textos passa do tamanho máximo. O campo vem em "detalhe". |
| campo_invalido | Campo obrigatório ou inválido. O campo vem em "detalhe". |
| link_invalido | O link precisa começar com https://. |
| contato_ambiguo | Informe só um entre contato_id, conversa_id e telefone. |
| conversa_de_outro_contato | A conversa informada é de outro contato. |
| evento_cancelado | O compromisso está cancelado e não pode ser alterado. Marque um novo. |
| evento_finalizado | O compromisso já foi encerrado (concluído ou faltou) e não pode ser alterado. |
| horario_ocupado | Esse horário já está ocupado nessa agenda. |
| horario_bloqueado | Esse horário está bloqueado (folga, almoço ou feriado). |
| fora_do_horario | Esse horário está fora do horário de trabalho da agenda. |
| antecedencia | Esse horário está mais perto do que a antecedência mínima da agenda. |
| compromisso_estado_invalido | estado só pode ser concluido ou faltou. Para confirmar ou cancelar, use as rotas próprias. |
| nada_para_atualizar | Mande ao menos um campo para atualizar. |
| fuso_invalido | Fuso inválido. Use um nome IANA, como America/Sao_Paulo. |
| cor_invalida | Cor inválida. Use slate, blue, violet, amber, emerald, green, rose, cyan ou orange. |
| lembretes_invalidos | Lembretes inválidos: até 5 itens, cada um só com antes_min (1 a 43200). |
| usuario_inexistente | usuario_id não é de uma pessoa desta equipe. |
| agenda_inexistente | Agenda não encontrada (ou inativa, para marcar compromisso). |
| evento_inexistente | Compromisso não encontrado. |
| bloqueio_inexistente | Bloqueio não encontrado. |
| agenda_repetida | Essa pessoa já tem uma agenda. |
| limite_agendas | Limite de 100 agendas por organização. |
| limite_bloqueios | Limite de 500 bloqueios por organização. |
| bloqueio_tipo_invalido | tipo deve ser folga, almoco, feriado ou outro. |
| repeticao_invalida | repetir deve ser nunca, diario, semanal ou anual; repetir_ate só vale com repetição. |