Desenvolvedores
Referência da API v1
Todas as rotas da API v1 do CliLink com permissões, parâmetros, corpo e exemplos em curl e JavaScript. Gerada da OpenAPI 3.1.
Como ler
Base: https://app.clilink.bio/api/v1. Toda rota pede o token (autenticação) e responde { ok: true, data } ou { ok: false, erro }. A mesma referência, para máquinas, em openapi.json.
Conta
GET/api/v1/eu
Conta do token
Perfil básico da conta e a página. Vale para qualquer token, inclusive os criados antes dos escopos.
Permissão: qualquer token.
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
nome | string ou null | |
plano | free, pro | |
pagina | object ou null |
curl "https://app.clilink.bio/api/v1/eu" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/eu", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();GET/api/v1/eu/modulos
Módulos ligados na conta
Permissão: qualquer token.
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
modulos | lista de string | |
disponiveis | lista de string |
curl "https://app.clilink.bio/api/v1/eu/modulos" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/eu/modulos", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();Agenda
GET/api/v1/agenda/consultas
Listar consultas
Consultas de um período (padrão: hoje e os próximos 6 dias), em ordem de início. Paginado por cursor.
Permissão: agenda:read (ver a agenda). Paginada por cursor.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
de (opcional) | query | string | Primeiro dia (AAAA-MM-DD, no fuso da agenda). Padrão: hoje. |
ate (opcional) | query | string | Último dia, incluído. Padrão: 7 dias depois de `de`. Até 93 dias. |
status (opcional) | query | pendente, confirmado, cancelado, remarcado, chegou, faltou, atendido | |
paciente_id (opcional) | query | uuid | |
cursor (opcional) | query | string | |
limite (opcional) | query | integer |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
inicio | string | Início em ISO 8601 (UTC). |
fim | string | |
dia | string | Dia no fuso da agenda (AAAA-MM-DD). |
hora | string | Hora no fuso da agenda (HH:MM). |
fuso | string | |
status | pendente, confirmado, cancelado, remarcado, chegou, faltou, atendido | |
online | boolean | |
origem | string ou null | |
tipo | object ou null | |
local | object ou null | |
paciente | object ou null | |
valor_centavos | integer ou null | |
presenca_confirmada_em | string ou null | |
criado_em | string |
curl "https://app.clilink.bio/api/v1/agenda/consultas?de=2026-10-27&ate=2026-10-31" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/agenda/consultas?de=2026-10-27&ate=2026-10-31", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();GET/api/v1/agenda/consultas/{id}
Ver uma consulta
Permissão: agenda:read (ver a agenda).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
inicio | string | Início em ISO 8601 (UTC). |
fim | string | |
dia | string | Dia no fuso da agenda (AAAA-MM-DD). |
hora | string | Hora no fuso da agenda (HH:MM). |
fuso | string | |
status | pendente, confirmado, cancelado, remarcado, chegou, faltou, atendido | |
online | boolean | |
origem | string ou null | |
tipo | object ou null | |
local | object ou null | |
paciente | object ou null | |
valor_centavos | integer ou null | |
presenca_confirmada_em | string ou null | |
criado_em | string |
curl "https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();POST/api/v1/agenda/consultas
Marcar consulta
Marca como a equipe marca no painel (já confirmada). Por padrão só aceita um horário livre da agenda (veja horários livres); `fora_da_agenda: true` marca mesmo assim. Horário ocupado é sempre recusado. Cadastrar o paciente junto (`novo_paciente`) pede também o escopo pacientes:write.
Permissão: agenda:write (mudar a agenda). Responde 201. Aceita Idempotency-Key.
| Campo do corpo | Tipo | Descrição |
|---|---|---|
paciente_id (opcional) | uuid | Paciente já cadastrado. Ou mande `novo_paciente`. |
novo_paciente (opcional) | NovoPaciente | Cadastra o paciente junto (pede também o escopo pacientes:write). |
tipo_id | uuid | |
local_id (opcional) | uuid ou null | |
online (opcional) | boolean | Padrão: true só quando o tipo é só online. |
dia | string | Dia no fuso da agenda. |
hora | string | Hora no fuso da agenda (HH:MM). |
avisar_paciente (opcional) | boolean | Manda a confirmação ao paciente (e-mail e WhatsApp do consultório, se ligado). |
fora_da_agenda (opcional) | boolean | true marca mesmo fora dos horários livres (como a equipe faz no painel). Horário já ocupado continua recusado. |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
inicio | string | Início em ISO 8601 (UTC). |
fim | string | |
dia | string | Dia no fuso da agenda (AAAA-MM-DD). |
hora | string | Hora no fuso da agenda (HH:MM). |
fuso | string | |
status | pendente, confirmado, cancelado, remarcado, chegou, faltou, atendido | |
online | boolean | |
origem | string ou null | |
tipo | object ou null | |
local | object ou null | |
paciente | object ou null | |
valor_centavos | integer ou null | |
presenca_confirmada_em | string ou null | |
criado_em | string |
curl -X POST "https://app.clilink.bio/api/v1/agenda/consultas" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"paciente_id":"5e8a2b44-7c1d-4f3e-8b9a-2c3d4e5f6a7b","tipo_id":"3c5d1f20-8a7b-4c1e-9f00-1a2b3c4d5e6f","dia":"2026-10-28","hora":"10:00"}'const r = await fetch("https://app.clilink.bio/api/v1/agenda/consultas", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"paciente_id":"5e8a2b44-7c1d-4f3e-8b9a-2c3d4e5f6a7b","tipo_id":"3c5d1f20-8a7b-4c1e-9f00-1a2b3c4d5e6f","dia":"2026-10-28","hora":"10:00"}),
});
const { ok, data, erro } = await r.json();POST/api/v1/agenda/consultas/{id}/confirmar
Confirmar consulta
Aprova um pedido que aguardava a aprovação do consultório.
Permissão: agenda:write (mudar a agenda). Aceita Idempotency-Key.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
| Campo do corpo | Tipo | Descrição |
|---|---|---|
avisar_paciente (opcional) | boolean |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
inicio | string | Início em ISO 8601 (UTC). |
fim | string | |
dia | string | Dia no fuso da agenda (AAAA-MM-DD). |
hora | string | Hora no fuso da agenda (HH:MM). |
fuso | string | |
status | pendente, confirmado, cancelado, remarcado, chegou, faltou, atendido | |
online | boolean | |
origem | string ou null | |
tipo | object ou null | |
local | object ou null | |
paciente | object ou null | |
valor_centavos | integer ou null | |
presenca_confirmada_em | string ou null | |
criado_em | string |
curl -X POST "https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/confirmar" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"avisar_paciente":true}'const r = await fetch("https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/confirmar", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"avisar_paciente":true}),
});
const { ok, data, erro } = await r.json();POST/api/v1/agenda/consultas/{id}/remarcar
Remarcar consulta
Muda o horário pelas regras da agenda (regras, folgas, feriados, outras consultas e Google). Horário com aviso responde 409 `confirmar_avisos` com a lista; mande de novo com `confirmar_avisos: true`.
Permissão: agenda:write (mudar a agenda). Aceita Idempotency-Key.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
| Campo do corpo | Tipo | Descrição |
|---|---|---|
avisar_paciente (opcional) | boolean | |
dia | string | |
hora | string | |
confirmar_avisos (opcional) | boolean | O novo horário tem avisos (fora do horário, folga): mande true depois de conferir. |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
inicio | string | Início em ISO 8601 (UTC). |
fim | string | |
dia | string | Dia no fuso da agenda (AAAA-MM-DD). |
hora | string | Hora no fuso da agenda (HH:MM). |
fuso | string | |
status | pendente, confirmado, cancelado, remarcado, chegou, faltou, atendido | |
online | boolean | |
origem | string ou null | |
tipo | object ou null | |
local | object ou null | |
paciente | object ou null | |
valor_centavos | integer ou null | |
presenca_confirmada_em | string ou null | |
criado_em | string |
curl -X POST "https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/remarcar" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"dia":"2026-10-29","hora":"14:30"}'const r = await fetch("https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/remarcar", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"dia":"2026-10-29","hora":"14:30"}),
});
const { ok, data, erro } = await r.json();POST/api/v1/agenda/consultas/{id}/cancelar
Cancelar consulta
Cancela pelo consultório: o sinal pago volta inteiro e o horário vai para a lista de espera, como no painel.
Permissão: agenda:write (mudar a agenda). Aceita Idempotency-Key.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
| Campo do corpo | Tipo | Descrição |
|---|---|---|
avisar_paciente (opcional) | boolean | |
motivo (opcional) | string | Fica só no painel (não vai para webhooks nem para a API). |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
inicio | string | Início em ISO 8601 (UTC). |
fim | string | |
dia | string | Dia no fuso da agenda (AAAA-MM-DD). |
hora | string | Hora no fuso da agenda (HH:MM). |
fuso | string | |
status | pendente, confirmado, cancelado, remarcado, chegou, faltou, atendido | |
online | boolean | |
origem | string ou null | |
tipo | object ou null | |
local | object ou null | |
paciente | object ou null | |
valor_centavos | integer ou null | |
presenca_confirmada_em | string ou null | |
criado_em | string |
curl -X POST "https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/cancelar" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"avisar_paciente":true}'const r = await fetch("https://app.clilink.bio/api/v1/agenda/consultas/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/cancelar", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"avisar_paciente":true}),
});
const { ok, data, erro } = await r.json();GET/api/v1/agenda/horarios-livres
Horários livres
Os mesmos horários que o paciente vê na página (regras, antecedência, folgas, feriados, consultas e Google).
Permissão: agenda:read (ver a agenda).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
tipo_id | query | uuid | Tipo de consulta (GET /agenda/tipos). |
local_id (opcional) | query | uuid | Local (GET /agenda/locais). Sem ele: o único local do tipo, ou sem local. |
de (opcional) | query | string | Padrão: hoje. |
ate (opcional) | query | string | Padrão: 14 dias depois de `de`. Até 31 dias. |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
fuso | string | |
tipo_id | uuid | |
local_id | uuid ou null | |
dias | lista de object |
curl "https://app.clilink.bio/api/v1/agenda/horarios-livres?tipo_id=3c5d1f20-8a7b-4c1e-9f00-1a2b3c4d5e6f&de=2026-10-27" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/agenda/horarios-livres?tipo_id=3c5d1f20-8a7b-4c1e-9f00-1a2b3c4d5e6f&de=2026-10-27", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();GET/api/v1/agenda/tipos
Tipos de consulta
Permissão: agenda:read (ver a agenda).
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
nome | string | |
duracao_min | integer | |
modalidade | presencial, online, ambos | |
valor_centavos | integer ou null | |
local_id | uuid ou null | |
ativo | boolean |
curl "https://app.clilink.bio/api/v1/agenda/tipos" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/agenda/tipos", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();GET/api/v1/agenda/locais
Locais de atendimento
Permissão: agenda:read (ver a agenda).
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
nome | string | |
online | boolean | |
principal | boolean | |
cidade | string ou null | |
uf | string ou null |
curl "https://app.clilink.bio/api/v1/agenda/locais" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/agenda/locais", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();Pacientes
GET/api/v1/pacientes
Listar ou buscar pacientes
Só o cadastro (nunca prontuário, anotações, CPF ou observação). Mais novos primeiro. Paginado por cursor.
Permissão: pacientes:read (ver pacientes). Paginada por cursor.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
busca (opcional) | query | string | Parte do nome ou do WhatsApp (4 números ou mais). |
cursor (opcional) | query | string | |
limite (opcional) | query | integer |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
nome | string | |
whatsapp | string | E.164, ex.: +5511987654321. |
email | string ou null | |
nascimento | string ou null | AAAA-MM-DD. |
origem | string ou null | |
aceita_comunicacao | boolean | Aceitou receber mensagens de relacionamento (LGPD). |
criado_em | string |
curl "https://app.clilink.bio/api/v1/pacientes?busca=Maria" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/pacientes?busca=Maria", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();GET/api/v1/pacientes/{id}
Ver um paciente
Permissão: pacientes:read (ver pacientes).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
nome | string | |
whatsapp | string | E.164, ex.: +5511987654321. |
email | string ou null | |
nascimento | string ou null | AAAA-MM-DD. |
origem | string ou null | |
aceita_comunicacao | boolean | Aceitou receber mensagens de relacionamento (LGPD). |
criado_em | string | |
proxima_consulta | string ou null | Início (ISO) da próxima consulta ativa. |
ultima_consulta | string ou null | |
total_consultas | integer |
curl "https://app.clilink.bio/api/v1/pacientes/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/pacientes/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();POST/api/v1/pacientes
Cadastrar paciente
Mesmas regras do painel: WhatsApp com DDD (vira E.164), e-mail opcional, um paciente por WhatsApp. Entra sem aceite de comunicação.
Permissão: pacientes:write (cadastrar pacientes). Responde 201. Aceita Idempotency-Key.
| Campo do corpo | Tipo | Descrição |
|---|---|---|
nome | string | |
whatsapp | string | Com DDD. Ex.: (11) 98765-4321 ou +5511987654321. |
email (opcional) | string ou null | |
nascimento (opcional) | string ou null |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
nome | string | |
whatsapp | string | E.164, ex.: +5511987654321. |
email | string ou null | |
nascimento | string ou null | AAAA-MM-DD. |
origem | string ou null | |
aceita_comunicacao | boolean | Aceitou receber mensagens de relacionamento (LGPD). |
criado_em | string |
curl -X POST "https://app.clilink.bio/api/v1/pacientes" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"nome":"Maria Exemplo","whatsapp":"(11) 98765-4321","email":"maria@exemplo.com"}'const r = await fetch("https://app.clilink.bio/api/v1/pacientes", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"nome":"Maria Exemplo","whatsapp":"(11) 98765-4321","email":"maria@exemplo.com"}),
});
const { ok, data, erro } = await r.json();PATCH/api/v1/pacientes/{id}
Atualizar paciente
Permissão: pacientes:write (cadastrar pacientes).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
| Campo do corpo | Tipo | Descrição |
|---|---|---|
nome (opcional) | string | |
whatsapp (opcional) | string | Com DDD. Ex.: (11) 98765-4321 ou +5511987654321. |
email (opcional) | string ou null | |
nascimento (opcional) | string ou null |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
nome | string | |
whatsapp | string | E.164, ex.: +5511987654321. |
email | string ou null | |
nascimento | string ou null | AAAA-MM-DD. |
origem | string ou null | |
aceita_comunicacao | boolean | Aceitou receber mensagens de relacionamento (LGPD). |
criado_em | string |
curl -X PATCH "https://app.clilink.bio/api/v1/pacientes/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Content-Type: application/json"
-d '{"email":"maria.nova@exemplo.com"}'const r = await fetch("https://app.clilink.bio/api/v1/pacientes/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10", {
method: "PATCH",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({"email":"maria.nova@exemplo.com"}),
});
const { ok, data, erro } = await r.json();Contatos
GET/api/v1/contatos
Pedidos de contato
Quem pediu contato pela página (WhatsApp ou formulário). A mensagem livre não sai pela API.
Permissão: contatos:read (ver pedidos de contato). Paginada por cursor.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
desde (opcional) | query | string | Só os pedidos a partir deste instante (ISO 8601). |
cursor (opcional) | query | string | |
limite (opcional) | query | integer |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
origem | whatsapp, formulario | |
nome | string ou null | |
whatsapp | string ou null | |
email | string ou null | |
respondido_em | string ou null | |
criado_em | string |
curl "https://app.clilink.bio/api/v1/contatos" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/contatos", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();Pagamentos
GET/api/v1/pagamentos/sinais
Sinais das consultas
Permissão: pagamentos:read (ver pagamentos). Paginada por cursor.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
status (opcional) | query | pendente, pago, expirado, devolvido, cancelado | |
consulta_id (opcional) | query | uuid | |
cursor (opcional) | query | string | |
limite (opcional) | query | integer |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
consulta_id | uuid | |
metodo | pix_manual, asaas, mercadopago | |
forma | pix, cartao | |
valor_centavos | integer | |
status | pendente, pago, expirado, devolvido, cancelado | |
link_pagamento | string ou null | Página de pagamento do provedor (Asaas, Mercado Pago), quando houver. |
pix_copia_e_cola | string ou null | |
expira_em | string | |
pago_em | string ou null | |
devolvido_centavos | integer ou null | |
criado_em | string |
curl "https://app.clilink.bio/api/v1/pagamentos/sinais?status=pendente" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/pagamentos/sinais?status=pendente", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();POST/api/v1/pagamentos/sinais
Cobrar o sinal de uma consulta
A mesma ação "Cobrar de novo" do painel: consulta futura, sem sinal aberto ou pago, com uma forma de pagamento ligada. O paciente recebe o link.
Permissão: pagamentos:write (cobrar sinal). Responde 201. Aceita Idempotency-Key.
| Campo do corpo | Tipo | Descrição |
|---|---|---|
consulta_id | uuid | |
valor_centavos (opcional) | integer | Sem ele, o valor pela regra do sinal do tipo de consulta. |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
consulta_id | uuid | |
metodo | pix_manual, asaas, mercadopago | |
forma | pix, cartao | |
valor_centavos | integer | |
status | pendente, pago, expirado, devolvido, cancelado | |
link_pagamento | string ou null | Página de pagamento do provedor (Asaas, Mercado Pago), quando houver. |
pix_copia_e_cola | string ou null | |
expira_em | string | |
pago_em | string ou null | |
devolvido_centavos | integer ou null | |
criado_em | string |
curl -X POST "https://app.clilink.bio/api/v1/pagamentos/sinais" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"consulta_id":"9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10","valor_centavos":5000}'const r = await fetch("https://app.clilink.bio/api/v1/pagamentos/sinais", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"consulta_id":"9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10","valor_centavos":5000}),
});
const { ok, data, erro } = await r.json();GET/api/v1/pagamentos/recebimentos
Recebimentos do mês
Permissão: pagamentos:read (ver pagamentos).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
mes (opcional) | query | string | Padrão: o mês atual. |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
mes | string | |
fuso | string | |
disponivel | boolean | false: o recebimento por consulta ainda não está ligado (só os sinais entram). |
recebido_centavos | integer | |
recebido_consultas_centavos | integer | |
recebido_sinais_centavos | integer | |
a_receber_centavos | integer | |
consultas_a_receber | integer | |
por_forma | object |
curl "https://app.clilink.bio/api/v1/pagamentos/recebimentos?mes=2026-10" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/pagamentos/recebimentos?mes=2026-10", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();Página
GET/api/v1/pagina
Página e textos das seções
Cada seção traz os campos de texto com o endereço (`campo`) usado para editar.
Permissão: pagina:read (ver a página).
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
slug | string | |
url | string | |
nome | string ou null | |
especialidade | string ou null | |
publicada | boolean | |
secoes | lista de Secao |
curl "https://app.clilink.bio/api/v1/pagina" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/pagina", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();PATCH/api/v1/pagina/secoes/{id}
Editar textos de uma seção
Só texto que a seção já tem (título, frase de apresentação, nome e descrição de serviço, pergunta e resposta...). Links, imagens, ordem e ligar ou desligar seção continuam no editor. Volta com os avisos do CFM/CFO, se houver.
Permissão: pagina:write (editar a página).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
| Campo do corpo | Tipo | Descrição |
|---|---|---|
textos | object | { "campo": "texto novo" }. Os campos vêm em GET /pagina (secoes[].textos[].campo). |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
secao | Secao | |
mudou | lista de string | |
avisos | lista de AvisoConselho |
curl -X PATCH "https://app.clilink.bio/api/v1/pagina/secoes/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Content-Type: application/json"
-d '{"textos":{"tagline":"Dermatologista em Porto Alegre. Atendimento particular."}}'const r = await fetch("https://app.clilink.bio/api/v1/pagina/secoes/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10", {
method: "PATCH",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({"textos":{"tagline":"Dermatologista em Porto Alegre. Atendimento particular."}}),
});
const { ok, data, erro } = await r.json();POST/api/v1/pagina/publicar
Publicar ou tirar do ar
Permissão: pagina:write (editar a página). Aceita Idempotency-Key.
| Campo do corpo | Tipo | Descrição |
|---|---|---|
publicada | boolean | true publica; false tira do ar. |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
publicada | boolean | |
url | string | |
avisos | lista de AvisoConselho |
curl -X POST "https://app.clilink.bio/api/v1/pagina/publicar" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"publicada":true}'const r = await fetch("https://app.clilink.bio/api/v1/pagina/publicar", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"publicada":true}),
});
const { ok, data, erro } = await r.json();GET/api/v1/pagina/numeros
Números da página
Visitas, cliques, agendamentos, sinais, comparecimento, faltas e contatos dos últimos dias.
Permissão: pagina:read (ver a página).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
dias (opcional) | query | integer |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
dias | integer | |
visitas | integer | |
cliques_agendar | integer | |
cliques_whatsapp | integer | |
agendaram | integer | |
pagaram_sinal | integer | |
compareceram | integer | |
consultas | integer | |
faltas | integer | |
taxa_falta | number ou null | Faltas sobre (compareceram + faltas), em %. |
contatos | integer |
curl "https://app.clilink.bio/api/v1/pagina/numeros?dias=30" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/pagina/numeros?dias=30", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();Webhooks
GET/api/v1/webhooks
Listar webhooks
Permissão: webhooks:manage (gerenciar webhooks).
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
url | string | |
descricao | string ou null | |
eventos | lista de consulta.criada, consulta.confirmada, consulta.cancelada, consulta.remarcada, sinal.pago, contato.novo, paciente.criado | |
ativo | boolean | |
falhas_seguidas | integer | |
segredo_prefixo | string | |
criado_em | string |
curl "https://app.clilink.bio/api/v1/webhooks" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/webhooks", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();POST/api/v1/webhooks
Criar webhook
Até 5 por conta. O `segredo` aparece só nesta resposta.
Permissão: webhooks:manage (gerenciar webhooks). Responde 201. Aceita Idempotency-Key.
| Campo do corpo | Tipo | Descrição |
|---|---|---|
url | string | https público, porta 443. |
descricao (opcional) | string | |
eventos | lista de consulta.criada, consulta.confirmada, consulta.cancelada, consulta.remarcada, sinal.pago, contato.novo, paciente.criado |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
url | string | |
descricao | string ou null | |
eventos | lista de consulta.criada, consulta.confirmada, consulta.cancelada, consulta.remarcada, sinal.pago, contato.novo, paciente.criado | |
ativo | boolean | |
falhas_seguidas | integer | |
segredo_prefixo | string | |
criado_em | string | |
segredo | string | Aparece só agora. Guarde para conferir a assinatura. |
curl -X POST "https://app.clilink.bio/api/v1/webhooks" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json"
-d '{"url":"https://hooks.zapier.com/hooks/catch/123/abc/","eventos":["consulta.criada","consulta.cancelada"]}'const r = await fetch("https://app.clilink.bio/api/v1/webhooks", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({"url":"https://hooks.zapier.com/hooks/catch/123/abc/","eventos":["consulta.criada","consulta.cancelada"]}),
});
const { ok, data, erro } = await r.json();PATCH/api/v1/webhooks/{id}
Mudar webhook
Permissão: webhooks:manage (gerenciar webhooks).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
| Campo do corpo | Tipo | Descrição |
|---|---|---|
url (opcional) | string | |
descricao (opcional) | string | |
eventos (opcional) | lista de consulta.criada, consulta.confirmada, consulta.cancelada, consulta.remarcada, sinal.pago, contato.novo, paciente.criado | |
ativo (opcional) | boolean |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
url | string | |
descricao | string ou null | |
eventos | lista de consulta.criada, consulta.confirmada, consulta.cancelada, consulta.remarcada, sinal.pago, contato.novo, paciente.criado | |
ativo | boolean | |
falhas_seguidas | integer | |
segredo_prefixo | string | |
criado_em | string |
curl -X PATCH "https://app.clilink.bio/api/v1/webhooks/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Content-Type: application/json"
-d '{"ativo":false}'const r = await fetch("https://app.clilink.bio/api/v1/webhooks/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10", {
method: "PATCH",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({"ativo":false}),
});
const { ok, data, erro } = await r.json();DELETE/api/v1/webhooks/{id}
Apagar webhook
Permissão: webhooks:manage (gerenciar webhooks).
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | |
apagado | true |
curl -X DELETE "https://app.clilink.bio/api/v1/webhooks/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10" \
-H "Authorization: Bearer $CLILINK_TOKEN"const r = await fetch("https://app.clilink.bio/api/v1/webhooks/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10", {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` },
});
const { ok, data, erro } = await r.json();POST/api/v1/webhooks/{id}/testar
Enviar teste
Manda o evento webhook.teste na hora e devolve o resultado.
Permissão: webhooks:manage (gerenciar webhooks). Aceita Idempotency-Key.
| Parâmetro | Onde | Tipo | Descrição |
|---|---|---|---|
id | caminho | uuid |
Campos da resposta (data)
| Campo | Tipo | Descrição |
|---|---|---|
entregue | boolean | |
http | integer ou null | |
erro | string ou null | |
ms | integer |
curl -X POST "https://app.clilink.bio/api/v1/webhooks/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/testar" \
-H "Authorization: Bearer $CLILINK_TOKEN" \
-H "Idempotency-Key: $(uuidgen)"const r = await fetch("https://app.clilink.bio/api/v1/webhooks/9b2f6c1e-1d2a-4c55-9a51-0d7e3b1c2a10/testar", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}`, "Idempotency-Key": crypto.randomUUID() },
});
const { ok, data, erro } = await r.json();Atualizada em 21/10/2026. Dúvida ou algo faltando? contato@clilink.bio.