Documentação da API
Última atualização: 3 de novembro de 2026
Usuários Pro (e administradores) podem chamar via HTTP as mesmas engines de ofuscação JSVMP do espaço de trabalho web. As chamadas de API compartilham a cota mensal de execuções com o app web.
1. Criar uma chave de API
Entre, abra Conta e crie uma chave em Chaves de API. As chaves começam com veil_live_ e são exibidas apenas uma vez na criação. Armazenamos apenas um hash e não conseguimos recuperar uma chave; se você a perder, revogue-a e crie uma nova. Cada conta pode manter até 3 chaves ativas. Todas as chaves param de funcionar imediatamente se o plano voltar para Free. A página da conta mostra quando cada chave foi usada pela última vez.
2. Solicitação
POST https://vm.ldvmp.com/api/v1/obfuscate
- Cabeçalho
Authorization: Bearer <sua chave> - Cabeçalho
Content-Type: application/json - Corpo
{ "code": "<código-fonte JavaScript>", "mode": "performance" | "dynamic" }:performanceé a VM de alto desempenho,dynamicé a VM dinâmica - Cada solicitação de API aceita até 2 MB de código-fonte.
3. Resposta
Em caso de sucesso, a API retorna 200:
{
"ok": true,
"output": "/* obfuscated JavaScript */ ...",
"inputBytes": 22,
"outputBytes": 48213,
"ms": 184,
"engine": "performance",
"engineVersion": "…"
}Os cabeçalhos X-Quota-Limit e X-Quota-Remaining informam o limite do mês e as execuções restantes.
4. Erros
Todo erro retorna { "ok": false, "error": "<code>", "message": "<details>" }. Exemplo de cota:
{ "ok": false, "error": "QUOTA_EXCEEDED", "message": "Monthly run limit reached for this plan.",
"limit": 1000, "used": 1000, "remaining": 0, "resetAt": "2026-12-01T00:00:00.000Z" }
| HTTP | error | Significado |
|---|---|---|
| 401 | INVALID_KEY | Chave ausente, malformada, revogada ou desconhecida |
| 403 | PLAN_REQUIRED | O dono da chave não é mais Pro (as chaves param de funcionar imediatamente após um downgrade) |
| 400 | BAD_REQUEST | JSON inválido, code vazio ou mode diferente de performance / dynamic |
| 413 | PAYLOAD_TOO_LARGE | O código-fonte excede 2 MB por solicitação |
| 415 | UNSUPPORTED_MEDIA_TYPE | Content-Type não é application/json |
| 422 | COMPILE_FAILED | Não foi possível compilar o código-fonte (a execução não é cobrada) |
| 429 | QUOTA_EXCEEDED | Execuções mensais esgotadas; a resposta inclui limit / remaining / resetAt |
| 503 | ENGINE_UNAVAILABLE / TIMEOUT | A engine está iniciando ou excedeu o tempo limite |
| 503 | QUOTA_UNAVAILABLE / UNAVAILABLE | O serviço de cota ou de chaves está temporariamente indisponível |
Qualquer 503 pode ser repetido e nenhum é cobrado: aguarde o tempo indicado no cabeçalho Retry-After (em segundos, também no campo JSON retryAfter) e tente novamente | ||
| 500 | INTERNAL_ERROR | Erro inesperado no servidor (a execução não é cobrada); tente novamente mais tarde |
5. Exemplo com curl
curl -X POST https://vm.ldvmp.com/api/v1/obfuscate \
-H "Authorization: Bearer $VEILVM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"code":"console.log(\"hello\")","mode":"performance"}'
6. Exemplo com Node.js
// Node.js 18+ (built-in fetch). Store the key in an environment variable, never in source.
import { readFile, writeFile } from "node:fs/promises";
const code = await readFile("input.js", "utf8");
const response = await fetch("https://vm.ldvmp.com/api/v1/obfuscate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VEILVM_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ code, mode: "dynamic" })
});
const data = await response.json();
if (!data.ok) throw new Error(`${response.status} ${data.error}: ${data.message}`);
await writeFile("output.js", data.output);
console.log(`${data.engine}: ${data.inputBytes} → ${data.outputBytes} bytes in ${data.ms} ms`);
7. Dicas de segurança
- Nunca incorpore uma chave em código do navegador nem faça commit dela em um repositório; guarde-a em uma variável de ambiente no servidor.
- Revogue uma chave na página da conta assim que suspeitar que ela foi exposta.
- Solicitações comuns são processadas em memória, e seu código nunca é gravado em logs. Arquivos grandes são armazenados temporariamente em armazenamento privado e excluídos automaticamente em até 24 horas.