---
title: "Set Requirement State"
method: POST
path: "/internal/evals/standards/requirements/{requirement_id}/state"
tags: ["internal", "internal-standards-extraction"]
---

# Set Requirement State

`POST /internal/evals/standards/requirements/{requirement_id}/state`

## Request

- Base URL: `https://api.kobaltlabs.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.kobaltlabs.com/internal/evals/standards/requirements/{requirement_id}/state`
- Auth: none declared

Turn one requirement off, remove it, or put it back.

## Path parameters

- `requirement_id` string, uuid, required

## Query parameters

- `company_id` string, uuid, required: The company whose library to operate on.

## Request body

- SetRequirementStateRequest: Turn a requirement off, remove it, or put it back — or approve a proposal. Neither SUPERSEDED nor PROPOSED is settable — see `REFUSED_STATE_TARGETS` for why, and for the wording each refusal reads out. Blocking a state here says nothing about a requirement that already *is* in it: SUPERSEDED is terminal and `_live_revision_for_write` is what refuses to bring one back, while moving *out* of PROPOSED is exactly what this route is for.
  - `state` 'active' | 'disabled' | 'archived' | 'superseded' | 'proposed', required: Whether a requirement is in the working library, and if not, why not. All of them are recorded as revisions, so every one is reversible and readable. ARCHIVED and SUPERSEDED are deliberately distinct: ARCHIVED is a person deciding this obligation does not apply to them, SUPERSEDED is a newer decomposition of the same guideline taking over. A regeneration must never overwrite the first with the second — that would erase a human decision.
  - `change_note` string, nullable
  - `replaces_requirement_id` string, uuid, nullable

## Response `200`

Successful Response

- GuidelineRequirementResponse
  - `requirement_id` string, uuid, required
  - `file_id` string, uuid, required
  - `filename` string, nullable, required
  - `decomposition_id` string, uuid, nullable, required
  - `guideline_set_id` string, uuid, nullable, required
  - `ordinal` integer, required
  - `revision_number` integer, required
  - `state` 'active' | 'disabled' | 'archived' | 'superseded' | 'proposed', required: Whether a requirement is in the working library, and if not, why not. All of them are recorded as revisions, so every one is reversible and readable. ARCHIVED and SUPERSEDED are deliberately distinct: ARCHIVED is a person deciding this obligation does not apply to them, SUPERSEDED is a newer decomposition of the same guideline taking over. A regeneration must never overwrite the first with the second — that would erase a human decision.
  - `requirement_text` string, required
  - `judging_guidance` string, nullable, required
  - `context` string, nullable, required
  - `collateral_types` MarketingCollateralType[], nullable, required
  - `marketing_team_ids` string[], nullable, required
  - `source_collateral_terms` string[], nullable, required
  - `trigger_terms` string[], required
  - `unresolved_collateral_terms` string[], required
  - `section_label` string, nullable, required
  - `title` string, nullable, required
  - `source_page` integer, nullable, required
  - `citation` GroundedSpan, required: Where a requirement appears to have come from, and how much to trust it.
    - `page_number` integer, required
    - `boxes` BoundingBox[]
      - `x0` number, required
      - `y0` number, required
      - `x1` number, required
      - `y1` number, required
    - `source_text` string, nullable
    - `matched_terms` string[]
    - `score` number
    - `basis` string
    - `cited_page` integer, nullable
    - `refusal` string, nullable
  - `change_kind` 'extracted' | 'edited' | 'disabled' | 'enabled' | 'archived' | 'restored' | 'superseded' | 'proposed' | 'approved', required: What a revision was for. Redundant with comparing a revision to its predecessor, and that is the point: the reason a change was made is the part a diff cannot recover.
  - `change_note` string, nullable, required
  - `updated_at` string, date-time, required
  - `updated_by_email` string, nullable, required
  - `has_human_edits` boolean, required
  - `signal` RequirementSignal: One requirement's track record, as a ranked read reports it. Present only when the list was asked for an `order`; `None` otherwise, so an ordinary library read pays neither the aggregate nor the payload. A row whose requirement has never been checked is absent from a ranked read entirely rather than carrying zeros — there is nothing to rank. **The two halves are in different units and must not be added or compared.** `collateral_checked` and the three `checks_*` count *checks* — one per (evaluation, requirement), which `uq_marketing_requirement_check_once_per_evaluation` guarantees. The `risks_*` count *risks*, and one check can produce several, so `risks_flagged + risks_over_flagged` is not bounded by `checks_failed`. The rates come from the server because the server ordered by them. A client re-deriving them would be a second definition of the number the ranking was built on. `None` means no evidence, which is a different claim from `0.0`.
    - `collateral_checked` integer, required
    - `checks_failed` integer, required
    - `checks_passed` integer, required
    - `checks_not_determined` integer, required
    - `checks_current_revision` integer, required
    - `verdicts` object, required
    - `risks_superseded` integer, required
    - `false_positive_rate` number, nullable, required
    - `dismissal_rate` number, nullable, required
    - `fire_rate` number, nullable, required
  - `downvotes` integer, nullable

## Other responses

- `422`: Validation Error

## Changes

- **2026-09-02** `425d5b8a3c17`: 1 breaking, 3 warning, 4 info
  - response property `decomposition_id` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - added the new `approved` enum value to the `change_kind` response property for the response status `200`
  - added the new `proposed` enum value to the `change_kind` response property for the response status `200`
  - added the new `proposed` enum value to the `state` response property for the response status `200`
  - …4 more

[Operation history](https://skmtc.dev/kobaltlabs/apis/kobaltlabs-api/changes/internal/evals/standards/requirements/:requirement_id/state/post.md)

---

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