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.
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.
/api/v1/decompileSubmit 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.
| Field | Type | Description |
|---|---|---|
| mode* | string | "address" to fetch bytecode on-chain, or "bytecode" to submit raw runtime bytecode. |
| chain | string | "ethereum" or "bsc". Required in address mode. |
| address | string | Contract address, 0x-prefixed. Address mode only. |
| bytecode | string | Runtime bytecode hex, with or without the 0x prefix (max 512 KB). Bytecode mode only. |
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"
}'{
"ok": true,
"jobId": "a52b602fbf23412a7b83f4b0",
"pollUrl": "/api/v1/jobs/a52b602fbf23412a7b83f4b0"
}/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.
{
"ok": true,
"status": "running", // "queued" | "running"
"elapsedMs": 4210
}{
"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).
/api/v1/mePlan and balance for the presented key.
{
"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
| Status | Meaning |
|---|---|
| 400 | Malformed JSON body, or `mode` is not "address" / "bytecode". |
| 401 | Missing, malformed, or unknown API key. |
| 402 | No credits remaining, or the subscription period has ended. |
| 404 | Unknown job id — or the job belongs to a different API key. |
| 429 | Per-key rate limit exceeded (60 requests/minute on submit endpoints). |
| 503 | The 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.