API reference

Decompiler API documentation

Decompile any contract on Ethereum or BNB Chain with three endpoints: submit a job, poll it, and read the reconstructed Solidity. Base URL https://decompiler.exvul.com.

Authentication

Every request carries your key as a bearer token. Keys are sold by the Telegram bot — pay with USDT or USDC on Ethereum or BNB Chain and the key is delivered in chat when the payment confirms. Keys are shown once; store them like a password.

Header
Authorization: Bearer evk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

One decompile job costs one credit, charged when the job is accepted. If the run fails, the credit is refunded automatically — you only pay for successful decompilations.

POST/api/v1/decompile

Submit a decompile job. Returns immediately with a job id — the run continues in the background, so heavy contracts never hit proxy timeouts. API jobs run in a priority lane ahead of web traffic.

FieldTypeDescription
mode*string"address" to fetch bytecode on-chain, or "bytecode" to submit raw runtime bytecode.
chainstring"ethereum" or "bsc". Required in address mode.
addressstringContract address, 0x-prefixed. Address mode only.
bytecodestringRuntime bytecode hex, with or without the 0x prefix (max 512 KB). Bytecode mode only.
Request
curl -X POST https://decompiler.exvul.com/api/v1/decompile \
  -H "Authorization: Bearer evk_xxx" \
  -H "content-type: application/json" \
  -d '{
    "mode": "address",
    "chain": "ethereum",
    "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
  }'
202 Accepted
{
  "ok": true,
  "jobId": "a52b602fbf23412a7b83f4b0",
  "pollUrl": "/api/v1/jobs/a52b602fbf23412a7b83f4b0"
}
GET/api/v1/jobs/{id}

Poll a job. Only the key that submitted it can read it. Poll every 2–5 seconds; most contracts finish in seconds, very large ones can take a few minutes. Settled jobs stay readable for 30 minutes.

While running
{
  "ok": true,
  "status": "running",   // "queued" | "running"
  "elapsedMs": 4210
}
Done
{
  "ok": true,
  "status": "done",
  "result": {
    "ok": true,
    "target": {
      "mode": "address",
      "chainId": 1,
      "chainLabel": "Ethereum",
      "address": "0xc02aaa39…",
      "bytecodeBytes": 3124
    },
    "durationMs": 771,
    "artifacts": [
      {
        "name": "exvul.sol",
        "language": "solidity",
        "content": "// decompiled …",
        "bytes": 20480,
        "truncated": false
      }
    ],
    "logs": "…",
    "cached": false
  }
}

When result.ok is false, the credit was refunded — check result.error for the reason (e.g. the address is an EOA, or the contract is not deployed on that chain).

GET/api/v1/me

Plan and balance for the presented key.

200 OK
{
  "ok": true,
  "keyPrefix": "evk_df47",
  "kind": "pack",            // "pack" | "subscription"
  "plan": "pack500",
  "creditsTotal": 500,
  "creditsUsed": 37,
  "creditsRemaining": 463,
  "periodEnd": null          // subscriptions: ISO expiry of the current month
}

Errors & limits

StatusMeaning
400Malformed JSON body, or `mode` is not "address" / "bytecode".
401Missing, malformed, or unknown API key.
402No credits remaining, or the subscription period has ended.
404Unknown job id — or the job belongs to a different API key.
429Per-key rate limit exceeded (60 requests/minute on submit endpoints).
503The job queue is full. Retry after a few seconds.

Failures never cost credits, prepaid packs never expire, and duplicate submissions of an in-flight job share one run at one credit. Need a higher rate limit or custom volume? See plans.