---
title: "Get Run Coverage"
method: GET
path: "/marketing/requirement-coverage/run/{run_id}"
tags: ["marketing-requirement-coverage"]
---

# Get Run Coverage

`GET /marketing/requirement-coverage/run/{run_id}`

Which requirements this analysis read the collateral against, and how each came out.

Grouped by standards document, because that is how a compliance reviewer holds the library in
their head — "we checked it against the brand standards and the card disclosures" — and because
the document is what a citation resolves to.

## Path parameters

- `run_id` string, uuid, required

## Response `200`

Successful Response

- RunRequirementCoverage — Everything one analysis checked, and the arithmetic behind it. `evaluated` is false for every run that did not do a requirement check — a run from before the rollout reached this company, and every run for a company outside it. The shape is the same either way on purpose: a 403 or a different body keyed on the rollout would make a tenant's membership of it visible from the client.
  - `evaluated` boolean
  - `run_id` string, uuid, required
  - `document_id` string, uuid, nullable
  - `checked_at` string, date-time, nullable
  - `guidelines_considered` integer
  - `guidelines_without_library` integer
  - `candidates_total` integer
  - `candidates_checked` integer
  - `counts` CoverageOutcomeCounts — The three ways a checked requirement can come out, never folded into two. `not_determined` is on the wire beside the other two rather than added into either, because a panel that reports "31 passed" while ten of them were rules the model could not judge from what the collateral shows is making a claim nobody measured — and the whole point of this surface is to be believable.
    - `passed` integer
    - `failed` integer
    - `not_determined` integer
  - `exclusions` object
  - `narrowing_skipped` NarrowingSkipped[]
  - `batches_skipped` integer
  - `attachment` 'document' | 'text' — How the collateral was put in front of the judge. Recorded because a verdict reached from the text layer is not the same claim as one reached from the rendered page, and afterwards the two are indistinguishable. A `PASSED` on a rule about a logo, a disclosure's prominence or where a footnote sits means nothing if the model only ever saw extracted text — and `prompt_fingerprint` cannot tell them apart, because the system prompt, the tool and the schema are identical either way.
  - `guidelines` CoverageGuideline[]
    - `file_id` string, uuid, required
    - `filename` string, nullable
    - `upload_id` string, uuid, nullable
    - `counts` CoverageOutcomeCounts, required — The three ways a checked requirement can come out, never folded into two. `not_determined` is on the wire beside the other two rather than added into either, because a panel that reports "31 passed" while ten of them were rules the model could not judge from what the collateral shows is making a claim nobody measured — and the whole point of this surface is to be believable.
      - `passed` integer
      - `failed` integer
      - `not_determined` integer
    - `requirements` CheckedRequirement[]
      - `requirement_id` string, uuid, required
      - `revision_id` string, uuid, required
      - `requirement_text` string, required
      - `section_label` string, nullable
      - `title` string, nullable
      - `source_page` integer, nullable
      - `outcome` 'passed' | 'failed' | 'not_determined', required — What happened when one requirement met one piece of collateral. Stored rather than derived. "We checked 34 requirements and 3 failed" cannot be reconstructed from the risks alone: a requirement that produced no finding is indistinguishable in `document_risks` from one that was never evaluated, and that difference is the whole feature. **`NOT_DETERMINED` is why the model is asked to answer for every rule** rather than only to report failures. Silence has two meanings — "the collateral satisfies this" and "I cannot tell from what the collateral shows" — and a panel that reads the first from the absence of a finding claims a pass the model never gave. The judging contract therefore makes each rule land in exactly one of these three, and a rule the model omits altogether lands here too.
      - `judging_guidance` string, nullable
      - `collateral_types` MarketingCollateralType[], nullable
      - `matched_trigger_terms` string[]
      - `citation` RequirementCitation, required — Where the requirement itself sits in the standards document it came from. A serialized `GroundedSpan` plus the exact version its boxes were measured against. The version is the load-bearing half: the boxes are coordinates in the bytes the decomposition read, so resolving the document any other way draws the highlight in the wrong place on a standard that has since been re-uploaded.
        - `guideline_file_id` string, uuid, required
        - `guideline_filename` string, nullable
        - `guideline_upload_id` string, uuid, nullable
        - `grounding` object, nullable
      - `risk_ids` string[]

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/kobaltlabs/apis/fastapi.md) · [All operations](https://skmtc.dev/kobaltlabs/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/kobaltlabs/fastapi/revisions/425d5b8a3c17/schema)
