---
title: "Export job-level CI costs"
method: GET
path: "/api/export/ci-costs"
tags: ["reviews"]
---

# Export job-level CI costs

`GET /api/export/ci-costs`

## Query parameters

- `format` string — Output format; only json is supported
- `since` string — Inclusive finished_at lower bound (RFC3339 or YYYY-MM-DD)
- `until` string — Exclusive finished_at upper bound (RFC3339 or YYYY-MM-DD; date-only means through that UTC day)
- `limit` integer — Maximum jobs in this page
- `cursor` string — Opaque next_cursor from a previous page. Resumes strictly after its (finished_at, job_id) position and retains the original time bounds; mutually exclusive with since and until.
- `legacy` boolean — Export structurally identified pre-panel CI jobs. Cursors cannot be reused across modes.

## Response `200`

OK

- ExportCICostDocument
  - `$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
  - `jobs` ExportCICostJob[], nullable, required
    - `agent` string, required
    - `cost_usd` number, double, 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
    - `finished_at` string, required
    - `job_uuid` string, required
    - `model` string, nullable, required
    - `provider` string, nullable, required
    - `resume_source_job_uuid` string, nullable, required
    - `role` string, required
    - `status` string, required
  - `legacy` boolean, required
  - `next_cursor` string, nullable, required — Opaque resume cursor emitted when jobs is non-empty.
  - `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 `jobs/items/experiments` to the response with the `200` status
  - added the required property `jobs/items/resume_source_job_uuid` to the response with the `200` status
- **2026-08-07** `fe4e5cad4210` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/kenn-io/apis/roborev/changes/api/export/ci-costs/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)
