Documentação do NYX Labs

Licenciamento por key, por conta ou pelos dois — com planos Free/Pago, trial, licença offline e cobrança PIX nas suas credenciais.

Começar em 5 minutos

  1. Crie o app em Novo app. Você recebe o App ID e o segredo (revelável depois, com senha).
  2. Instale a SDK da sua linguagem (C++, C#, Python, Node.js ou Lua — pasta Site/sdk do repositório).
  3. Chame init → login/license → check a cada 30–60 s.
  4. A tela Integração mostra “conectado” assim que o primeiro /init chegar.
const auth = new NyxAuth({ appId, appSecret: process.env.NYX_APP_SECRET, baseUrl: 'https://api.nyxmenu.com' });
await auth.init({ version: '1.0.0' });
await auth.login(user, password);          // ou auth.license(key), ou auth.register(user, password) no plano gratuito
await auth.entitlements();                  // planos Free/Pago
if (auth.hasFeature('export_4k')) { /* ... */ }

Protocolo assinado

Toda chamada ao Client API é POST e assinada com o segredo do app. As SDKs fazem tudo isso por você; os detalhes valem se for implementar em outra linguagem.

canonical = METHOD \n PATH+QUERY \n TIMESTAMP \n NONCE \n sha256hex(BODY) \n sha256hex(SESSION \n HWID)
x-nyx-signature = hex( HMAC_SHA256(appSecret, canonical) )

Resposta: x-nyx-response-signature = hex( HMAC_SHA256(appSecret, NONCE \n STATUS \n sha256hex(corpo)) )
HeaderQuandoDescrição
x-nyx-appsempreApp ID
x-nyx-timestamp / nonce / signaturesempreJanela de ±60 s e nonce único (anti-replay)
x-nyx-sessionapós /initToken opaco de sessão
x-nyx-hwidcom trava de HWIDIdentificador da máquina

Valide a assinatura da resposta e recuse a resposta sem o header: um servidor falso (hosts/DNS) não conhece o segredo e o omitiria.

Client API

RotaDescrição
POST /api/v1/client/initHandshake: versão, integridade (hash) e abertura de sessão
/registerCria a conta. Com key, ou sem key no plano gratuito (modo contas/híbrido)
/login · /license · /upgradeUsuário+senha · só a key · aplica nova key (empilha o tempo)
/checkHeartbeat — ban, expiração, kill switch e revogação chegam aqui
/entitlementsLicença efetiva e entitlements do usuário
/trialTrial do plano (1 por usuário e 1 por máquina)
/license/offlineToken offline assinado (Ed25519)
/fileURL assinada (60 s) de arquivo protegido, conforme o nível
/checkout/prices · /checkout · /checkout/statusCompra via PIX dentro do app
/var · /log · /ban · /logoutVariável server-side · log · auto-ban · sair

Planos e entitlements

No modo Contas ou Híbrido você define planos (tiers), por exemplo free e pro. Cada plano tem nível (acesso a variáveis/arquivos), dispositivos, offline, trial e entitlements — flags, números ou textos.

{ "license": { "state": "active", "tier": { "code": "pro" }, "level": 5, "lifetime": false,
  "expiresAt": "2026-12-01T00:00:00Z",
  "features": { "export_4k": true, "max_projects": 50, "badge": "PRO" } } }

O usuário pode ter várias licenças ao mesmo tempo: vale o maior nível, as flags combinam (OU), os números pegam o maior e o texto vem do plano de maior nível. Quando o Pro vence, a conta volta ao Free sozinha.

Licença offline

Para apps que precisam rodar sem internet. O servidor assina um token Ed25519 preso à máquina (HWID), que expira no menor entre o teto do plano, o teto do tier e o fim da licença. Valide com a chave pública do app (aba Integração), embutida no binário.

token = base64url(payloadJSON) + "." + base64url(signature)
payload = { v, app, sub, lid, tier, level, features, hwid, iat, exp }

Rotacionar a chave (Integração → senha) invalida todos os tokens antigos.

Cobrança PIX (Efí e Mercado Pago)

Você conecta as suas credenciais; o dinheiro cai direto na sua conta — o NYX Labs nunca toca nele. Há duas formas de vender: dentro do app (/checkout, a licença cai na conta) ou pela página hospedada /c/seu-endereco (o comprador recebe uma key por e-mail e na tela).

Toda confirmação de pagamento é re-consultada na API do provedor (valor, referência e estado). O webhook sozinho nunca libera nada, e um job a cada minuto cobre avisos perdidos.

SellerAPI (Ultra)

Chaves nxs_live_… com escopos, app opcional, IPs permitidos e validade. A chave vai no header — nunca na URL.

POST /api/v1/seller/keys
Authorization: Bearer nxs_live_...
Idempotency-Key: 5b7c... (obrigatório em criações)
{ "appId": "…", "amount": 10, "durationDays": 30, "tierId": "…" }
RotaEscopo
GET /apps · /statsstats:read
GET /keys · POST /keys · /keys/:id/ban|unban|deletekeys:read / keys:write
GET /users · /users/:id · POST /users/:id/ban|unban|reset-hwid|extendusers:read / users:write
POST /licenses/grant · /licenses/:id/revoke|extendlicenses:write
GET /sessions · POST /sessions/:id/killsessions:read / sessions:write
GET /variables · PUT /variables/:namevariables:read / variables:write
GET /chargescharges:read

Limite de 120 req/min por chave. Repetir uma criação com o mesmo Idempotency-Key (24 h) devolve a mesma resposta — um bot que repete a chamada não gera keys em dobro. Mesma chave com corpo diferente é recusada.

Revenda com saldo (Ultra)

Crie revendedores, recarregue créditos e defina a tabela de custo (plano + duração → créditos). Cada revendedor tem uma chave nxr_… e gera keys por POST /api/v1/reseller/keys; o custo é debitado de forma atômica (nunca fica negativo, mesmo com requisições simultâneas) e registrado no extrato.

Webhooks

Eventos assinados com HMAC (x-nyx-signature, x-nyx-timestamp) para o seu servidor. Destinos internos são bloqueados.

EventoQuando
user.register / user.login / user.ban / user.expireCiclo de vida do usuário
key.create / key.redeem / key.banKeys
license.granted / license.revoked / license.expiredLicenças
trial.startedTrial iniciado
charge.created / charge.paid / charge.expiredCobranças PIX
quota.reachedUm limite do plano foi atingido
session.blocked / security.alertBloqueios e alertas

Segurança

  • Keys só existem como HMAC; segredos reversíveis (app, credenciais de pagamento, variáveis) ficam cifrados com AES-256-GCM e AAD por linha.
  • Sessão do painel com refresh rotativo e detecção de reuso, CSRF, 2FA e dispositivos confiáveis.
  • Isolamento total entre contas: um app só é visível ao dono (e à equipe autorizada).
  • Plano vencido: 7 dias de graça (painel só leitura, seus apps continuam), depois o Client API responde “indisponível”.