---
title: "Close a shadow evaluation"
method: POST
path: "/api/v1/evaluations/{evaluation_id}/close"
tags: ["canonical"]
---

# Close a shadow evaluation

`POST /api/v1/evaluations/{evaluation_id}/close`

## Request

- Base URL: `https://app.graypass.org` (the document declares no server; this is the origin it was published from)
- URL: `https://app.graypass.org/api/v1/evaluations/{evaluation_id}/close`
- Auth: HTTP bearer

Fix the study cutoff and return the resulting criteria report.

## Path parameters

- `evaluation_id` string, required

## Response `200`

Closed evaluation report with fixed cutoff and final registered-criterion result.

- EvaluationReport: Evaluation configuration, current metrics and registered-criterion results.
  - `action_keys` string[], required: Registered action keys included in the evaluation; the service deduplicates this selection.
  - `checks` object, required: Per-criterion pass/fail results against the recorded thresholds.
  - `created_at` string, required: Creation time as an ISO 8601 timestamp.
  - `ends_at` string, nullable: Timezone-aware ISO 8601 study end, later than starts_at. Creation defaults to 30 days after the start; closing can shorten this cutoff.
  - `id` string, required: Identifier of this record. Treat it as opaque and retain it for subsequent operations.
  - `metrics` EvaluationMetrics, required: Aggregated trace and customer-outcome metrics within the study window. Missing denominators can produce null ratios.
    - `abstention_rate` number, nullable: Fraction of selected decisions carrying decision.insufficient_evidence, or null when the selection is empty.
    - `by_decision` object, required: Counts by decision label.
    - `by_mode` object, required: Counts by action evaluation mode in the selected records.
    - `challenges` integer, required: Count of selected decisions that requested a challenge.
    - `coverage_distribution` object, required: Counts by assurance coverage category.
    - `decision_latency_ms` object, required: Server decision latency summaries in milliseconds; entries may be null when no samples exist.
    - `decisions` integer, required: Number of selected shadow authorization decisions.
    - `experimental_operator_change_indicators` integer, required: Number of selected decisions carrying the operator_change.detected indicator. Interpret with the sample and customer-reviewed outcomes.
    - `false_challenge_proxy` number, nullable: Fraction of challenge decisions whose reported outcome is executed or manually_approved, or null with no challenges. Review individual outcomes to assess whether the challenge was appropriate.
    - `note` string, required: Interpretation limitations supplied with these operational metrics.
    - `outcome_coverage` number, required: Fraction of selected decisions with an outcome, from 0 to 1.
    - `outcomes` object, required: Counts by customer-reported outcome label.
  - `name` string, required: Customer-visible display name for the action or evaluation.
  - `result` 'in_progress' | 'passed' | 'failed', required: passed when all recorded criteria are met; otherwise in_progress for an open study or failed for a closed study. An open study can pass before closure; close it to fix the cutoff.
  - `starts_at` string, required: Timezone-aware ISO 8601 study start. If omitted during creation, the service uses the current time.
  - `status` 'open' | 'closed', required: Lifecycle state of this record; use the operation-specific values listed in the schema.
  - `success_criteria` EvaluationCriteria, required: Thresholds for operational integration metrics used to evaluate the selected shadow decisions.
    - `max_abstention_rate` number: Maximum permitted fraction of selected decisions carrying decision.insufficient_evidence, from 0 to 1; default 0.5.
    - `min_outcome_coverage` number: Minimum fraction of selected decisions with recorded customer outcomes, from 0 to 1; default 0.5.
    - `min_shadow_decisions` integer: Minimum number of selected shadow decisions; default 50.

## Other responses

- `422`: The canonical handler returns a Problem for invalid input; correct the request before retrying.

---

[API](https://skmtc.dev/graypass/apis/graypass-api.md) - [All operations](https://skmtc.dev/graypass/apis/graypass-api/llms.txt) - [OpenAPI document](https://skmtc.dev/graypass/apis/graypass-api/revisions/5f9ab64fdfdb?raw)
