Como funciona a API do Klyk
Última atualização: Agosto de 2026
A API serve para o seu sistema fazer sozinho o que você faria no painel: criar um link por campanha, trocar o destino de um link já publicado, puxar o relatório para o seu próprio relatório. Este texto conta o percurso inteiro, na ordem em que ele acontece — a referência campo a campo está na documentação.
Em que planos existe
403, inclusive a de teste — não é limite de volume, é ausência do recurso.1Ter o plano, e gerar a chave
A API existe no Pro e no Business. Numa conta Free toda chamada responde
403— inclusive a de teste.- A chave se gera no painel, em Configurações → API, e aparece uma vez só.
- O Klyk não guarda a chave: guarda o SHA-256 dela. Perdeu, é gerar outra — e a antiga morre no mesmo instante.
- Guarde em variável de ambiente. Nunca no código versionado, e nunca como argumento de linha de comando.
2A primeira chamada, que não altera nada
GET /api/v1/meconfirma se a chave vale, antes de você escrever o resto da integração.401é chave errada ou revogada.403é chave certa e plano sem API. São coisas diferentes, e a resposta diz qual.- Esta resposta é a única achatada, sem o envelope do resto — Zapier e Make montam o nome da conexão a partir dos campos de primeiro nível.
3O sistema dele cria links sozinho
É aqui que a integração vira produto: a loja gera um link por campanha, o CRM um por vendedor, o disparo de e-mail um por envio.
- O campo do apelido é
custom_code, e nãoalias. Campo desconhecido é ignorado em silêncio — quem mandaraliasrecebe201e fica com um código aleatório. - Código já em uso devolve
409. URL inválida,400. - O link aparece no painel na mesma hora, junto com os criados à mão. Não há links da API separados.
- O campo do apelido é
4Ler de volta, e ler o relatório
Guardando o
id, dá para pegar o estado atual do link e os cliques dele quando quiser.GET /v1/links/:idtraz o link comtotal_clicks.GET /v1/links/:id/analyticstrazby_country,by_deviceeby_source, no período pedido.- Link que não é seu e link que não existe respondem os dois
404: distinguir contaria a um estranho que aquele id existe.
5O webhook: agora a seta inverte
Nas quatro etapas anteriores o sistema dele chamou o Klyk. A partir daqui é o Klyk que chama o sistema dele, a cada evento, sem ser perguntado.
- A assinatura é o HMAC-SHA256 de timestamp + "." + corpo cru— e não do corpo sozinho. Quem implementar como "HMAC do payload" rejeita todas as entregas legítimas e conclui que o Klyk manda assinatura errada.
- Compare sobre o corpo CRU, antes de qualquer JSON.parse: reserializar muda espaços e ordem de chaves.
- Cada entrega espera até 10 segundos pela resposta. Responda rápido e processe depois, em fila.
6Os limites, e o que fazer com cada recusa
100 requisições por hora, por chave, em janela deslizante. Vale igual para Pro e Business — não é degrau de plano.
- Toda resposta traz
X-RateLimit-RemainingeX-RateLimit-Reset, para o sistema dele parar antes de estourar. - Os limites de links do plano valem igual pela API: Free 25, Pro 1.000, Business 3.500 links novos por mês.
400é corpo inválido — repetir não resolve.429é esperar até o Reset.500é nosso.
- Toda resposta traz
1. A chave, e por que ela aparece uma vez só
Você gera a chave no painel, em Configurações → API. Ela aparece na tela naquele instante, e não volta a aparecer: o Klyk guarda o SHA-256 dela, não a chave. É o mesmo raciocínio da senha — um vazamento do banco não entrega a chave de ninguém.
Perdeu, não há recuperar: gera outra, e a anterior deixa de valer no mesmo instante.
Onde guardar
2. As rotas
| Método | Rota | O que faz |
|---|---|---|
| GET | /api/v1/me | A conta: id, e-mail, plano. É o teste da chave |
| GET | /api/v1/links | Lista os links, do mais novo para o mais antigo |
| POST | /api/v1/links | Cria um link |
| GET | /api/v1/links/:id | Lê um link, com o total de cliques |
| PATCH | /api/v1/links/:id | Troca destino, título ou ativação |
| DELETE | /api/v1/links/:id | Apaga — e o histórico vai junto |
| GET | /api/v1/links/:id/analytics | O relatório de cliques |
| GET | /api/v1/webhooks | Lista as inscrições |
| POST | /api/v1/webhooks | Inscreve uma URL sua |
| DELETE | /api/v1/webhooks/:id | Cancela a inscrição |
Salvo /v1/me, toda resposta vem no envelope { "data": …, "error": … }. O /v1/me é achatado de propósito: Zapier, Make e n8n montam o nome da conexão a partir dos campos de primeiro nível, e um envelope faria a conexão aparecer sem nome.
3. O limite de requisições
100 por hora, por chave, em janela deslizante. Vale igual para Pro e Business: não é degrau de plano.
Toda resposta traz X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset — inclusive as que deram certo. É o que permite ao seu sistema parar antes de estourar, em vez de descobrir no 429.
Os limites do plano valem igual pela API, porque saem da mesma tabela: Free 25, Pro 1.000 e Business 3.500 links novos por mês. Nada do que já foi criado deixa de funcionar por causa do limite.
4. O webhook inverte o sentido
Nas rotas acima, o seu sistema chama o Klyk. O webhook é o contrário: você inscreve uma URL sua, e o Klyk passa a chamá-la a cada evento — link criado, link clicado, destino alterado, link pausado, link apagado.
A assinatura não é o que parece
sha256=. Quem implementar a verificação como "HMAC do payload" vai rejeitar todas as entregas legítimas e concluir que o Klyk manda assinatura errada.Compare sobre o corpo cru, antes de qualquer JSON.parse: reserializar muda espaços e ordem de chaves, e a assinatura deixa de bater.
Três coisas que fazem perder tempo
- O campo do destino muda de nome. Ao criar é
url; ao alterar édestination_url(oudestination). MandarurlnumPATCHdevolve400— recusar é melhor que ignorar, e ainda assim confunde. - O apelido é
custom_code, nãoalias. Campo desconhecido é ignorado em silêncio, como em qualquer API REST: quem mandaraliasrecebe201, acha que funcionou, e fica com um código aleatório — possivelmente num QR Code já impresso. 401e403são coisas diferentes. O primeiro é chave errada ou revogada; o segundo é chave certa e plano sem API, ou limite do plano atingido. A mensagem diz qual.
Como testar antes de escrever a integração
A conta que você usa para testar é a sua conta de verdade: link criado pela API é link no painel. Vale começar por GET /api/v1/me, que não altera nada, e só depois criar.