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

EscopoO que libera
agenda:readVer a agenda. Consultas, horários livres, tipos de consulta e locais.
agenda:writeMudar a agenda. Marcar, confirmar, remarcar e cancelar consultas.
pacientes:readVer pacientes. Nome, WhatsApp, e-mail e nascimento. Nunca o prontuário.
pacientes:writeCadastrar pacientes. Criar e atualizar o cadastro (sem dado clínico).
contatos:readVer pedidos de contato. Quem pediu contato pela página (sem a mensagem livre).
pagamentos:readVer pagamentos. Sinais e recebimentos das consultas.
pagamentos:writeCobrar sinal. Gerar a cobrança do sinal de uma consulta.
pagina:readVer a página. Seções, textos e números da página.
pagina:writeEditar a página. Trocar textos das seções e publicar ou tirar do ar.
webhooks:manageGerenciar webhooks. Criar, mudar e apagar webhooks da conta.
Não existe escopo de prontuário. Tokens criados antes das permissões (outubro de 2026) continuam valendo só para /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.

403
{
  "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." }
}
HTTPcodigoQuando
401token_obrigatorioFaltou o cabeçalho Authorization: Bearer.
401token_invalido, token_revogado, token_expiradoToken que não existe, foi revogado ou passou da validade.
403escopo_insuficienteO token não tem a permissão da rota (veja erro.escopos_necessarios).
403sem_moduloO recurso não está ligado nesta conta (ex.: pagamento do sinal).
404nao_encontradoNão existe ou é de outra conta (para a API, dá no mesmo).
405metodo_nao_permitidoMétodo errado para o endereço (veja o cabeçalho Allow).
409conflito, horario_indisponivelA regra não deixa (consulta já cancelada, horário ocupado ou fora da agenda).
409confirmar_avisosO novo horário tem avisos (fora do horário, folga): confira erro.avisos e mande de novo com confirmar_avisos.
409idempotencia_em_andamentoO primeiro pedido com esta Idempotency-Key ainda está rodando.
422dados_invalidosEntrada inválida: erro.campos diz o campo e o porquê.
422idempotencia_conflitoEsta Idempotency-Key já foi usada com outro pedido.
429limite_excedidoMuitos pedidos: espere o tempo do Retry-After.
503erro_interno, nao_disponivelFalha 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.

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