---
title: "Preview deterministic draft evaluators against stored evidence"
method: POST
path: "/projects/{projectId}/eval-runs/{runId}/backtest"
tags: ["Eval runs"]
---

# Preview deterministic draft evaluators against stored evidence

`POST /projects/{projectId}/eval-runs/{runId}/backtest`

Requires suite configuration permission and a terminal run. Reserves a 60-second deterministic-preview cooldown, independent of judge previews. Supply the returned continuation object with the unchanged draft to read the next bounded population. Reads at most 100 iterations within a 30-second operation deadline; partial evidence is explicitly ungradable. Runs no model calls and never overwrites original verdicts. Draft assertions explicitly replace, extend, or inherit the frozen rules.

## Path parameters

- `projectId` string, required
- `runId` string, required

## Headers

- `x-mcpjam-eval-vocabulary` '1' | '2'

## Request body

- EvalBacktestDraft
  - `continuation` EvalBacktestContinuation
    - `cursor` string, required
    - `sourceHash` string, required
    - `reservationId` string, required
    - `draftHash` string, required
  - `assertions` object, required
    - `mode` 'replace' | 'extend' | 'inherit', required
    - `list` object[], required
  - `matchOptions` object, nullable — Optional deterministic tool matching options; null omits matching.

## Response `200`

Draft evidence comparison.

- EvalBacktestReport
  - `schemaVersion` unknown, required
  - `sourceRunId` string, required
  - `sourceHash` string, required
  - `draftHash` string, required
  - `configRevision` unknown
  - `complete` boolean, required
  - `continuationAvailable` boolean, required
  - `continuation` EvalBacktestContinuation
    - `cursor` string, required
    - `sourceHash` string, required
    - `reservationId` string, required
    - `draftHash` string, required
  - `counts` object, required
    - `iterations` integer
    - `comparable` integer
    - `ungradable` integer
    - `flipped` integer
  - `differences` object[], required
  - `modelUse` 'none', required

## 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.
- `409` — Run is not terminal or source evidence changed.
- `429` — Per-key rate limit exceeded (60 requests/minute sustained, bursts up to 10). Honor `Retry-After` and back off with jitter.
- `504` — Backtest deadline or cancellation.

## Changes

- **2026-09-14** `56b9d1dda7ea` — 1 info
  - added the new optional `header` request parameter `x-mcpjam-eval-vocabulary`
- **2026-09-14** `2349c6b8a3b8` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/mcpjam/apis/mcpjam-api/changes/projects/:projectId/eval-runs/:runId/backtest/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/49fb945e71f0?raw)
