Documentação da API

Descriptografe resources FXAP e corrija modelos 3D do FiveM via HTTP. Envie um .zip, acompanhe o progresso e receba um link para baixar o resultado.

basehttps://api.nex5.com.br

Primeiros passos

Para usar a API você precisa de uma chave de acesso. Ela é entregue junto com sua assinatura, pelo ticket no Discord, e tem este formato:

nx_live_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6

Guarde a chave numa variável de ambiente do seu bot, painel ou fluxo. Ela dá acesso à sua cota, então não a coloque em código versionado nem em canais públicos.

Confira que está tudo certo com uma chamada simples:

curl https://api.nex5.com.br/health
{ "ok": true, "status": "online" }

Autenticação

Todas as rotas da API (exceto /health) exigem sua chave no cabeçalho Authorization:

Authorization: Bearer nx_live_...

Chamadas sem cabeçalho retornam 401 unauthorized. Chaves inválidas ou revogadas retornam 403 forbidden. Nunca envie a chave em query string.

Como funciona

A API é assíncrona. Você envia um trabalho e recebe um jobId. Depois faz polling em /v1/jobs/:id até o status ficar done — a resposta traz o link para baixar o arquivo processado.

Fluxo típico:

  1. Envia o .zip via POST /v1/upload — recebe um arquivoId.
  2. Chama POST /v1/decrypt com arquivoId + chave cfxk_.
  3. Faz polling em GET /v1/jobs/:id a cada 2-5 segundos.
  4. Quando o status vira done, baixa pelo downloadUrl na resposta.

POST /v1/decrypt

Cria um trabalho de descriptografia. Aceita JSON.

Corpo
{
  "arquivoId": "a1b2c3d4-...",
  "cfxKey": "cfxk_xxxxxxxxxxxxx"
}
Resposta
{
  "jobId": "job_2v9k4a...",
  "status": "queued"
}

POST /v1/repair

Repara modelos .yft, .ydr e .ydd de um resource já descriptografado.

Corpo
{
  "arquivoId": "a1b2c3d4-..."
}
Resposta
{
  "jobId": "job_9x8w7v...",
  "status": "queued"
}

GET /v1/jobs/:id

Consulta o estado de um job. Polling a cada 2-5 segundos.

Resposta (em andamento)
{
  "jobId": "job_2v9k4a...",
  "status": "running",
  "progresso": 62
}
Resposta (concluído)
{
  "jobId": "job_2v9k4a...",
  "status": "done",
  "arquivos": 184,
  "downloadUrl": "https://cdn.nex5.com.br/out/xxx.zip",
  "expiraEm": "2026-09-02T18:30:00Z"
}

POST /v1/upload

Envia um .zip como multipart/form-data. Retorna um arquivoId que você usa nos endpoints de decrypt/repair.

Exemplo
curl -X POST https://api.nex5.com.br/v1/upload \
  -H "Authorization: Bearer nx_live_..." \
  -F "[email protected]"
Resposta
{ "arquivoId": "a1b2c3d4-...", "bytes": 7156482 }

GET /health

Verifica se a API está no ar. Não exige autenticação.

curl https://api.nex5.com.br/health
{ "ok": true, "status": "online" }

Arquivos grandes

O upload direto pelo /v1/upload aceita até 2 GB por request. Para arquivos maiores, use um link público (Cloudflare R2, Backblaze B2, GoFile ou qualquer HTTPS) e passe no campo downloadUrl em vez de arquivoId.

Estados do job

statussignificado
queuedNa fila, ainda não começou
runningExecutando; campo progresso vai de 0 a 100
doneConcluído; downloadUrl disponível por 24h
failedFalhou; ver erro na resposta

Códigos de erro

httpcodequando acontece
400bad_requestCorpo inválido ou campo obrigatório ausente
401unauthorizedCabeçalho Authorization ausente
403forbiddenChave inválida, revogada ou sem plano ativo
404not_foundJob ou arquivo não existe (ou expirou)
429rate_limitedCota diária estourada
502upstreamFalha temporária no keymaster do FiveM — tente de novo

Limites

  • Upload direto: 2 GB por request
  • downloadUrl do resultado expira em 24 horas
  • Cota diária por chave conforme o plano — veja /precos
  • Rate limit: 60 requests/minuto por chave
  • Retentativa recomendada: backoff exponencial começando em 2s

Exemplo completo

Fluxo de ponta a ponta em Node.js usando fetch:

const CHAVE = process.env.NEX5_KEY;
const BASE = 'https://api.nex5.com.br';

// 1) upload
const formulario = new FormData();
formulario.append('file', arquivoZip, 'resource.zip');
const up = await fetch(`${BASE}/v1/upload`, {
  method: 'POST',
  headers: { authorization: `Bearer ${CHAVE}` },
  body: formulario,
}).then((r) => r.json());

// 2) cria job
const job = await fetch(`${BASE}/v1/decrypt`, {
  method: 'POST',
  headers: {
    authorization: `Bearer ${CHAVE}`,
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    arquivoId: up.arquivoId,
    cfxKey: 'cfxk_xxx',
  }),
}).then((r) => r.json());

// 3) polling
let estado;
while (true) {
  estado = await fetch(`${BASE}/v1/jobs/${job.jobId}`, {
    headers: { authorization: `Bearer ${CHAVE}` },
  }).then((r) => r.json());
  if (estado.status === 'done' || estado.status === 'failed') break;
  await new Promise((r) => setTimeout(r, 3000));
}

if (estado.status === 'done') {
  console.log('baixe em:', estado.downloadUrl);
}

Perguntas frequentes

Minha chave cfxk_ fica salva?

Não. Ela é usada uma vez por job e descartada imediatamente. Nunca é gravada em disco nem em log.

O downloadUrl é público?

Sim, mas com token único e expiração em 24h. Depois desse prazo o link para de funcionar.

Posso cancelar um job em execução?

Ainda não pela API. Se precisar cancelar, abra um ticket no Discord.

Vocês guardam os arquivos processados?

Não. Depois que o downloadUrl expira, o arquivo é apagado do storage. Backups seus são responsabilidade sua.

Tem SDK oficial?

Ainda não. Como a API é HTTP simples, use fetch/axios/requests direto. SDK em Node e Python estão no roadmap.