Endpoints públicos do portal consumidos pelo BrutusForge Client durante o boot/phone-home. Ambos exigem Content-Type: application/json.
POST /api/licenses/activate
Primeira ativação de licença. Vincula o HWID e retorna um JWT Ed25519 assinado. Rate limit: 5 req/min por IP.
Body
{
"licenseKey": "BF-XXXX-XXXX-XXXX-XXXX",
"hwid": "sha256:<hex>",
"instanceId": "<uuid>",
"version": "1.0.0-rc1"
}Response 200
{
"token": "<JWT Ed25519>",
"signingKeyId": "ed25519-2026-04-18"
}Erros
403 UNAUTHORIZED— licença não existe, HWID diverge ou status inválido403 HWID_MISMATCH— licença vinculada a outra máquina (use minha conta para transferir)400— body inválido (Zod)429— rate limit
POST /api/licenses/validate
Phone-home diário. Verifica o status remotamente e rotaciona o JWT (TTL 1 dia). Rate limit: 30 req/min por IP.
Body
{
"tenantId": "<cuid>",
"token": "<JWT anterior>",
"hwid": "sha256:<hex>"
}Response 200
{
"token": "<JWT renovado>",
"signingKeyId": "ed25519-2026-04-18"
}Erros
403 REVOKED— licença revogada no portal403 SUSPENDED— licença suspensa temporariamente403 EXPIRED— passou do vencimento403 HWID_MISMATCH— HWID não bate
JWT Claims
{
"iss": "brutusforge.io",
"aud": "brutusforge-api",
"sub": "<licenseId>",
"iat": 1234567890,
"exp": 1234654290,
"tier": "L1",
"tenantId": "<cuid>",
"hwid": "sha256:<hex>",
"features": ["*"],
"maxClusters": null,
"buyerEmail": "<email>",
"purchaseId": "<gatewayOrderId>"
}O header inclui kid (key id) para rotação futura. O cliente verifica a assinatura com LICENSE_SERVER_PUBLIC_KEY (Ed25519, 32 bytes base64url).