{"openapi":"3.1.0","info":{"title":"unreadable.gg API","version":"2026.10.11-080d243","description":"Decompiles Luau bytecode. Where it can't reproduce the code exactly, it marks the spot or refuses."},"servers":[{"url":"https://api.unreadable.gg"}],"paths":{"/v1/decompile":{"post":{"summary":"Decompile one Luau bytecode file.","description":"The file is at most 2097152 bytes. Send it as it is (options as query parameters) or base64 in JSON.","parameters":[{"name":"inferredTypes","in":"query","required":false,"description":"Print the type annotations unreadable infers beside the ones the bytecode records. `false` keeps only the recorded ones. Only with `application/octet-stream`.","schema":{"type":"string","enum":["true","false"]}},{"name":"stockEnvironment","in":"query","required":false,"description":"Assume the builtins, such as `math` and `string`, are the stock ones while reading the module. Only with `application/octet-stream`.","schema":{"type":"string","enum":["true","false"]}},{"name":"unverifiedWarning","in":"query","required":false,"description":"Add an `unverifiable` note when the output can never be checked by recompiling it. Only with `application/octet-stream`.","schema":{"type":"string","enum":["true","false"]}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"$ref":"#/components/schemas/DecompileRequest"}}}},"responses":{"200":{"description":"The decompile ran, whatever its verdict.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Decompiled"}}}},"400":{"description":"`invalid-json`: The body isn't valid JSON, or isn't a JSON object.\n\n`unknown-field`: A field, option or query parameter the API doesn't know.\n\n`invalid-option`: An option that isn't `true` or `false`.\n\n`invalid-base64`: `bytecode` isn't valid base64.\n\n`missing-bytecode`: The body is empty, or the JSON has no `bytecode`.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["invalid-json","unknown-field","invalid-option","invalid-base64","missing-bytecode"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"401":{"description":"`invalid-key`: An `Authorization` header was sent; no keys exist yet.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["invalid-key"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"402":{"description":"`out-of-credits`: Today's free decompiles are used.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["out-of-credits"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"404":{"description":"`not-found`: No such path.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["not-found"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"405":{"description":"`method-not-allowed`: The path exists but not for this method; see `Allow`.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["method-not-allowed"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"413":{"description":"`too-large`: The file is over the size limit.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["too-large"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"415":{"description":"`unsupported-content-type`: `Content-Type` is missing, or isn't `application/octet-stream` or `application/json`.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["unsupported-content-type"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"422":{"description":"`not-luau-bytecode`: The file isn't Luau bytecode.\n\n`unsupported-version`: Luau bytecode of a version unreadable doesn't read yet.\n\n`damaged-bytecode`: Luau bytecode that ends early or doesn't hold together.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["not-luau-bytecode","unsupported-version","damaged-bytecode"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"429":{"description":"`rate-limited`: Too many requests this minute. Wait the `Retry-After` header's seconds.\n\n`too-many-at-once`: Two decompiles from this connection are already running.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["rate-limited","too-many-at-once"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"500":{"description":"`internal`: Something failed on our side.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["internal"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"503":{"description":"`unavailable`: The decompiler is busy, restarting, or out of capacity for today; see `Retry-After`.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["unavailable"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}},"504":{"description":"`timed-out`: The decompile ran past the time limit.","headers":{"Decompiler-Version":{"schema":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}},"Free-Remaining":{"schema":{"type":"integer","minimum":0}},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"enum":["timed-out"]},"message":{"type":"string"},"field":{"type":"string"}}}}}}}}}}},"/v1/openapi.json":{"get":{"summary":"This document.","responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{}}}}}}},"components":{"schemas":{"Options":{"type":"object","additionalProperties":false,"properties":{"inferredTypes":{"type":"boolean","default":true,"description":"Print the type annotations unreadable infers beside the ones the bytecode records. `false` keeps only the recorded ones."},"stockEnvironment":{"type":"boolean","default":true,"description":"Assume the builtins, such as `math` and `string`, are the stock ones while reading the module."},"unverifiedWarning":{"type":"boolean","default":true,"description":"Add an `unverifiable` note when the output can never be checked by recompiling it."}}},"DecompileRequest":{"type":"object","additionalProperties":false,"required":["bytecode"],"properties":{"bytecode":{"type":"string","contentEncoding":"base64","description":"The compiled file, base64-encoded (standard alphabet, padded, no whitespace)."},"options":{"$ref":"#/components/schemas/Options","description":"Any of the options; each defaults to `true`."}}},"Note":{"type":"object","additionalProperties":false,"required":["code","function","line","message"],"properties":{"code":{"anyOf":[{"enum":["function-refused","spot-marked","decompiler-bug","spelling","unverifiable"]},{"type":"string"}],"description":"New codes may be added; treat one you don't know like `spot-marked`."},"function":{"type":["string","null"]},"line":{"type":["integer","null"]},"message":{"type":"string"},"remedy":{"type":"string"}}},"Decompiled":{"type":"object","additionalProperties":false,"required":["source","verdict","notes","version"],"properties":{"source":{"type":"string"},"verdict":{"enum":["decompiled-unverified","marked","refused"]},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"}},"version":{"type":"string","pattern":"^\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]{7,}(-dirty)?$"}}}}}}