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

FieldDescription
code.totalTotal amount of code.
code.matchingCode decompiled and matching the original binary.
code.non_matchingCode decompiled to equivalent but only partially matching source.
data.total, data.doneData (tables, assets, strings…) total and decompiled. Optional.
functions.total, functions.matchingFunction counts, shown on the project page and the functions badge. Optional.
unitLabel for the numbers, e.g. bytes or functions (default bytes).
areasOptional areas for the map; see below.
layouttreemap (default, tiles sized by weight) or grid (equal-size cards).
commit, messageOptional commit hash and message, shown as the last change.
versionOptional 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

ParameterDescription
versionGame version, for reports that don't include one.
commit, messageCommit hash and message, for reports that don't include them (objdiff).
timestampWhen the report was produced, to backfill history.
formatobjdiff to force reading an objdiff report; it's normally detected.

Limits

  • 64 MB per request (after decompression; send Content-Encoding: gzip to 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.