Upload a run artifact
Stores one artifact referenced by an ingested run (typically widget HTML too large to send inline) and returns the storageId the run’s results then reference. This is what reportEvalResults in @mcpjam/sdk uses for widget evidence.
The body is the artifact’s raw bytes, sent with the artifact’s own Content-Type. Authenticate like any other /api/v1 route (typically an sk_ key); the gateway swaps in a delegated org-scoped token so the backend’s fail-closed org scoping applies.
The {projectId} segment declares where the artifact belongs. The literal default resolves to the key org’s Default project — the zero-config CI case.
STATUS AND BODY PASS THROUGH VERBATIM: success is the legacy { ok: true, storageId } envelope the SDK reporter parses, not the v1 resource envelope. Bodies are capped at 20 MiB here, and the backend applies its own per-artifact limit.
Authorizations
MCPJam API key (sk_…). Create one at Settings → API keys. Guest sessions cannot use the API, and API keys cannot manage other API keys.
Path Parameters
Project id, or the literal default for the key org's Default project.
Body
The body is of type file.
Response
The backend's response, passed through: { ok: true, storageId }.
The backend's response, passed through verbatim along with its status code. Success shapes are the legacy { ok: true, ... } envelopes the SDK reporter parses — deliberately NOT the v1 resource envelope. Errors are canonical v1 { code, message }.

