---
title: "What several separate origins carried in the published window"
method: GET
path: "/api/corroborated"
---

# What several separate origins carried in the published window

`GET /api/corroborated`

## Request

- Base URL: `https://api.signalbureau.ai`
- URL: `https://api.signalbureau.ai/api/corroborated`
- Auth: none declared

The corroboration layer of the maintained record: events in the published window that publishers carried from more than one separate origin. Free, no key, CORS-enabled (`access-control-allow-origin: *`). Each entry carries the claim as its sources state it, the corroboration tier, two exact counts — `publisherCount` (distinct publishers that carried it, after wire copies, republished copies and same-portal duplicates are collapsed) and `originCount` (separate origins left after publishers behind one address, and publishers relaying one named upstream, are collapsed too) — the publishers by name with wires marked, the number of republished copies collapsed, the entities, and the earliest report date when the producing run carries one. The tier is computed from `knownOriginCount` (`originCount` minus `originsUnknownUpstream`): `strong` = carried by publishers from 4 or more separate origins, `moderate` = from 2 or 3. NEITHER COUNT IS EVIDENTIARY INDEPENDENCE: an outlet that names no upstream still counts as its own origin (`originsUnknownUpstream` says how many could not be checked), and many outlets working from one official statement is wide carriage, not verification. The `method` object states the counting rules (`publisher_rule`, `origin_rule`, `aggregator_rule`) and the engine's own words verbatim under `engineMethod`. `knownOriginCount` is the separate origins whose upstream is known, the count the tier stands on. DEPRECATED ALIAS: `independentOrigins` mirrors `knownOriginCount` (identical value, null when the origins were not measured), kept so existing readers do not break and never larger than the count the tier stands on; it is not dependency-aware evidentiary independence — read `publisherCount`, `originCount` and `knownOriginCount`. NO PROBABILITY HERE IS OURS: prediction-market prices appear only where the match was claim-direction verified, and are a cited external sensor; we serve current state, not forecasts. THREE STATES, NEVER TWO: `state` is `measured` (the pass ran — an empty `clusters` list then means nothing cleared the bar) or `cannot-measure` with `cannotMeasureReason` naming which pass failed. A cannot-measure reading is served as a 200, not an error, so a client can distinguish a quiet week from a blind instrument. Rate limits: 30 requests/minute burst per network address and 500/day anonymous (this read spends no model tokens; the limits protect the edge). Cached 10 minutes at the edge.

## Response `200`

The corroborated record for the published window. Served as 200 in both states — read `state` before `clusters`.

- object
  - `schema` string, required: Envelope version tag: sb.corroborated.v1. Additive changes only within a version.
  - `state` 'measured' | 'cannot-measure', required: Whether the corroboration pass could be read. `measured` with an empty clusters list is a real reading (nothing cleared the bar); `cannot-measure` means we could not look.
  - `cannotMeasureReason` string, nullable: Names which pass failed when state is cannot-measure. Null when measured.
  - `asOf` string, required: The date this shard was built.
  - `window` object, nullable: The publication window the corroboration run covers.
    - `start` string
    - `end` string
  - `source` object, nullable: Which artifact was read (`kind`: nightly, or compare-fallback while the nightly artifact is absent) and when it was generated.
  - `method` object, nullable: The counting rules: `publisher_rule` (what publisherCount counts), `origin_rule` (what originCount counts and how the tier is derived from it), `aggregator_rule` (portals), `caveat`, and the engine's own block verbatim under `engineMethod`. `independence_rule` is a DEPRECATED alias of `publisher_rule` with identical text, kept for existing readers; despite its name it describes a publisher count, not evidentiary independence.
  - `marketJoin` string, nullable: States when the prediction-market join was not run for this artifact, rather than leaving the absence unexplained.
  - `counts` object, nullable: clustersTotal, corroborated, published — the denominators behind the list.
  - `tiers` object[]: The tier vocabulary with reader-facing labels, meanings and count rules. Labels describe what was measured (carried by publishers from N separate origins); none asserts independent verification.
  - `clusters` object[], required: The published events, ranked by tier then count.
    - `key` string: Stable cluster key for this event within the run.
    - `claim` string: The claim as its sources state it — HTML entities decoded, never truncated.
    - `claimUrl` string, nullable: Source URL when the run carries one for the representative document.
    - `tier` object: id (`strong` | `moderate`), a reader label that describes what was measured, meaning, rank and countRule. Computed from originCount; never a claim of independent verification.
    - `publisherCount` integer: Distinct publishers that carried this event, after wire copies, republished copies and same-portal duplicates are collapsed. Not a measure of evidentiary independence.
    - `originCount` integer, nullable: Separate origins after publishers behind one canonical address, and publishers relaying one named upstream, are collapsed into one (rule origins@1; three outlets relaying what one named outlet reported count once). The tier is computed from this number. Not dependency-aware evidentiary independence: an outlet that names no upstream still counts as its own origin. Null only on a row from a shard older than the rule.
    - `originsUnknownUpstream` integer, nullable: How many of the counted origins had no readable text beyond a headline, so whether they relay someone else could not be checked. Null when the origin pass did not run.
    - `originState` string: `measured` when originCount was computed from origin chains, otherwise the state that explains why it was not.
    - `knownOriginCount` integer, nullable: Separate origins whose upstream is KNOWN: originCount minus originsUnknownUpstream. The tier stands on this count; origins whose text could not be read are shown in originCount and never counted. Null when the origin chains were not measured (originCount is then only a ceiling).
    - `independentOrigins` integer, nullable: DEPRECATED ALIAS of knownOriginCount — identical value, kept so existing readers do not break, and never larger than the count the tier stands on. Before 2026-10-12 it carried the publisher count, which could read as more support than the tier stood on. Read knownOriginCount, originCount and publisherCount instead.
    - `articles` integer: Documents in the cluster, before collapse.
    - `origins` object[]: The origins by name, each flagged wire / press.
    - `wires` string[]
    - `republishersCollapsed` integer: How many republished copies were collapsed rather than counted as agreement.
    - `earliestDate` string, nullable: Earliest report date among the corroborating documents, when the producing run carries it.
    - `earliestDateReason` string, nullable: Why earliestDate is null — absent field, never inferred from the window.
    - `entities` string[]
    - `entitiesPromoted` object[]: Canonical promoted entities with ids and categories.
    - `market` object, nullable: The matched prediction-market question with its claim-direction alignment flag, or null. A price is only meaningful where claim_aligned is true.
    - `bodyStatus` string: Body-capture reading for this event — our instrument's state, for auditors.

---

[API](https://skmtc.dev/sigb/apis/signal-bureau-api.md) · [All operations](https://skmtc.dev/sigb/apis/signal-bureau-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sigb/apis/signal-bureau-api/revisions/290c9c6ca0d0?raw)
