---
title: "Dated shutdown early-warning commitment ledger (no performance score)"
method: GET
path: "/v1/early-warning/commitments"
tags: ["Forecast"]
---

# Dated shutdown early-warning commitment ledger (no performance score)

`GET /v1/early-warning/commitments`

## Request

- Base URL: `https://api.voidly.ai`
- URL: `https://api.voidly.ai/v1/early-warning/commitments`
- Auth: none required

The rows of https://voidly.ai/early-warning/commitments.jsonl, parsed with the page's own strict parser: one malformed row refuses the whole read. A well-formed row naming an arm the parser does not know, or a row of an unknown `record_type`, is left out and counted in `log.skipped_unknown_arm` or `log.skipped_unknown_record_type`. Each commitment row is one forecast issue day, either `committed` (the forecast file's SHA-256 and its comparison arms: the five step-1 arms, or those five plus `hazard_a`) or `missed_zero_alerts` (no committed file; scored as zero alerts; `sha256` null, `arms` empty). Arm-version cutover records (arm, effective instant, pre-registered SHA-256, note) are returned in `cutovers`; a committed row dated before the recorded cutover of an arm it lists is kept and marked `before_cutover`. Label-lane cutover records (`arm: label_lane`, one row per labeling-rules version from v2 on; see the dated records https://voidly.ai/early-warning/label-lane-v1.json to https://voidly.ai/early-warning/label-lane-v4.json) are returned in `lane_cutovers` and are not counted as skipped. A committed hash lets a later-released forecast file be checked against the commitment; it does not prove when the file was issued. This is a commitment ledger with no performance score yet (`performance_score` is null): it makes no accuracy or lead-time claim, and alerts, alert counts and scores are not disclosed. `fetched_at` is when this API read the published file, not when any forecast was issued. `log`, `cutovers` and `lane_cutovers` always describe the whole log; `since` narrows only `commitments` and `returned`. Edge-cached: the first read answers `X-Voidly-Cache: MISS`, then the same document is served for five minutes as `HIT` (`Cache-Control: public, max-age=0, must-revalidate`). For up to one further hour a retained copy may be served as `STALE` with `Cache-Control: no-store` and `Warning: 110` while it refreshes in the background. A missing, redirected, oversized or malformed source with no retained copy answers 503 with `Cache-Control: no-store` and no partial data.

## Query parameters

- `since` string, date

## Response `200`

The commitment ledger with provenance and caveats.

- object
  - `schema` 'voidly.early-warning.commitments-read.v1', required
  - `source_url` string, uri, required
  - `page_url` string, uri, required
  - `protocol_url` string, uri, required
  - `fetched_at` string, date-time, required
  - `performance_score` object, nullable, required: Always null: no performance score is published yet.
  - `caveats` string[], required
  - `log` object, required
    - `rows` integer, required
    - `committed` integer, required
    - `missed_zero_alerts` integer, required
    - `cutovers` integer, required: Cutover records returned in the top-level cutovers array.
    - `lane_cutovers` integer, required: Label-lane cutover records returned in the top-level lane_cutovers array; not counted as skipped.
    - `skipped_unknown_arm` integer, required: Well-formed rows left out because they name an arm this reader does not know.
    - `skipped_unknown_record_type` integer, required: Rows left out because their record_type is a string this reader does not know.
    - `arm_rows_before_cutover` integer, required: Committed rows marked before_cutover.
    - `first_date` string, date, nullable, required
    - `latest_date` string, date, nullable, required
  - `cutovers` object[], required: Arm-version cutover records, unaffected by since. A cutover's SHA-256 does not prove when it was written, and it is not a score.
    - `record_type` 'cutover', required
    - `arm` 'notice_rule' | 'logistic_history' | 'climatology' | 'persistence' | 'random' | 'hazard_a', required
    - `effective_from` string, date-time, required: UTC instant from which this arm version is logged.
    - `pre_registered_sha256` string, required
    - `note` string, required
  - `lane_cutovers` object[], required: Label-lane (labeling rules) cutover records, in log order; one per lane version or withdrawal. Unaffected by since. Not an arm and not a score.
    - `record_type` 'cutover', required
    - `arm` 'label_lane', required
    - `effective_from` string, date-time, required: UTC instant from which this labeling-rules version applies.
    - `pre_registered_sha256` string, required
    - `note` string, required
  - `since` string, date, nullable, required
  - `returned` integer, required
  - `commitments` object[], required
    - `schema` 'x2-d-public-commitment-v1', required
    - `date` string, date, required: Forecast issue day (UTC), not a verified publication timestamp.
    - `status` 'committed' | 'missed_zero_alerts', required
    - `sha256` string, nullable, required: SHA-256 of the forecast file; null on a missed_zero_alerts row.
    - `arms` string[], required: On a committed row, the five step-1 arms, or those five plus hazard_a; empty on a missed_zero_alerts row.
    - `before_cutover` true: Present (true) only on a committed row dated before the recorded cutover of an arm it lists.

## Other responses

- `400`: An unknown query parameter, a repeated since, or a since that is not a real YYYY-MM-DD date.
- `405`: A method this route does not serve answers 405 with Allow: GET.
- `503`: The published source could not be read or failed validation and no retained copy was available. No partial data; Cache-Control: no-store.

## Changes

- **2026-10-24** `491e71a343b6`: 2 info
  - added the required property `lane_cutovers` to the response with the `200` status
  - added the required property `log/lane_cutovers` to the response with the `200` status
- **2026-10-15** `b612f236bcae`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/voidly/apis/voidly-api/changes/v1/early-warning/commitments/get.md)

---

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