Report format
Reports are POSTed as JSON to https://decompilati.onl/api/v1/progress with Authorization: Bearer <API key>.
Full example
{
"unit": "bytes",
"code": { "total": 4194304, "matching": 1887436, "non_matching": 209715 },
"data": { "total": 1048576, "done": 314572 },
"functions": { "total": 2062, "matching": 1734 },
"layout": "treemap",
"commit": "9f2c1e0b7d",
"message": "Match the remaining functions in the title screen",
"areas": [
{
"name": "Engine",
"children": [
{ "name": "Audio", "code": { "total": 524288, "matching": 400000, "non_matching": 50000 } },
{ "name": "Render", "code": { "total": 786432, "matching": 200000, "non_matching": 90000 },
"data": { "total": 65536, "done": 32768 } }
]
},
{
"name": "Hyrule Field",
"description": "Overworld actors and scene code",
"code": { "total": 262144, "matching": 262144, "non_matching": 0 }
}
]
}Fields
| Field | Description |
|---|---|
code.total | Total amount of code. |
code.matching | Code decompiled and matching the original binary. |
code.non_matching | Code decompiled to equivalent but only partially matching source. |
data.total, data.done | Data (tables, assets, strings…) total and decompiled. Optional. |
functions.total, functions.matching | Function counts, shown on the project page and the functions badge. Optional. |
unit | Label for the numbers, e.g. bytes or functions (default bytes). |
areas | Optional areas for the map; see below. |
layout | treemap (default, tiles sized by weight) or grid (equal-size cards). |
commit, message | Optional commit hash and message, shown as the last change. |
version | Optional game version; see below. |
Areas
Areas (or zones) split the game into parts, drawn as a map where each tile fills up with its progress. Each area has a name and optionally a description, code, data, a weight (tile size, defaults to the code total) and nested children, up to 4 levels and 2000 areas in total.
Totals that are missing are summed from the children, and the top-level code and data are summed from the areas when left out.
Versions
Projects that decompile several releases of a game (for example us and europe) can report each one separately with a version field, or ?version= in the URL. Each version keeps its own progress and history, and the project page gets a tab per version. The project's settings choose which version is shown on cards, listings and badges.
Versions are opt-in: reports without a version all go to one unnamed version, and nothing about versions is shown until a project reports two.
Backfilling history
Add ?timestamp= (Unix seconds or RFC 3339) to send a report from the past. Reports older than the current progress are only added to the history graph; the current progress doesn't change. A commit that's already in the history is skipped, so a backfill can be re-run safely. Coming from decomp.dev has an example script.
Query parameters
| Parameter | Description |
|---|---|
version | Game version, for reports that don't include one. |
commit, message | Commit hash and message, for reports that don't include them (objdiff). |
timestamp | When the report was produced, to backfill history. |
format | objdiff to force reading an objdiff report; it's normally detected. |
Limits
- 64 MB per request (after decompression; send
Content-Encoding: gzipto compress). - 120 reports per hour per project, and 3000 per hour for timestamped (backfill) reports.
- Reports identical to the current progress are accepted but not stored.