---
title: "Export finalized CI panel metrics"
method: GET
path: "/api/export/ci-metrics"
tags: ["reviews"]
---

# Export finalized CI panel metrics

`GET /api/export/ci-metrics`

## Query parameters

- `format` string — Output format; only json is supported
- `since` string — Inclusive posted_at lower bound (RFC3339 or YYYY-MM-DD)
- `until` string — Exclusive posted_at upper bound (RFC3339 or YYYY-MM-DD; date-only means through that UTC day)
- `limit` integer — Maximum panels in this page
- `cursor` string — Opaque next_cursor from a previous page. Resumes strictly after its (posted_at, panel_id) position; mutually exclusive with since.
- `legacy` boolean — Export the frozen pre-panel ci_pr_reviews era instead of panel runs. Cursors are namespaced to this mode and cannot be reused across modes.

## Response `200`

OK

- ExportCIMetricsDocument
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `database_id` string, required — Stable identity for the local review database; changes when the database is recreated.
  - `generated_at` string, required
  - `next_cursor` string, nullable, required — Opaque resume cursor emitted when panels is non-empty.
  - `panels` ExportCIPanel[], nullable, required
    - `attempt_count` integer, nullable, required
    - `experiments` ExperimentAssignment[], nullable, required
      - `arm` string, required
      - `definition_hash` string, required
      - `effective_config_hash` string, required
      - `id` string, required
      - `subject_hash` string, required
    - `first_attempt_at` string, nullable, required
    - `github_repo` string, required
    - `head_sha` string, required
    - `jobs` ExportCIPanelJob[], nullable, required
      - `agent` string, required
      - `finished_at` string, nullable, required
      - `job_uuid` string, required
      - `model` string, nullable, required
      - `provider` string, nullable, required
      - `resume_source_job_uuid` string, nullable, required
      - `role` string, required
      - `started_at` string, nullable, required
      - `status` string, required
    - `outcome` string, required
    - `panel_created_at` string, required
    - `posted_at` string, required
    - `pr_number` integer, required
    - `synthesis_agent` string, nullable, required
    - `synthesis_model` string, nullable, required
  - `schema_version` integer, required
  - `tool` string, required
  - `tool_version` string, required
  - `truncated` boolean, required — True when more matching rows are available immediately.
  - `window` ExportReviewsWindow, required
    - `field` string, required
    - `since` string, nullable, required
    - `until` string, nullable, required

## Other responses

- `409` — Cursor database_id does not match this local database
- `default` — Error

## Changes

- **2026-08-26** `9fc133457d16` — 2 info
  - added the required property `panels/items/experiments` to the response with the `200` status
  - added the required property `panels/items/jobs/items/resume_source_job_uuid` to the response with the `200` status
- **2026-07-13** `d13c1c8484a4` — 1 info
  - endpoint added
- **2026-06-09** `538b457f849b` — 1 breaking
  - api path removed without deprecation

[Change history](https://skmtc.dev/kenn-io/apis/roborev/changes/api/export/ci-metrics/get.md)

---

[API](https://skmtc.dev/kenn-io/apis/roborev.md) · [All operations](https://skmtc.dev/kenn-io/apis/roborev/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/kenn-io/roborev/revisions/0dfdca81e88d/schema)
