Send one measurement of a modpack — a load test from a server, a benchmark from a client
It carries what was loaded, what the machine is and what happened, and nothing that names anybody. Envelope schema 3 (benchmark v2) adds versions, figures under metric-registry keys, per-mod costs with intervals and the evidence they are recomputed from; schemas 1 and 2 are still accepted.
POST
/api/v1/perf/runs - Sign-in
- No scope
- Scope
- None
- MCP tool
perf.submit
Parameters
None.
Request body
| Field | Type and meaning |
|---|---|
bench | any |
display | object |
display.height required | integer |
display.width required | integer |
evidence | any |
files | array of string |
hosting | object |
kind required | string |
launcher | string |
loader required | string |
loaderVersion | string |
machine required | object |
machine.calibration | integer |
machine.calibrationVersion | integer |
machine.cores | integer |
machine.cpu | string |
machine.flags | array of string |
machine.gc | string |
machine.gpu | string |
machine.gpuDriver | string |
machine.gpuPci | string |
machine.gpuVendor | string |
machine.heapMb | integer |
machine.java | string |
machine.os | string |
machine.osVersion | string |
machine.ramMb | integer |
machine.storage | string |
machine.threads | integer |
measureVersion | integer |
metrics | map of number |
minecraft required | string |
modCosts | array of object |
modCosts[].ci | array of number |
modCosts[].inVanillaMs | number |
modCosts[].layer required | string |
modCosts[].metric required | string |
modCosts[].modId required | string |
modCosts[].n | integer |
modCosts[].outsideMs | number |
modCosts[].phase | string |
modCosts[].typedMs | number |
modCosts[].value required | number |
mods required | array of object |
mods[].cfFingerprint | integer |
mods[].file | string |
mods[].id required | string |
mods[].lateShare | number |
mods[].modId | string |
mods[].sha1 | string |
mods[].things | integer |
mods[].tickShare | number |
mods[].version | string |
nonce | string |
numbers required | object |
numbers.allocatedMb | integer |
numbers.averageTickMs | number |
numbers.avgFrameMs | number |
numbers.chunks | integer |
numbers.cpuBusiestPct | number |
numbers.emptyTickMs | number |
numbers.entities | integer |
numbers.frames | integer |
numbers.gaveOut | string |
numbers.gcPauseMaxMs | number |
numbers.gcPauseMs | integer |
numbers.gcPauseTotalMs | number |
numbers.gcPauses | integer |
numbers.gpuBusyPct | number |
numbers.heapLiveP90Mb | integer |
numbers.heapMaxMb | integer |
numbers.heapMb | integer |
numbers.heapUsedMb | integer |
numbers.histogram | object |
numbers.histogram.counts required | array of integer |
numbers.histogram.from required | integer |
numbers.histogram.version required | integer |
numbers.loadPerPlayer | integer |
numbers.loadS | number |
numbers.loadVersion | integer |
65 more fields deeper down, in the OpenAPI document.
Response 201
| Field | Type and meaning |
|---|---|
badges | array of string |
codes | array of string |
fingerprint always | string |
hwClass | string |
id | string |
page | string |
runs always | integer |
state | string |
Errors
| Status | Type and meaning |
|---|---|
400 | The request was not understood. |
401 | Sign in and try again. |
404 | There is nothing here, or nothing you may see. |
429 | Too many requests. |
500 | Something on our side went wrong. |
Every error comes back as { code, message, requestId }. Errors