---
title: "Revoke a gate waiver"
method: DELETE
path: "/projects/{projectId}/eval-runs/{runId}/gate-waivers/{waiverId}"
tags: ["Eval runs"]
---

# Revoke a gate waiver

`DELETE /projects/{projectId}/eval-runs/{runId}/gate-waivers/{waiverId}`

End a waiver early, putting the gate and the GitHub Check Run back. Requires the manage tier.

IDEMPOTENT, and `already_revoked` is a SUCCESS: it reports the ORIGINAL revocation rather than restamping it, so a retry cannot overwrite the record of who actually ended the waiver. An already-expired waiver may still be revoked — the audit trail distinguishes "this was wrong" from "this ran out".

## Path parameters

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

## Headers

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

## Response `200`

The revoked waiver.

- GateWaiverWriteResult — The result of granting or revoking a waiver. `conflict` and `already_revoked` are IDEMPOTENT no-op successes, not failures.
  - `status` 'created' | 'conflict' | 'revoked' | 'already_revoked', required — `conflict` — a waiver was already in force, and `waiver` is that EXISTING one rather than a second row. `already_revoked` — this waiver had already been revoked, and `waiver` reports the original revocation rather than restamping it, so the record of who actually ended it survives a second call.
  - `republishedChecks` integer, required — GitHub Check Runs brought back in line by this write. A published check is a persisted verdict, not a live read, so `0` on a repository with checks connected means the status that gates the merge did not move.
  - `waiver` GateWaiver, required — An audited, time-boxed override of an eval run's release gate. A waiver never changes the run's own `result` — the run keeps its verdict and every surface that honors the waiver says so out loud, which is what makes "no silent waiver" checkable rather than promised.
    - `id` string, required
    - `suiteId` string, required
    - `runId` string, nullable, required — The run this waiver covers. Suite-wide waivers are not honored.
    - `reason` string, required — Why the gate was overridden, as the granter wrote it. Stored UNREDACTED and readable by anyone who can see the suite, for as long as the suite exists — never put secrets, tokens, or customer data in it.
    - `expiresAt` integer, required — Epoch ms. Always in the future when granted, and capped at 30 days out — there is no permanent waiver.
    - `createdAt` integer, required
    - `createdBy` string, required
    - `createdByEmail` string, nullable, required — `null`, never absent, when it cannot be resolved — a deleted user must not make a waiver look authorless.
    - `revokedAt` integer, nullable, required
    - `revokedBy` string, nullable, required
    - `active` boolean, required — Whether it is in force right now — neither revoked nor expired. Computed at read time; a client that must not honor a lapsed waiver should re-derive it from `expiresAt` rather than trust it.
    - `policySnapshot` object, nullable, required — WHAT was overridden, captured at waive time so a later edit to the suite cannot rewrite the record. `null` for a run decided by the v2 verdict policy, whose identity is recorded on the audit event instead — this shape cannot hold it, and filling it in would be a false record rather than an incomplete one.
      - `minimumPassRate` number, required

## Other responses

- `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.

## Changes

- **2026-09-14** `56b9d1dda7ea` — 1 info
  - added the new optional `header` request parameter `x-mcpjam-eval-vocabulary`
- **2026-09-12** `de57cfcdd824` — 1 info
  - added the non-success response with the status `502`
- **2026-08-25** `172afb703db1` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/mcpjam/apis/mcpjam-api/changes/projects/:projectId/eval-runs/:runId/gate-waivers/:waiverId/delete.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/b30ef54cfb5e?raw)
