Documentação da API v1

API REST multi-tenant para integrar o Acelerator Clinic com n8n, WhatsApp e automações.

Base URL

https://clinic.acelerator.net/api/v1

Formato

application/json (UTF-8)
Autenticação

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/json

Gerenciamento: 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.

Formato de Erros

Todos os erros seguem este formato padronizado:

{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Validation failed",
    "details": [ /* opcional: issues do Zod, etc. */ ]
  }
}
401 UNAUTHORIZED

Header Authorization ausente ou chave inválida/revogada

404 NOT_FOUND

Recurso não existe ou pertence a outra organização

409 CONFLICT

Conflito de horário (slot já ocupado)

422 VALIDATION_FAILED

Body inválido (ver details)

429 RATE_LIMITED

100 req/min por chave excedido

500 DB_ERROR

Falha interna

Profissionais
GET
/api/v1/professionals

Lista 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
    }
  ]
}
GET
/api/v1/professionals/:id/availability

Retorna 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" }
  ]
}
Pacientes
GET
/api/v1/patients

Lista 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"
    }
  ]
}
POST
/api/v1/patients

Cadastra 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
Agendamentos
GET
/api/v1/appointments

Lista 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"
    }
  ]
}
POST
/api/v1/appointments

Cria 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
PATCH
/api/v1/appointments/:id/status

Atualiza 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 atualizado
Webhooks

Cadastre 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).

Headers enviados

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.0

Verificação da assinatura (Node.js)

import 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));
}

Eventos disponíveis

appointment.created

Novo agendamento criado

appointment.updated

Agendamento atualizado

appointment.confirmed

Status alterado para confirmado

appointment.cancelled

Status alterado para cancelado

appointment.completed

Atendimento concluído

appointment.no_show

Paciente não compareceu

patient.created

Novo paciente cadastrado

patient.updated

Dados do paciente atualizados

Payload de exemplo

{
  "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"
  }
}
Limites, Auditoria e Suporte

Rate Limit

100 requisições por minuto por chave de API. Excedido retorna 429.

Datas e fuso

Sempre ISO 8601 com offset (ex: 2026-05-10T09:00:00-03:00).

Auditoria (LGPD)

Toda chamada é registrada: chave, IP, endpoint, status, duração. Acesso em Configurações → Auditoria.

Multi-tenant

Recursos de outras organizações retornam 404, nunca 403, para não vazar existência.

Suporte

suporte@acelerator.com.br