Webhooks
Receba no seu sistema um aviso a cada key gerada, HWID resetado ou mudança de saldo.
Em vez de perguntar à API de tempos em tempos, o seu sistema pode receber os avisos: a cada evento, o nosso servidor faz um POST com um JSON assinado para a URL que você cadastrar.
Como cadastrar
No painel, em Notificações e logs, cada canal aceita uma URL:
- URL de webhook do Discord: o canal recebe a mensagem pronta, formatada para o Discord.
- Qualquer outra URL
https: o seu sistema recebe o JSON descrito nesta página.
Na mesma tela ficam o botão Testar, o histórico de envios e o segredo de cada canal, usado para validar a assinatura.
Canais
| Canal | Quando avisa | Eventos |
|---|---|---|
keys | Você gerou keys (pela API ou pelo painel). | key.generated |
hwid | Um HWID foi resetado. | key.hwid_reset |
credits | O seu saldo mudou: compra ou ajuste. | credits.purchased, credits.added, credits.removed |
mods | Saiu change-log de um mod da revenda. | changelog.published |
games | O jogo de um mod da revenda foi atualizado. | game.updated |
Nos canais mods e games você pode escolher, no painel, de quais mods ou jogos quer receber. Sem escolha, recebe de todos.
Requisitos da URL
https, na porta padrão (443), num endereço público. Endereço de rede interna é recusado.- Sem usuário e senha na URL. Para saber que o aviso veio de nós, valide a assinatura.
- Responda
2xxem até 5 segundos. O ideal é204sem corpo; uma resposta acima de 1 MB conta como falha. - Redirecionamento não é seguido: cadastre a URL final.
Cabeçalhos
| Cabeçalho | O que é |
|---|---|
Content-Type | application/json |
X-Project-Event | O evento (o mesmo do campo event). |
X-Project-Delivery | O id do aviso (o mesmo do campo id). Igual numa repetição. |
X-Project-Timestamp | Quando o envio foi feito, em segundos desde 1970 (Unix). |
X-Project-Signature-256 | sha256= seguido do HMAC-SHA256, em hex, de "{timestamp}.{corpo}" com o segredo do canal. |
Corpo
Todo aviso tem o mesmo envelope; o que muda é o data de cada evento.
{
"id": "6f1c2a4e-9d3b-4e7a-8c51-2b0d9f7a1e33",
"event": "key.generated",
"channel": "keys",
"version": 1,
"created_at": "2026-10-15T14:03:00-03:00",
"data": {
"generation_id": 57,
"product": { "id": 1001, "title": "MOD EXEMPLO" },
"quantity": 1,
"days": 30,
"keys": [{ "id": 204496, "code": "0a1b2c3d…c9d0e1f" }],
"credits": { "spent": 18, "balance": 480 },
"reseller": { "id": 12, "login": "minhaloja" }
}
}| Campo | O que é |
|---|---|
id | O id único do aviso. Use para ignorar repetições. |
event | O evento (tabela abaixo). |
channel | O canal que recebeu. |
version | A versão do formato do envelope. Hoje, 1. |
created_at | Quando o evento aconteceu (ISO 8601). |
data | Os dados do evento. |
Eventos
| Evento | Campos em data |
|---|---|
key.generated | generation_id, product {id, title}, quantity, days, keys [{id, code}], credits {spent, balance}, reseller {id, login} |
key.hwid_reset | key {id, code}, reseller {id, login} |
credits.purchased | order_id, credits, balance, reseller {id, login} |
credits.added | amount, balance, reseller {id, login} |
credits.removed | amount, balance, reason, reseller {id, login} |
changelog.published | product {id, title, image}, changelog {id, items [], text_pt, text_en} |
game.updated | game {appid, name, version, link, image}, products [{id, title}] |
webhook.test | message, reseller {id, login} — enviado pelo botão Testar do painel. |
Nos avisos, as keys vêm mascaradas (o começo e o fim do código). A key inteira sai pela API: Listar suas keys, com o id de keys[] em user_ids[].
Respostas e falhas
| A sua resposta | O que acontece |
|---|---|
2xx | Entregue. |
3xx ou 4xx (menos 429) | Falha. O aviso não é reenviado. |
5xx, 429 ou nenhuma resposta em 5 segundos | Falha. O aviso pode ser reenviado algumas vezes, com o mesmo id. |
Toda falha fica no histórico de envios do painel.
Depois de 10 falhas seguidas, o canal é desativado. Corrija o seu servidor e salve a URL de novo no painel para reativar.
Próximo passo
Valide a assinatura de todo aviso antes de confiar nele.