API REST multi-tenant para integrar o Acelerator Clinic com n8n, WhatsApp e automações.
Base URL
https://clinic.acelerator.net/api/v1Formato
application/json (UTF-8)Toda requisição deve incluir o header Authorization: Bearer ak_live_.... Cada chave é vinculada a uma organização; o isolamento multi-tenant é garantido pelo backend.
GET /api/v1/professionals
Authorization: Bearer ak_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/jsonGerenciamento: Configurações → Chaves de API.
Você pode criar múltiplas chaves, revogar (active=false) ou excluir. A chave em texto é exibida apenas uma vez no momento da criação.
Todos os erros seguem este formato padronizado:
{
"error": {
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"details": [ /* opcional: issues do Zod, etc. */ ]
}
}401 UNAUTHORIZEDHeader Authorization ausente ou chave inválida/revogada
404 NOT_FOUNDRecurso não existe ou pertence a outra organização
409 CONFLICTConflito de horário (slot já ocupado)
422 VALIDATION_FAILEDBody inválido (ver details)
429 RATE_LIMITED100 req/min por chave excedido
500 DB_ERRORFalha interna
/api/v1/professionalsLista profissionais ativos da organização dona da chave.
// Response 200
{
"data": [
{
"id": "uuid",
"name": "Dra. Maria Silva",
"specialty": "Cardiologia",
"crm": null,
"email": "maria@clinica.com",
"phone": "+5511988880001",
"working_hours": { "start": "08:00", "end": "18:00" },
"working_days": [1, 2, 3, 4, 5],
"consultation_duration": 30,
"accepts_online_booking": true,
"active": true
}
]
}/api/v1/professionals/:id/availabilityRetorna slots disponíveis (duração fixa = consultation_duration), respeitando horário de trabalho, dias úteis, almoço, datas bloqueadas e agendamentos existentes.
// Query: ?date=2026-05-10
// Response 200
{
"date": "2026-05-10",
"professional_id": "uuid",
"slot_duration": 30,
"slots": [
{ "start": "2026-05-10T08:00:00-03:00", "end": "2026-05-10T08:30:00-03:00" },
{ "start": "2026-05-10T08:30:00-03:00", "end": "2026-05-10T09:00:00-03:00" }
]
}/api/v1/patientsLista pacientes da org. Busca por nome, CPF ou telefone via ?q=.
// Query: ?q=carlos
// Response 200
{
"data": [
{
"id": "uuid",
"full_name": "Carlos Oliveira",
"phone": "+5511988880001",
"cpf": "12345678900",
"email": "carlos@email.com",
"birth_date": "1985-03-12",
"notes": null,
"created_at": "2026-04-20T14:30:00Z"
}
]
}/api/v1/patientsCadastra um paciente. Telefone deve estar em E.164 (+55…). CPF apenas dígitos.
// Request Body
{
"full_name": "Novo Paciente", // obrigatório
"phone": "+5511999990000", // E.164
"cpf": "00011122233", // 11 dígitos
"birth_date": "1990-01-15", // YYYY-MM-DD
"email": "paciente@email.com",
"notes": "Alergia a penicilina"
}
// Response 201 → mesmo formato do GET/api/v1/appointmentsLista agendamentos com filtros opcionais.
// Query Parameters (todos opcionais)
?from=2026-05-01T00:00:00Z // ISO 8601
&to=2026-05-31T23:59:59Z
&professional_id=uuid
&patient_id=uuid
&status=scheduled // scheduled|confirmed|canceled|completed|no_show
// Response 200
{
"data": [
{
"id": "uuid",
"patient_id": "uuid",
"professional_id": "uuid",
"starts_at": "2026-05-10T08:00:00-03:00",
"ends_at": "2026-05-10T08:30:00-03:00",
"status": "scheduled",
"notes": "Primeira consulta",
"created_at": "2026-04-29T12:00:00Z"
}
]
}/api/v1/appointmentsCria um agendamento. Usa verificação de sobreposição com lock — retorna409 SLOT_CONFLICT se o horário estiver ocupado.
// Request Body
{
"patient_id": "uuid", // obrigatório
"professional_id": "uuid", // obrigatório
"starts_at": "2026-05-10T09:00:00-03:00", // ISO 8601, obrigatório
"ends_at": "2026-05-10T09:30:00-03:00", // ISO 8601, obrigatório
"notes": "Retorno"
}
// Response 201 → mesmo formato do GET/api/v1/appointments/:id/statusAtualiza o status. Dispara webhook correspondente automaticamente.
// Request Body
{
"status": "confirmed"
// valores aceitos: scheduled | confirmed | cancelled (alias canceled) | completed | no_show
}
// Response 200 → objeto do agendamento atualizadoCadastre URLs em Configurações → Webhooks. Cada endpoint tem um secret usado para assinar o payload. Retentativas com backoff exponencial em caso de falha (até 5 tentativas).
X-Webhook-Event: appointment.created
X-Webhook-Timestamp: 1745935200
X-Webhook-Signature: sha256=<HMAC_SHA256(secret, timestamp + "." + body)>
Content-Type: application/json
User-Agent: AceleratorClinic-Webhook/1.0import crypto from 'crypto';
function verify(req, secret) {
const ts = req.headers['x-webhook-timestamp'];
const sig = req.headers['x-webhook-signature'];
const body = req.rawBody; // string crua, NÃO o JSON parseado
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(ts + '.' + body)
.digest('hex');
return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}appointment.createdNovo agendamento criado
appointment.updatedAgendamento atualizado
appointment.confirmedStatus alterado para confirmado
appointment.cancelledStatus alterado para cancelado
appointment.completedAtendimento concluído
appointment.no_showPaciente não compareceu
patient.createdNovo paciente cadastrado
patient.updatedDados do paciente atualizados
{
"event": "appointment.created",
"timestamp": "2026-04-29T14:30:00Z",
"organization_id": "uuid",
"data": {
"id": "uuid",
"patient_id": "uuid",
"professional_id": "uuid",
"starts_at": "2026-05-10T09:00:00-03:00",
"ends_at": "2026-05-10T09:30:00-03:00",
"status": "scheduled",
"notes": null,
"created_at": "2026-04-29T14:30:00Z"
}
}100 requisições por minuto por chave de API. Excedido retorna 429.
Sempre ISO 8601 com offset (ex: 2026-05-10T09:00:00-03:00).
Toda chamada é registrada: chave, IP, endpoint, status, duração. Acesso em Configurações → Auditoria.
Recursos de outras organizações retornam 404, nunca 403, para não vazar existência.
suporte@acelerator.com.br