---
title: "One public topic record: layered, source-backed current state for a maintained topic (earlier address, still answers)"
method: GET
path: "/api/truth/{topic}"
---

# One public topic record: layered, source-backed current state for a maintained topic (earlier address, still answers)

`GET /api/truth/{topic}`

## Request

- Base URL: `https://api.signalbureau.ai`
- URL: `https://api.signalbureau.ai/api/truth/{topic}`
- Auth: none declared

Permanent alias of `GET /api/record/{topic}` (the canonical address since 2026-10-01): the same handler, the identical body, kept answering forever because callers hold this path in configs we do not control. Serves the public topic record for a maintained topic — the same layered record the exhibit pages render. Free, no key, CORS-enabled (`access-control-allow-origin: *`). The contract is the LAYERS, kept separate so a machine never has to untangle them: primarySources (what authoritative sources state, with receipts), reporting (what current coverage says), coverageMetric (our own attention measurement — our coverage, never the subject's status), market (prediction-market belief, kept as belief, never fact and never advice), judgment (the desk's derived reading over the layers above — analysis labeled as ours, never a probability of ours), consensus (where the layers agree or disagree), and stateHistory (the record over time — never edited after the fact). The envelope carries schema `sb.record.v1` plus `subject` and `asOf`, and `schemaAliases` lists the earlier tag `sb.truth.v1`, permanently; within the version, changes are additive only. Published topics: two full-tier records (`hormuz`, `interest-rates`) plus a standard-tier record for every tracked event with live coverage — an unknown topic's 404 body names the current published list. Unknown or unpublished topics return an honest 404 whose body names what IS published and how to request coverage — never a fabricated record. Rate limits: 30 requests/minute burst per network address (shared egress shares the allowance) and 500/day anonymous (a record read spends no model tokens; limits protect the edge). Edge-cached 10 minutes (`cache-control: public, max-age=600`).

## Path parameters

- `topic` string, required

## Response `200`

The topic record for a published topic.

- object
  - `schema` string, required: Envelope version tag: sb.record.v1. Additive changes only within a version.
  - `schemaAliases` string[]: Every earlier tag this same object answered to (today `sb.truth.v1`). Permanent and append-only: a reader holding an earlier tag finds it here.
  - `subject` string, required: The maintained topic this record is about.
  - `asOf` string, nullable, required: When this state was last verified.
  - `layers` object: The layered content — the layers ARE the contract, kept separate so a machine never has to untangle them. Additional envelope fields (title, tracked, access, attribution) are descriptive and additive.
    - `primarySources` unknown
    - `reporting` unknown
    - `coverageMetric` unknown
    - `market` unknown
    - `judgment` unknown
    - `consensus` unknown
    - `stateHistory` unknown

## Other responses

- `404`: No published topic record for that topic — an honest miss, never a fabricated record. The body names the currently published topics and how to file a coverage request.
- `429`: Over a limit. Every 429 carries a `retry-after` header (seconds — for daily quotas, the time to the midnight-UTC reset); burst 429s also carry `retryAfter` in the body, and daily-quota 429s carry `requiresAuth: true` (the future sign-in hook). On /api/ask a funded key can also meet `error: "draw_ceiling_reached"` — a published ceiling on how much of its BALANCE one key may draw per UTC day (GET /api/tariff, read unit, `balance.daily_draw_ceiling_usd`). It is runaway-loop and stolen-key protection on the RATE, never a claim on the balance: the body carries `dailyDrawCeiling` {usd, reads, rate, resets, why}, `drawnToday`, `balance` {intact: true, remaining}, `owed: 0` and `nextSteps` (wait for the midnight-UTC reset, or ask the desk to raise it on your account). Nothing is drawn on a refused Read, the balance never expires, and what the ceiling holds back today is drawn tomorrow.

---

[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)
