Veridion Disclosure API · changelog
Every version, dated.
The current version is 1.3.10, served on every response as X-API-Version. Minor and patch versions are additive; a breaking change would be a new major path, announced here first. This list is the one the OpenAPI document carries in its description; the stability policy says what each kind of change may and may not do.
Subscribe: https://www.veridionmarkets.com/data-api/changelog.xml
- 1.3.102026-09-03
- /v1/status gains `pipeline`: attendance of the jobs that produce this API's data (the daily export and House Clerk ingestion), from the cron attendance store: per job, its schedules, state (succeeded, wrote_zero, failed, missed, died, never_ran, running, unevaluated), due and observed slots in the last 24 hours, missed and died counts, the last successful finish, and the latest run with its HTTP status and the route's own error text. A missed, died or never-run job degrades the endpoint by name (`pipeline:<cron>`), as does a failed export run and an unreadable attendance store (`pipeline:attendance`). The block states how many scheduled jobs are instrumented and how many are not.
- 1.3.92026-09-03
- `member.district` is served in one form on every disclosure row, `STATE-N` with N an integer and 0 an at-large seat (`GA-14`, `AK-0`), the form the /v1/members directory has always used, and the schema now declares it. Measured before the change on the serving view (64,677 live versions): 28,370 rows carried a trailing `.0`, 5,227 the canonical form, 1,012 an at-large `-0`, and 3,762 a bare number with no state; those last rows now serve null rather than a district that cannot be placed. district is not a content_hash field, so no hash and no version_id changes.
- 1.3.82026-09-03
- The stability policy is published inside the OpenAPI document (`## Stability policy` in info.description) and on /data-api: what additive means, how a breaking change ships (a new major path, the old one served for at least twelve months), how a deprecation is announced (changelog entry plus `Deprecation` and `Sunset` headers on the affected operation), what `methodology_version` and `content_hash` promise, and how licensed keys are stored, revoked and rotated. A test refuses any operation marked deprecated without both headers declared.
- 1.3.72026-09-03
- /v1/status fails closed on the transparency log: a snapshot generated at or after 2026-09-03T00:36Z (the 1.3.6 deploy) that carries no `merkle_root` degrades the endpoint with check `bulk_export:merkle_root` and the manifest's day, generation, row count and generation time in `measured`. Older manifests stay null without comment; a newer one without a root is a broken promise, reported rather than tolerated.
- MCP server 1.3.1: get_status tells the assistant that `bulk_export.merkle_root` is the day's commitment over every row's content_hash.
- 1.3.62026-09-02
- The daily bulk export manifest carries `merkle_root`: the Merkle root over every row's `content_hash` (leaves in disclosure_id order, sha256 over concatenated child digests, odd node paired with itself), recomputed from the stored bytes before the manifest is written. Published on `/v1/status.bulk_export` with `snapshot_generation` and `content_hash_basis`, and on `/v1/export.snapshot`. Null for snapshots generated before this version. Second layer of the transparency log: one value per snapshot day that a reader recomputes from the export with scripts/verify-disclosure-export.mjs and compares with what Veridion published for that day.
- 1.3.52026-09-02
- MCP server 1.3.0: every tool declares outputSchema, generated from the same Zod contract as the OpenAPI component it adapts, and every successful tools/call returns structuredContent equal to the route's JSON alongside the text block. Error results carry no structuredContent.
- Every served disclosure carries `content_hash`: sha256 over a published canonical array of the government-filing facts and receipt coordinates (basis veridion-disclosure-content-v1). Recompute it to check the calculation; store it to prove later that the same version_id still serves the same content. First layer of the transparency log.
- 1.3.42026-09-02
- /v1/members: `member_id` (exact) and `name` (case-insensitive substring, 2 to 80 characters) filters, so a filer named on a disclosure row or by a person can be resolved in one request instead of paging the directory. The MCP list_members tool accepts the same two.
- /v1/members returns a weak ETag over the directory rows and answers If-None-Match with 304, the same contract the record routes have carried since 1.3.1.
- Every 503 problem response carries Retry-After (minimum 30 seconds unless the route states its own), declared on every documented 503.
- 1.3.32026-09-02
- Every v1 response identifies itself: X-API-Version, X-Request-ID, and X-Veridion-Tier on /v1/coverage, /v1/status, /v1/members, and /v1/openapi.json for free callers as well as licensed ones, on success and on failure; the request id in a problem body equals the header. Declared on every documented response in the OpenAPI document.
- Problem documents carry a stable `code`, and `type` now dereferences: https://www.veridionmarkets.com/data-api/problems/{code} documents every problem the API can return (meaning, who must change what, whether to retry). The previous type host did not resolve.
- /v1/status: congress_public_summary.state gains `unattested` (summary refreshed without a recorded outcome) and its degraded_reasons entry quotes both timestamps; the state word `succeeded` is no longer emitted as a summary state.
- /v1/status: each source carries `index_reconciliation`, the government's own index reconciled against what the API serves (House Clerk PTR search today; null where no readable index exists): documents on the index since a cutoff, parsed, terminal without rows, unaccounted, newest filing date on the index versus newest served, and a sample of unaccounted documents with the recorded reason. Unaccounted documents, an unreadable index, or a reconciliation older than 6 h now degrade the endpoint. Added fail-closed; no threshold widened.
- 1.3.22026-09-02
- Browser clients: every v1 route answers OPTIONS preflight (GET, OPTIONS; Authorization and If-None-Match allowed) and every response exposes ETag, Link, the rate-limit headers, and the request id via Access-Control-Expose-Headers.
- 1.3.12026-09-02
- Record routes (/v1/disclosures, /v1/disclosures/{id}, /history) return a weak ETag over the data-bearing response and answer If-None-Match with 304 Not Modified; paginated responses carry Link: rel="next".
- 1.3.02026-09-01
- GET /v1/disclosures/{disclosure_id}/history: every observed version of one filing, oldest first; amendments never erase their predecessors.
- GET /v1/disclosures: min_delay_days (filed at least N days after the transaction) and within_statutory_window (true|false, judged by each row's own statutory window).
- GET /v1/status: degraded_reasons names every check that pulled the state down, with the measurement behind each.
- MCP: get_disclosure_history tool; read-only tool annotations on all five tools; verify_claim prompt; veridion://openapi and veridion://instructions resources.
- Free responses state their rate-limit policy in X-RateLimit-Limit and X-RateLimit-Policy.
- 1.2.02026-08-27
- Point-in-time reads: as_of returns only rows first observed on or before that instant; updated_since polls change events; signed keyset cursors pin the snapshot.
- coverage.point_in_time_floor is published on every response; as_of below the floor is a typed 400.
- 1.1.02026-08-25
- Every served row is receipt-correspondent: receipt.url, receipt page, and source line number resolve to the government document the row was parsed from.
- 1.0.02026-07-29
- Initial v1: /v1/disclosures, /v1/disclosures/{disclosure_id}, /v1/members, /v1/coverage, /v1/status, /v1/export, and the OpenAPI document.
Dates are the day a version reached production. Questions with a request id go to support@veridionmarkets.com.