Recursos
Mapeamento por recurso: campos públicos → tabela/coluna canônica. Sempre que houver *, é uma allowlist; o que não está listado é rejeitado em entrada e não retornado em saída.
Convenções
- PII: dados pessoais (telefone, e-mail, anotação).
- Read: devolvido em
GET. - Write: aceito em
POST/PATCH.*em vermelho na interface significa "não envie". - Delete: o que realmente acontece ao chamar
DELETE.
Account
GET/PATCH /v1/account · scope account:read / account:write
| Campo público | Coluna | Read | Write | Notas |
|---|---|---|---|---|
id | clinicas.id | ✅ | — | UUID |
nome | clinicas.nome | ✅ | ✅ | |
email | clinicas.email | ✅ | ✅ | PII |
telefone | clinicas.telefone | ✅ | ✅ | PII |
endereco complemento cidade estado cep | homônimos | ✅ | ✅ | |
horario_funcionamento | homônimo | ✅ | ✅ | |
razao_social, cnpj | homônimos | ✅ | — | |
status, created_at, updated_at | homônimos | ✅ | — |
Nunca expostos: api_key, token, secret, webhook, prompt, stripe_customer_id, evolution, integracao_instance_id, whatsapp_api, instagram_api_token.
Subscription
GET /v1/subscription · scope subscription:read · somente leitura
Plano, status, trial_start, trial_end, current_period_start, current_period_end, canceled_at, ended_at. Nunca stripe_subscription_id ou stripe_customer_id.
Users
GET /v1/users, POST /v1/users/invitations, PATCH /v1/users/{id}, POST /v1/users/{id}/deactivate, POST /v1/users/{id}/reactivate · scopes users:read / users:write
Permite convidar somente profile_type = 'usuario'. Nunca promove para clinica/admin. Nunca troca clínica. Bloqueia desativar o último clinica ativo. Atualiza somente nome_completo.
Contacts
GET/POST /v1/contacts, GET/PATCH/DELETE /v1/contacts/{id}, POST /v1/contacts/{id}/move, POST /v1/contacts/{id}/follow-up/pause, POST /v1/contacts/{id}/follow-up/resume · scopes contacts:read / contacts:write / contacts:delete
Campos canônicos em português: nome, telefone, email, anotacoes, etapa_kanban_id, origem, servico_interesse. Aliases legados (name, phone, notes) não são expostos.
DELETE exige scope contacts:delete (alto risco, fora dos presets). Não cria cascata: se o contato tiver mensagens, agendamentos, follow-up, atribuições, prontuário ou logs, retorna 409 contact_has_history. Caso só tenha leads_tags, remove os vínculos e depois o contato.
Kanban
GET/POST /v1/kanban/stages, PATCH/DELETE /v1/kanban/stages/{id}, PUT /v1/kanban/stages/order · scopes kanban:read / kanban:write
ordem: inteiro de 0 a 10.000.PUT /order: recebe todos os IDs ativos da clínica exatamente uma vez.DELETEocupada: exigemove_contacts_to_stage_idda mesma clínica e diferente da removida. Move todos e exclui em uma transação.
Follow-ups
Campanhas, templates, execuções e métricas · scopes followups:read / followups:write / followups:execute
- Campanha criada via API nasce inativa (
ativo = false). activateepauseexigemfollowups:execute. Ativar exige pelo menos um template ativo.archivedesativa campanha e templates, preservafollow_up_execucoes.- Não há rota pública para criar/editar/apagar execução. Execuções são somente leitura.
- Criar/editar campanha não dispara a Edge Function processadora. O cron existente detecta campanhas ativas normalmente.
- Mídia (
imagem_*) é somente leitura. V1 não cria upload nem duplica arquivos no Storage.
Ads
GET /v1/ads/contacts, GET/POST/PATCH/DELETE /v1/ads/rules · scopes ads:read / ads:write
/ads/contacts consulta leads.anuncio diretamente. Sem tabela nova. Os campos Meta (ad_name, ad_platform, ad_id etc) aparecem como null até a atribuição completa estar comprovada em produção. Detalhes em compatibilidade de atribuição.
custom_ads allowlist: ad_name, ad_phrase, ad_source, active. Delete físico somente se nenhum lead da clínica referencia o ad_name; senão marca active = false.
Links
GET/POST/PATCH/DELETE /v1/links/custom, /v1/links/tracking, GET /v1/links/contacts, GET /v1/links/metrics · scopes links:read / links:write
tracking_links.slug:[a-z0-9-], 3–80, único na clínica/domínio.- Delete de tracking com cliques preserva histórico e só desliga
capture_enabled. - Métricas agregadas não expõem
client_ipouclient_user_agent.
Tags
GET/POST /v1/tags, PATCH/DELETE /v1/tags/{id}, PUT /v1/contacts/{id}/tags · scopes tags:read / tags:write
PUT /contacts/{id}/tagsaceita até 20 UUIDs, remove duplicatas, substitui o conjunto em transação.- Delete em uso exige
replacement_tag_idda mesma clínica e diferente. - Campos
whatsapp_label_idewhatsapp_ownernunca são expostos.
Services
GET/POST /v1/services, PATCH/DELETE /v1/services/{id} · scopes services:read / services:write
preco_fixoparaprice_type = 'fixo';preco_minimo/preco_maximopara'faixa'commin <= max.tempo_medio_minutos: 5–480 ou nulo.DELETEé lógico: defineativo = falsee nunca apaga agendamentos.
Appointments
GET/POST /v1/appointments, GET/PATCH/DELETE /v1/appointments/{id} · scopes appointments:read / appointments:write
cliente_idprecisa pertencer à clínica;usuario_idquando enviado precisa ser perfil ativo da clínica.data_fim > data_inicio.statusemagendado|confirmado|realizado|pago|cancelado|nao_compareceu.DELETEgravastatus = 'cancelado'e preserva a linha para auditoria/métricas.
Fora da V1
Prontuários e dados clínicos, conteúdo de conversas (chat), envio de WhatsApp/Instagram, segredos de integrações (Evolution, Meta, Stripe), prompts, webhooks, upload de arquivos, alteração de assinatura.