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.
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:
- Envia o .zip via
POST /v1/upload— recebe umarquivoId. - Chama
POST /v1/decryptcomarquivoId+ chavecfxk_. - Faz polling em
GET /v1/jobs/:ida cada 2-5 segundos. - Quando o status vira done, baixa pelo
downloadUrlna resposta.
POST /v1/decrypt
Cria um trabalho de descriptografia. Aceita JSON.
{
"arquivoId": "a1b2c3d4-...",
"cfxKey": "cfxk_xxxxxxxxxxxxx"
}{
"jobId": "job_2v9k4a...",
"status": "queued"
}POST /v1/repair
Repara modelos .yft, .ydr e .ydd de um resource já descriptografado.
{
"arquivoId": "a1b2c3d4-..."
}{
"jobId": "job_9x8w7v...",
"status": "queued"
}GET /v1/jobs/:id
Consulta o estado de um job. Polling a cada 2-5 segundos.
{
"jobId": "job_2v9k4a...",
"status": "running",
"progresso": 62
}{
"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.
curl -X POST https://api.nex5.com.br/v1/upload \ -H "Authorization: Bearer nx_live_..." \ -F "[email protected]"
{ "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
| status | significado |
|---|---|
queued | Na fila, ainda não começou |
running | Executando; campo progresso vai de 0 a 100 |
done | Concluído; downloadUrl disponível por 24h |
failed | Falhou; ver erro na resposta |
Códigos de erro
| http | code | quando acontece |
|---|---|---|
| 400 | bad_request | Corpo inválido ou campo obrigatório ausente |
| 401 | unauthorized | Cabeçalho Authorization ausente |
| 403 | forbidden | Chave inválida, revogada ou sem plano ativo |
| 404 | not_found | Job ou arquivo não existe (ou expirou) |
| 429 | rate_limited | Cota diária estourada |
| 502 | upstream | Falha temporária no keymaster do FiveM — tente de novo |
Limites
- Upload direto: 2 GB por request
downloadUrldo 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
Não. Ela é usada uma vez por job e descartada imediatamente. Nunca é gravada em disco nem em log.
Sim, mas com token único e expiração em 24h. Depois desse prazo o link para de funcionar.
Ainda não pela API. Se precisar cancelar, abra um ticket no Discord.
Não. Depois que o downloadUrl expira, o arquivo é apagado do storage. Backups seus são responsabilidade sua.
Ainda não. Como a API é HTTP simples, use fetch/axios/requests direto. SDK em Node e Python estão no roadmap.