Visão Geral
A API Pública do AgendouIA permite que sistemas externos (ERPs, CRMs, chatbots) se integrem com sua conta para consultar e criar agendamentos, listar profissionais e serviços, gerenciar clientes e receber redirecionamento de atendimentos de chatbots.
Agendamentos
Crie e consulte agendamentos
Profissionais
Liste profissionais disponíveis
Disponibilidade
Verifique horários livres
Chatbots
Integre seus chatbots
Autenticação
Toda requisição deve incluir uma API Key válida no header. As API Keys podem ser criadas e gerenciadas na página de API Keys.
Header de Autenticação
X-API-Key: lk_sua_api_key_aqui
Exemplo de Requisição
curl -X GET "https://api.{{DOMAIN}}/api/public/v1/agendamentos" \
-H "X-API-Key: lk_sua_api_key" \
-H "Content-Type: application/json"
Permissões: Cada API Key está vinculada a um projeto específico e só tem acesso aos dados desse projeto. Apenas administradores podem criar/revogar keys.
Restrições: Por segurança, a API NÃO permite operações de pagamento, contratação/cancelamento de planos, exclusão de projetos ou desconexão de agendas/WhatsApp.
Ambientes
| Ambiente | Base URL |
|---|---|
| Produção | https://api.{{DOMAIN}}/api/public/v1 |
| Desenvolvimento | https://api-dev.{{DOMAIN}}/api/public/v1 |
Rate Limiting
Os limites de requisições variam conforme o plano contratado. Ao exceder o limite, a API retorna status 429.
| Plano | Req/minuto | Req/dia |
|---|---|---|
| Starter | 60 | 1.000 |
| Pro | 120 | 10.000 |
| Enterprise | 300 | 100.000 |
Headers de Rate Limit
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 45 X-RateLimit-Reset: 1704067200
Códigos de Erro
| Código | Descrição |
|---|---|
| 200 | Sucesso |
| 201 | Criado com sucesso |
| 400 | Requisição inválida |
| 401 | API Key inválida ou ausente |
| 403 | Sem permissão para esta operação |
| 404 | Recurso não encontrado |
| 409 | Conflito (ex: horário indisponível) |
| 422 | Erro de validação |
| 429 | Rate limit excedido |
| 500 | Erro interno do servidor |
Estrutura de Erro
{
"success": false,
"error": "codigo_do_erro",
"message": "Descricao legivel do erro",
"details": {
"campo": "Erro especifico do campo"
}
}
Agendamentos
Lista agendamentos do projeto com filtros opcionais.
Parâmetros Query
| Parâmetro | Tipo | Descrição |
|---|---|---|
| data_inicio | date | Data inicial (YYYY-MM-DD) |
| data_fim | date | Data final (YYYY-MM-DD) |
| profissional_id | uuid | Filtrar por profissional |
| status | string | Filtrar por status (agendado, confirmado, cancelado) |
| page | integer | Página (default: 1) |
| limit | integer | Itens por página (default: 50, max: 100) |
Exemplo de Requisição
curl -X GET "https://api.{{DOMAIN}}/api/public/v1/agendamentos?data_inicio=2025-01-01&data_fim=2025-01-31" \
-H "X-API-Key: lk_sua_api_key"
Resposta
{
"success": true,
"data": [
{
"id": "uuid",
"profissional_id": "uuid",
"profissional_nome": "Dr. Joao",
"servico_id": "uuid",
"servico_nome": "Consulta",
"cliente_nome": "Maria Silva",
"cliente_telefone": "11999999999",
"data_hora": "2025-01-15T14:00:00Z",
"status": "agendado",
"observacoes": "Primeira consulta",
"created_at": "2025-01-10T10:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 150,
"total_pages": 3
}
}
Cria um novo agendamento.
Body (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| profissional_id | uuid | Sim | ID do profissional |
| servico_id | uuid | Sim | ID do serviço |
| cliente_telefone | string | Sim | Telefone do cliente |
| data_hora | datetime | Sim | Data e hora (ISO 8601) |
| cliente_nome | string | Não | Nome do cliente |
| cliente_email | string | Não | Email do cliente |
| observacoes | string | Não | Observações adicionais |
Exemplo de Requisição
curl -X POST "https://api.{{DOMAIN}}/api/public/v1/agendamentos" \
-H "X-API-Key: lk_sua_api_key" \
-H "Content-Type: application/json" \
-d '{
"profissional_id": "uuid-do-profissional",
"servico_id": "uuid-do-servico",
"cliente_telefone": "11999999999",
"cliente_nome": "Maria Silva",
"data_hora": "2025-01-15T14:00:00Z"
}'
Resposta (201)
{
"success": true,
"data": {
"id": "uuid-do-agendamento",
"status": "agendado",
"data_hora": "2025-01-15T14:00:00Z",
"created_at": "2025-01-10T10:00:00Z"
}
}
Erros Possíveis
| 400 | Dados inválidos |
| 409 | Horário indisponível |
| 422 | Profissional ou serviço não encontrado |
Google Calendar: Se o profissional tiver uma agenda do Google conectada, o evento será criado automaticamente no calendário.
Busca um agendamento específico pelo ID.
Parâmetros Path
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | uuid | ID do agendamento |
Resposta
{
"success": true,
"data": {
"agendamento": {
"id": "uuid",
"profissional_id": "uuid",
"profissional_nome": "Dr. Joao",
"servico_id": "uuid",
"servico_nome": "Consulta",
"cliente_nome": "Maria Silva",
"cliente_telefone": "11999999999",
"data_hora": "2025-01-15T14:00:00Z",
"data_fim": "2025-01-15T14:30:00Z",
"status": "agendado",
"google_event_id": "abc123xyz",
"google_event_link": "https://calendar.google.com/..."
}
}
}
Atualiza um agendamento existente. Não permite trocar o profissional.
Parâmetros Path
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | uuid | ID do agendamento |
Body (JSON)
| Campo | Tipo | Descrição |
|---|---|---|
| servico_id | uuid | Novo serviço |
| cliente_nome | string | Nome do cliente |
| cliente_telefone | string | Telefone do cliente |
| cliente_email | string | Email do cliente |
| data_hora | datetime | Nova data/hora (ISO 8601) |
| status | string | Novo status: agendado, confirmado, concluido, cancelado, perdido |
Exemplo de Requisição
curl -X PUT "https://api.{{DOMAIN}}/api/public/v1/agendamentos/uuid-do-agendamento" \
-H "X-API-Key: lk_sua_api_key" \
-H "Content-Type: application/json" \
-d '{
"data_hora": "2025-01-16T15:00:00Z",
"status": "confirmado"
}'
Resposta
{
"success": true,
"message": "Agendamento atualizado com sucesso",
"data": {
"id": "uuid",
"data_hora": "2025-01-16T15:00:00Z",
"status": "confirmado"
}
}
Sincronização: Se houver um evento no Google Calendar vinculado, ele será atualizado automaticamente.
Cancela um agendamento. O registro não é excluído, apenas marcado como "cancelado" (soft delete).
Parâmetros Path
| Parâmetro | Tipo | Descrição |
|---|---|---|
| id | uuid | ID do agendamento |
Body (JSON - Opcional)
| Campo | Tipo | Descrição |
|---|---|---|
| motivo | string | Motivo do cancelamento |
Exemplo de Requisição
curl -X DELETE "https://api.{{DOMAIN}}/api/public/v1/agendamentos/uuid-do-agendamento" \
-H "X-API-Key: lk_sua_api_key" \
-H "Content-Type: application/json" \
-d '{ "motivo": "Cliente solicitou cancelamento" }'
Resposta
{
"success": true,
"message": "Agendamento cancelado com sucesso",
"data": {
"id": "uuid",
"status": "cancelado",
"cancelled_at": "2025-01-10T12:00:00Z"
}
}
Google Calendar: Se houver um evento vinculado no Google Calendar, ele será deletado automaticamente.
Profissionais
Lista todos os profissionais ativos do projeto.
Exemplo de Requisição
curl -X GET "https://api.{{DOMAIN}}/api/public/v1/profissionais" \
-H "X-API-Key: lk_sua_api_key"
Resposta
{
"success": true,
"data": {
"profissionais": [
{
"id": "uuid",
"nome": "Dr. Joao Silva",
"especialidade": "Clinico Geral",
"email": "joao@email.com",
"telefone": "11999999999",
"duracao_padrao": 30,
"ativo": true,
"google_calendar_conectado": true
}
]
}
}
O campo google_calendar_conectado indica se o profissional tem uma agenda Google vinculada. Se true, agendamentos criados para este profissional serão sincronizados automaticamente.
Serviços
Lista serviços disponíveis, opcionalmente filtrados por profissional.
Parâmetros Query
| Parâmetro | Tipo | Descrição |
|---|---|---|
| profissional_id | uuid | Filtrar serviços por profissional |
Resposta
{
"success": true,
"data": [
{
"id": "uuid",
"nome": "Consulta",
"duracao_minutos": 30,
"valor": 150.00
}
]
}
Disponibilidade
Consulta horários disponíveis para agendamento em uma data específica.
Parâmetros Query (Obrigatórios)
| Parâmetro | Tipo | Descrição |
|---|---|---|
| profissional_id Obrigatório | uuid | ID do profissional |
| servico_id Obrigatório | uuid | ID do serviço |
| data Obrigatório | date | Data para consulta (YYYY-MM-DD) |
Exemplo de Requisição
curl -X GET "https://api.{{DOMAIN}}/api/public/v1/horarios-disponiveis?profissional_id=uuid&servico_id=uuid&data=2025-01-15" \
-H "X-API-Key: lk_sua_api_key"
Resposta
{
"success": true,
"data": [
{ "data_hora": "2025-01-15T09:00:00Z", "disponivel": true },
{ "data_hora": "2025-01-15T09:30:00Z", "disponivel": true },
{ "data_hora": "2025-01-15T10:00:00Z", "disponivel": false },
{ "data_hora": "2025-01-15T10:30:00Z", "disponivel": true }
]
}
Clientes
Lista clientes do projeto com filtros opcionais.
Parâmetros Query
| Parâmetro | Tipo | Descrição |
|---|---|---|
| telefone | string | Buscar por telefone exato |
| nome | string | Buscar por nome (parcial) |
Cria ou atualiza um cliente (upsert por telefone).
Body (JSON)
{
"nome": "Maria Silva",
"telefone": "11999999999",
"email": "maria@email.com"
}
Webhook para Chatbots
Endpoint para receber mensagens de chatbots externos e processar ações automaticamente.
Body (JSON)
{
"telefone": "11999999999",
"mensagem": "Quero agendar uma consulta",
"contexto": {
"chatbot_id": "identificador",
"sessao_id": "uuid-sessao"
},
"acao": "agendar"
}
Ações Disponíveis
| Ação | Descrição |
|---|---|
| agendar | Iniciar fluxo de agendamento |
| consultar | Consultar agendamentos do cliente |
| cancelar | Cancelar um agendamento |
| transferir | Transferir atendimento para secretaria |
Resposta
{
"success": true,
"resposta": "Ola! Vi que voce quer agendar uma consulta. Temos horarios disponiveis...",
"acao_executada": "agendar",
"dados": {
"horarios_sugeridos": [...]
}
}
Exemplos de Integração
JavaScript / Node.js
const API_KEY = 'lk_sua_api_key';
const BASE_URL = 'https://api.{{DOMAIN}}/api/public/v1';
async function listarAgendamentos(dataInicio, dataFim) {
const response = await fetch(
`${BASE_URL}/agendamentos?data_inicio=${dataInicio}&data_fim=${dataFim}`,
{
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json'
}
}
);
return response.json();
}
async function criarAgendamento(dados) {
const response = await fetch(`${BASE_URL}/agendamentos`, {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(dados)
});
return response.json();
}
// Uso
const agendamentos = await listarAgendamentos('2025-01-01', '2025-01-31');
console.log(agendamentos);
Python
import requests
API_KEY = 'lk_sua_api_key'
BASE_URL = 'https://api.{{DOMAIN}}/api/public/v1'
headers = {
'X-API-Key': API_KEY,
'Content-Type': 'application/json'
}
# Listar agendamentos
response = requests.get(
f'{BASE_URL}/agendamentos',
headers=headers,
params={'data_inicio': '2025-01-01', 'data_fim': '2025-01-31'}
)
print(response.json())
# Criar agendamento
dados = {
'profissional_id': 'uuid',
'servico_id': 'uuid',
'cliente_telefone': '11999999999',
'cliente_nome': 'Maria Silva',
'data_hora': '2025-01-15T14:00:00Z'
}
response = requests.post(f'{BASE_URL}/agendamentos', headers=headers, json=dados)
print(response.json())
PHP
<?php
$apiKey = 'lk_sua_api_key';
$baseUrl = 'https://api.{{DOMAIN}}/api/public/v1';
// Listar agendamentos
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$baseUrl/agendamentos?data_inicio=2025-01-01&data_fim=2025-01-31");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: $apiKey",
"Content-Type: application/json"
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);
// Criar agendamento
$dados = [
'profissional_id' => 'uuid',
'servico_id' => 'uuid',
'cliente_telefone' => '11999999999',
'cliente_nome' => 'Maria Silva',
'data_hora' => '2025-01-15T14:00:00Z'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$baseUrl/agendamentos");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($dados));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: $apiKey",
"Content-Type: application/json"
]);
$response = curl_exec($ch);
curl_close($ch);
print_r(json_decode($response, true));
?>