---
title: "Upload a run artifact"
method: POST
path: "/projects/{projectId}/eval-ingest/artifacts"
tags: ["Eval runs"]
---

# Upload a run artifact

`POST /projects/{projectId}/eval-ingest/artifacts`

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.

## Path parameters

- `projectId` string, required

## Response `200`

The backend's response, passed through: `{ ok: true, storageId }`.

- EvalIngestResponse — 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 }`.

## Other responses

- `400` — Malformed body or parameters.
- `401` — Missing, invalid, revoked, or orphaned key (`UNAUTHORIZED`) — or the **target MCP server** needs an OAuth grant (`OAUTH_REQUIRED`), which is a property of the server, not your key.
- `403` — Key is valid but not allowed to do this.
- `404` — Unknown project, server, or resource.
- `429` — Per-key rate limit exceeded (60 requests/minute sustained, bursts up to 10). Honor `Retry-After` and back off with jitter.
- `500` — Something failed on MCPJam's side.
- `502` — Could not connect to the target MCP server.
- `504` — The target MCP server connected but didn't respond in time.

## Changes

- **2026-09-25** `04044ef64a5f` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/mcpjam/apis/mcpjam-api/changes/projects/:projectId/eval-ingest/artifacts/post.md)

---

[API](https://skmtc.dev/mcpjam/apis/mcpjam-api.md) · [All operations](https://skmtc.dev/mcpjam/apis/mcpjam-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mcpjam/apis/mcpjam-api/revisions/04044ef64a5f?raw)
