Documentação da API
Conecte o site do seu cliente à Hakopay. A Hakopay cobra, confirma o pagamento com a instituição financeira, cuida do vencimento das assinaturas e avisa o site quando liberar ou bloquear cada cliente.
Como começar
- No painel da Hakopay, em Meu site, o vendedor cria a chave de acesso e a entrega a você.
- Você informa o endereço de aviso: uma URL
httpsdo site que recebe os avisos de pagamento. O painel mostra o segredo para conferir a assinatura desses avisos. - O site cadastra os planos pela API e inscreve cada cliente numa assinatura.
- O vendedor usa Verificar conexão no painel para confirmar que o site está recebendo os avisos.
Endereço base: https://api.hakopay.com.br. Valores sempre em centavos inteiros (9700 = R$ 97,00).
Autenticação
Toda chamada leva a chave de acesso no cabeçalho:
Authorization: Bearer hako_live_...
A chave identifica a conta do vendedor. Guarde-a somente no servidor do site, nunca no navegador ou no aplicativo. Sem chave, ou com chave desligada, a resposta é 401.
Planos
Cadastre cada produto uma vez. A resposta traz o id do plano.
POST /v1/planos
{ "name": "Curso completo", "priceCents": 9700, "cycleDays": 30 }cycleDays de 7 a 366. GET /v1/planos lista os planos ativos. Os planos cadastrados aparecem automaticamente no painel do vendedor.
Assinaturas
Inscreva o cliente e receba a primeira cobrança:
POST /v1/assinaturas
{
"planId": "ID_DO_PLANO",
"customer": { "externalId": "aluno-123", "email": "aluno@exemplo.com", "name": "Ana" }
}externalId é o código do cliente no seu sistema. A resposta traz payment.checkoutUrl (página de pagamento pronta) e payment.pix, para mostrar o Pix dentro do seu site. Chamar de novo antes do pagamento devolve a mesma cobrança.
Para decidir se libera o acesso, olhe somente o campo active da assinatura.
| Chamada | Para quê |
|---|---|
GET /v1/assinaturas/:id | Situação atual (fonte da verdade) |
GET /v1/assinaturas?externalId= | Assinaturas de um cliente |
POST /v1/assinaturas/:id/renovar | Cobrança do próximo período |
POST /v1/assinaturas/:id/cancelar | Não renovar; o acesso vale até o fim do período pago |
Cobranças avulsas
Para vendas únicas, sem assinatura:
POST /v1/cobrancas
Idempotency-Key: pedido-42
{ "amountCents": 4990, "description": "Plano mensal", "externalRef": "pedido-42" }Repetir a mesma Idempotency-Key devolve a mesma cobrança. GET /v1/cobrancas/:id consulta a situação.
Avisos (webhook)
A Hakopay envia um POST com JSON para o endereço de aviso a cada mudança. O mesmo aviso pode chegar mais de uma vez: use o id do evento para ignorar repetidos. Responda 2xx em até 10 segundos; caso contrário, a Hakopay tenta novamente até 6 vezes, ao longo de cerca de 4 horas.
| Evento | O que o site faz |
|---|---|
subscription.activated | Liberar o acesso |
subscription.renewed | Manter o acesso até o novo vencimento |
subscription.canceled | Nada ainda: o acesso vale até o fim do período |
subscription.expired | Bloquear o acesso |
charge.paid | Cobrança paga (opcional, para conciliação) |
charge.refunded | Cobrança estornada |
test | Enviado pelo botão Verificar conexão: apenas responda 2xx |
Confira a assinatura de cada aviso. O cabeçalho X-Hako-Signature tem o formato t=<unix>,v1=<hmac>:
- Recuse se
testiver a mais de 5 minutos de agora. - Calcule
HMAC-SHA256(segredo, "<t>.<corpo cru>")em hexadecimal. - Compare com
v1. Se forem iguais, o aviso é legítimo.
Ambiente de testes
Para desenvolver sem cobrar ninguém, a Hakopay oferece um ambiente de testes com chaves próprias (prefixo hako_test_). Nele, o pagamento é simulado e nenhuma conta real é movimentada. Peça o acesso ao ambiente de testes ao suporte da Hakopay.
Cada chave só funciona no ambiente dela. Usada no ambiente errado, a resposta é 401 com wrong_environment, e nada é cobrado. Ao publicar, troque pela chave criada no painel (hako_live_).
Erros
| Resposta | Quando |
|---|---|
401 | Sem chave, chave desligada ou do ambiente errado |
404 plan_not_found | Plano inexistente, de outra conta ou desativado |
409 already_active | O cliente já assina e está em dia (use /renovar) |
422 validation | Corpo da requisição inválido |
429 too_many_charges | Muitas cobranças novas para o mesmo cliente em 1 hora |
Dúvidas técnicas: fale com a equipe.