Desenvolvedores
Autenticação, permissões e limites
Token Bearer por conta, permissões (escopos), validade, limite de pedidos, formato do erro, paginação por cursor e Idempotency-Key.
Token por conta
Toda chamada leva o token da conta no cabeçalho Authorization: Bearer clk_.... Os tokens são criados no painel (Configurações > Conta > Avançado > Integrações), até 10 ativos por conta, cada um com nome, permissões e validade (sem prazo, 30, 90 ou 365 dias). O painel mostra o último uso e revoga na hora. O CliLink guarda só um resumo irreversível (hash) do token: se perder, crie outro.
O token age como o próprio profissional, na conta dele. A sessão do painel (cookie) não vale nas rotas da API: só o token. Chamadas vêm do seu servidor; não coloque o token em código que roda no navegador do paciente.
Permissões (escopos)
Marque só o que o sistema precisa. Quem pode mudar também pode ler o mesmo grupo (agenda:write vale como agenda:read).
| Escopo | O que libera |
|---|---|
agenda:read | Ver a agenda. Consultas, horários livres, tipos de consulta e locais. |
agenda:write | Mudar a agenda. Marcar, confirmar, remarcar e cancelar consultas. |
pacientes:read | Ver pacientes. Nome, WhatsApp, e-mail e nascimento. Nunca o prontuário. |
pacientes:write | Cadastrar pacientes. Criar e atualizar o cadastro (sem dado clínico). |
contatos:read | Ver pedidos de contato. Quem pediu contato pela página (sem a mensagem livre). |
pagamentos:read | Ver pagamentos. Sinais e recebimentos das consultas. |
pagamentos:write | Cobrar sinal. Gerar a cobrança do sinal de uma consulta. |
pagina:read | Ver a página. Seções, textos e números da página. |
pagina:write | Editar a página. Trocar textos das seções e publicar ou tirar do ar. |
webhooks:manage | Gerenciar webhooks. Criar, mudar e apagar webhooks da conta. |
/api/v1/eu e /api/v1/eu/modulos; para o resto, crie um token novo.Limites
- 60 pedidos por minuto por token e 120 por conta (somando os tokens) e por endereço IP. Passou: 429 com
Retry-After: 60. - Corpo do pedido até 64 KB. Listas com até 200 itens por página.
- Horários livres: até 31 dias por pedido. Consultas: até 93 dias por pedido.
Resposta e erro
Sempre JSON, sem cache. Sucesso: { "ok": true, "data": ... }. Erro: { "ok": false, "erro": { "codigo", "mensagem" } }, com campos, avisos ou escopos_necessarios quando ajudam. A mensagem é em português e pode ser mostrada para quem usa o seu sistema. O campo error (code e message) continua igual para quem já usava a API antes.
{
"ok": false,
"erro": {
"codigo": "escopo_insuficiente",
"mensagem": "Este token não tem o escopo agenda:write. Crie outro token com ele no painel.",
"escopos_necessarios": ["agenda:write"]
},
"error": { "code": "escopo_insuficiente", "message": "Este token não tem o escopo agenda:write. Crie outro token com ele no painel." }
}| HTTP | codigo | Quando |
|---|---|---|
| 401 | token_obrigatorio | Faltou o cabeçalho Authorization: Bearer. |
| 401 | token_invalido, token_revogado, token_expirado | Token que não existe, foi revogado ou passou da validade. |
| 403 | escopo_insuficiente | O token não tem a permissão da rota (veja erro.escopos_necessarios). |
| 403 | sem_modulo | O recurso não está ligado nesta conta (ex.: pagamento do sinal). |
| 404 | nao_encontrado | Não existe ou é de outra conta (para a API, dá no mesmo). |
| 405 | metodo_nao_permitido | Método errado para o endereço (veja o cabeçalho Allow). |
| 409 | conflito, horario_indisponivel | A regra não deixa (consulta já cancelada, horário ocupado ou fora da agenda). |
| 409 | confirmar_avisos | O novo horário tem avisos (fora do horário, folga): confira erro.avisos e mande de novo com confirmar_avisos. |
| 409 | idempotencia_em_andamento | O primeiro pedido com esta Idempotency-Key ainda está rodando. |
| 422 | dados_invalidos | Entrada inválida: erro.campos diz o campo e o porquê. |
| 422 | idempotencia_conflito | Esta Idempotency-Key já foi usada com outro pedido. |
| 429 | limite_excedido | Muitos pedidos: espere o tempo do Retry-After. |
| 503 | erro_interno, nao_disponivel | Falha nossa ou recurso ainda não ligado. Pode tentar de novo. |
Toda resposta traz x-clilink-requisicao: mande esse valor se falar com o suporte.
Paginação por cursor
Listas devolvem proximo_cursor. Para a próxima página, mande o valor em cursor (com os mesmos filtros). null quer dizer que acabou. O cursor não tem significado fora da API: não monte um.
async function todosOsPacientes() {
const todos = [];
let cursor = null;
do {
const url = new URL("https://app.clilink.bio/api/v1/pacientes");
url.searchParams.set("limite", "200");
if (cursor) url.searchParams.set("cursor", cursor);
const r = await fetch(url, { headers: { Authorization: `Bearer ${process.env.CLILINK_TOKEN}` } });
const corpo = await r.json();
if (!corpo.ok) throw new Error(corpo.erro.mensagem);
todos.push(...corpo.data);
cursor = corpo.proximo_cursor;
} while (cursor);
return todos;
}Idempotency-Key
Nos POST, mande Idempotency-Key com um valor novo por ação (um UUID serve; de 8 a 255 caracteres). Se o mesmo pedido chegar de novo com a mesma chave em até 24 horas, a API devolve a mesma resposta, com Idempotent-Replayed: true, sem marcar, cadastrar ou cobrar outra vez. A mesma chave com outro corpo dá 422. Resposta 5xx ou 429 não fica guardada: pode tentar de novo com a mesma chave.
Fuso e datas
Instantes em ISO 8601 (UTC), como inicio e fim. Para marcar e remarcar, mande dia (AAAA-MM-DD) e hora (HH:MM) no fuso da agenda do consultório, o mesmo que volta em fuso. Valores em dinheiro vêm em centavos (valor_centavos).
Atualizada em 21/10/2026. Dúvida ou algo faltando? contato@clilink.bio.