Veridion Disclosure API · reference · 1.3.17

The contract, rendered.

US government financial disclosures with a receipt on every served row. This page is generated from the same OpenAPI document the API serves at /api/v1/openapi.json: 7 operations, 10 response schemas, 430 described fields, 19 problem codes. Nothing on it is typed twice.

Start here

The free tier needs no key: 25 rows per request and 60 requests per hour per IP, stated on every free response as X-RateLimit-Limit and X-RateLimit-Policy. A licensed key raises the page size to 1000 rows; export needs its own scope on the key. Every response carries X-API-Version, X-Request-ID and X-Veridion-Tier.

# Receipt-linked disclosures, oldest observed first; page forward for newer
curl "https://www.veridionmarkets.com/api/v1/disclosures?limit=5"

# One filer's rows, House only, filed this year
curl "https://www.veridionmarkets.com/api/v1/disclosures?member_id=<member_id>&chamber=house&filed_date_from=2026-01-01"

# What the dataset covers, counted from the serving view
curl "https://www.veridionmarkets.com/api/v1/coverage"

# With a licensed key
curl -H "Authorization: Bearer <key>" "https://www.veridionmarkets.com/api/v1/disclosures?limit=1000"

A query parameter the API does not know is a typed 400, never ignored. Every served row names its methodology_version (currently receipt-or-drop-v1) and links its official filing.

Authentication

Bearer token in the Authorization header. Optional for public routes. Evaluator keys are manually provisioned and may read only disclosures, members, coverage, status, and this generated contract. Export requires a distinct scope.

Authorization: Bearer <key>
Key required
GET /api/v1/export

A licensed key is shown once at issuance and stored only as a sha256 hash; Veridion cannot recover it. A key can be revoked at any moment and can carry an expiry. Rotation is a second active key issued for the same license with an expiry set on the first, so both are valid for the rotation window the licensee chooses. Usage records reference a key by its id, never by its value. Request a key from the overview page.

Endpoints

GET /api/v1/disclosures

Key optional · Disclosures · listDisclosures

List receipt-linked disclosure records.

Results use stable keyset pagination ordered by first_observed_at and disclosure_id. Use as_of for point-in-time reconstruction and updated_since for incremental polling. Incremental pages echo page.requested_updated_since and contain both upserts and withdrawals, ordered oldest first. Consumers keep a map keyed by disclosure_id: an upsert replaces the current value; a supersede removes or marks the row withdrawn only when its version_id matches the version held locally. Continue through next_cursor before advancing the saved watermark to page.snapshot_as_of.

ParameterTypeMeaning
tickerquerystring

Ticker symbol, case-insensitive, for example NVDA.

member_idquerystring

Filer slug, for example nancy-pelosi.

person_idquerystring

Official Bioguide person identifier spanning linked tenures.

chamberqueryenumhouse · senate · executive

Branch of government.

source_systemqueryenumhouse_clerk · senate_efd · sec_edgar · oge

Originating government system.

filed_date_fromquerystring (date)

Earliest filing date, inclusive.

filed_date_toquerystring (date)

Latest filing date, inclusive.

transaction_typequeryenumbuy · sell · exchange · other

Direction of the transaction.

transaction_date_fromquerystring (date)

Earliest transaction date, inclusive.

transaction_date_toquerystring (date)

Latest transaction date, inclusive.

min_delay_daysqueryintegermin 0 · max 9007199254740991

Only rows whose filing delay (filed_date minus transaction_date) is at least this many days. The STOCK Act window for periodic transaction reports is 45 days, so min_delay_days=46 returns filings outside it. Rows without a computed delay -- annual reports, and rows missing either date -- are excluded by this filter rather than guessed at.

within_statutory_windowqueryboolean

true returns only rows filed inside the statutory window that applies to that row (statutory_window_days); false returns only rows filed outside it. Unlike min_delay_days, the boundary is each row's own window as served, not a number the caller supplies, so a client keeps working if the window ever differs by filing type or changes in law. Rows with no computed window -- annual reports -- are excluded by either value rather than guessed at.

limitqueryintegermin 1 · max 1000default 25

Rows per page. Free requests are capped at 25; licensed requests are capped at 1000.

cursorquerystring

Opaque cursor from page.next_cursor. Omit to start again.

as_ofquerystring (date-time)

Only rows first observed at or before this instant. Must be on or after response.coverage.point_in_time_floor.

updated_sincequerystring (date-time)

Append-only change events observed strictly after this instant and no later than page.snapshot_as_of. Must be on or after response.coverage.point_in_time_floor. Includes upserts and supersessions.

200
A page of disclosure records.Body: DisclosurePageHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier · Age · Cache-Control · X-Veridion-Cache-Max-Staleness · ETag · Link
304
The data-bearing part of the response matches If-None-Match; no body is returned. Cache headers are those of the equivalent 200.Headers: X-API-Version · X-Request-ID · X-Veridion-Tier · ETag
400 · 401 · 403 · 429 · 503
RFC 9457 problem document with a stable code; see Errors.400One or more query parameters are invalid.401The supplied bearer key is invalid. Omit Authorization to use the free tier.403The supplied key is not scoped for disclosures.429The free-tier request budget was exceeded.503The disclosure warehouse could not be read.
A real 200 response, as embedded in the OpenAPI document
{
  "data": [
    {
      "disclosure_id": "congress-49775610",
      "version_id": "congress-62882008:ccd5fdf5-2167-4790-ad96-39de1a74ed87",
      "content_hash": "c062afb1a43b0ef302b4ffd963cfc509edcebf77485910c97650dacd19103649",
      "identity_basis": "government_filing_facts",
      "change": {
        "type": "upsert",
        "state": "active",
        "observed_at": "2026-08-29T03:13:06.031Z",
        "reason": null
      },
      "member": {
        "member_id": "marjorie-taylor-greene",
        "person_id": "G000596",
        "full_name": "Marjorie Taylor Greene",
        "chamber": "house",
        "party": "Republican",
        "state": "GA",
        "district": "GA-14"
      },
      "asset": {
        "ticker": "NVDA",
        "name": "NVIDIA Corporation - Common Stock",
        "asset_type": "equity",
        "source_code": "ST",
        "description": null
      },
      "transaction": {
        "type": "buy",
        "date": "2024-09-03"
      },
      "filing": {
        "type": "periodic_transaction_report",
        "filed_date": "2024-09-04",
        "delay_days": 1,
        "statutory_window_days": 45,
        "within_statutory_window": true
      },
      "amount": {
        "range_low": 1001,
        "range_high": 15000,
        "currency": "USD",
        "midpoint": 8001,
        "basis": "bounded_range_as_disclosed",
        "verbatim_text": "$1,001 - $15,000"
      },
      "owner": {
        "label": "not_specified_in_filing",
        "determination": "receipt_verified_blank"
      },
      "receipt": {
        "document_id": "20025777",
        "url": "https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2024/20025777.pdf",
        "access": "open",
        "source_system": "house_clerk",
        "content_type": "application/pdf",
        "page": null,
        "retrieved_at": "2026-07-18T15:33:51.743Z"
      },
      "provenance": {
        "source_line_number": 63,
        "parsed_at": "2026-08-28T13:30:53.141Z",
        "parser_version": "house-ptr-line-v2",
        "methodology_version": "receipt-or-drop-v1",
        "source_ingested_at": "2026-07-18T15:33:51.743Z",
        "first_observed_at": "2026-07-18T15:33:51.743Z"
      }
    }
  ],
  "coverage": {
    "rows_returned": 1,
    "rows_dropped_failed_validation": 0,
    "as_of": "2026-09-03T17:25:03.627Z",
    "requested_as_of": null,
    "point_in_time": false,
    "point_in_time_floor": "2026-08-30T00:04:57.489Z",
    "out_of_range": false,
    "served_at": "2026-09-03T18:32:01.236Z",
    "basis": "Rows Veridion retrieved from the official government source. Rows obtained from commercial providers are excluded at the database view, not filtered in application code."
  },
  "page": {
    "limit": 1,
    "has_more": true,
    "next_cursor": "<opaque signed cursor, 200 to 400 characters; pass it back verbatim as ?cursor=>",
    "mode": "snapshot",
    "requested_updated_since": null,
    "snapshot_as_of": "2026-09-03T17:25:03.627Z",
    "snapshot_generation": 613
  },
  "access": {
    "tier": "free",
    "max_rows_per_request": 25,
    "requests_per_hour": 60,
    "no_key_required": true,
    "upgrade": {
      "max_rows_per_request": 1000,
      "request_a_key": "https://www.veridionmarkets.com/data-api"
    }
  },
  "cache": {
    "policy": "public",
    "browser_max_age_seconds": 0,
    "cdn_max_age_seconds": 300,
    "declared_max_staleness_seconds": 300,
    "age_header": "Age",
    "freshness_reference": {
      "source": "congress",
      "source_expected_max_age_seconds": 21600,
      "delivery_max_staleness_seconds": 300,
      "delivery_to_source_threshold_ratio": "1/72",
      "basis": "The declared 300-second shared-cache bound is exactly 1/72 of the 21,600-second Congress operational freshness threshold. The Age response header reports the current response age when the CDN serves a cached copy."
    }
  },
  "version": "1.3.17",
  "notice": "Amounts are the bounded ranges as disclosed in the filings. Veridion infers no motive and makes no recommendation. Identification data, not investment advice."
}

GET /api/v1/disclosures/{disclosure_id}/history

Key optional · Disclosures · getDisclosureHistory

Get every observed version of a disclosure, oldest first.

The change stream is append-only: a restatement supersedes rather than overwrites, so amendments never erase their predecessors. This returns the full observed sequence for one permanent disclosure_id, each entry with its own change block and version_id. restated=true states that content changed after first publication; no motive is inferred.

ParameterTypeMeaning
disclosure_idrequiredpathstring

Permanent disclosure identifier returned by this API.

200
Every observed version, oldest first; the last entry is current.Body: DisclosureHistoryHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier · Age · Cache-Control · X-Veridion-Cache-Max-Staleness · ETag
304
The data-bearing part of the response matches If-None-Match; no body is returned. Cache headers are those of the equivalent 200.Headers: X-API-Version · X-Request-ID · X-Veridion-Tier · ETag
400 · 401 · 403 · 404 · 429 · 503
RFC 9457 problem document with a stable code; see Errors.400The disclosure identifier is malformed or a query parameter is unsupported.401The supplied bearer key is invalid. Omit Authorization to use the free tier.403The supplied key is not scoped for disclosures.404No active or withdrawn record in the permanent v1 disclosure_id namespace has ever used this identifier.429The free-tier request budget was exceeded.503The disclosure warehouse could not be read.
A real 200 response, as embedded in the OpenAPI document
{
  "data": [
    {
      "disclosure_id": "congress-49775610",
      "version_id": "congress-62882008:ccd5fdf5-2167-4790-ad96-39de1a74ed87",
      "content_hash": "c062afb1a43b0ef302b4ffd963cfc509edcebf77485910c97650dacd19103649",
      "identity_basis": "government_filing_facts",
      "change": {
        "type": "upsert",
        "state": "active",
        "observed_at": "2026-08-29T03:13:06.031Z",
        "reason": null
      },
      "member": {
        "member_id": "marjorie-taylor-greene",
        "person_id": "G000596",
        "full_name": "Marjorie Taylor Greene",
        "chamber": "house",
        "party": "Republican",
        "state": "GA",
        "district": "GA-14"
      },
      "asset": {
        "ticker": "NVDA",
        "name": "NVIDIA Corporation - Common Stock",
        "asset_type": "equity",
        "source_code": "ST",
        "description": null
      },
      "transaction": {
        "type": "buy",
        "date": "2024-09-03"
      },
      "filing": {
        "type": "periodic_transaction_report",
        "filed_date": "2024-09-04",
        "delay_days": 1,
        "statutory_window_days": 45,
        "within_statutory_window": true
      },
      "amount": {
        "range_low": 1001,
        "range_high": 15000,
        "currency": "USD",
        "midpoint": 8001,
        "basis": "bounded_range_as_disclosed",
        "verbatim_text": "$1,001 - $15,000"
      },
      "owner": {
        "label": "not_specified_in_filing",
        "determination": "receipt_verified_blank"
      },
      "receipt": {
        "document_id": "20025777",
        "url": "https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2024/20025777.pdf",
        "access": "open",
        "source_system": "house_clerk",
        "content_type": "application/pdf",
        "page": null,
        "retrieved_at": "2026-07-18T15:33:51.743Z"
      },
      "provenance": {
        "source_line_number": 63,
        "parsed_at": "2026-08-28T13:30:53.141Z",
        "parser_version": "house-ptr-line-v2",
        "methodology_version": "receipt-or-drop-v1",
        "source_ingested_at": "2026-07-18T15:33:51.743Z",
        "first_observed_at": "2026-07-18T15:33:51.743Z"
      }
    }
  ],
  "history": {
    "disclosure_id": "congress-49775610",
    "event_count": 1,
    "first_observed_at": "2026-08-29T03:13:06.031Z",
    "latest_observed_at": "2026-08-29T03:13:06.031Z",
    "current_state": "active",
    "restated": false,
    "events_truncated": false
  },
  "access": {
    "tier": "free",
    "max_rows_per_request": 25,
    "requests_per_hour": 60,
    "no_key_required": true,
    "upgrade": {
      "max_rows_per_request": 1000,
      "request_a_key": "https://www.veridionmarkets.com/data-api"
    }
  },
  "cache": {
    "policy": "public",
    "browser_max_age_seconds": 0,
    "cdn_max_age_seconds": 300,
    "declared_max_staleness_seconds": 300,
    "age_header": "Age",
    "freshness_reference": {
      "source": "congress",
      "source_expected_max_age_seconds": 21600,
      "delivery_max_staleness_seconds": 300,
      "delivery_to_source_threshold_ratio": "1/72",
      "basis": "The declared 300-second shared-cache bound is exactly 1/72 of the 21,600-second Congress operational freshness threshold. The Age response header reports the current response age when the CDN serves a cached copy."
    }
  },
  "version": "1.3.17",
  "notice": "Versions are listed in observation order; the last entry is the current state. restated=true states that content changed after first publication and nothing more. Amounts are bounded ranges as disclosed; no motive is inferred."
}

GET /api/v1/disclosures/{disclosure_id}

Key optional · Disclosures · getDisclosureById

Get a disclosure by its permanent identifier.

Returns the latest state for a permanent disclosure_id. A withdrawn row returns 200 with change.state withdrawn, its withdrawal timestamp, and a reason; identifiers are never reused and withdrawals never become a silent 404.

ParameterTypeMeaning
disclosure_idrequiredpathstring

Permanent disclosure identifier returned by this API.

200
The latest active or withdrawn disclosure state.Body: DisclosureLookupHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier · Age · Cache-Control · X-Veridion-Cache-Max-Staleness · ETag
304
The data-bearing part of the response matches If-None-Match; no body is returned. Cache headers are those of the equivalent 200.Headers: X-API-Version · X-Request-ID · X-Veridion-Tier · ETag
400 · 401 · 403 · 404 · 429 · 503
RFC 9457 problem document with a stable code; see Errors.400The disclosure identifier is malformed or a query parameter is unsupported.401The supplied bearer key is invalid. Omit Authorization to use the free tier.403The supplied key is not scoped for disclosures.404No active or withdrawn record in the permanent v1 disclosure_id namespace has ever used this identifier.429The free-tier request budget was exceeded.503The disclosure warehouse could not be read.
A real 200 response, as embedded in the OpenAPI document
{
  "data": {
    "disclosure_id": "congress-49775610",
    "version_id": "congress-62882008:ccd5fdf5-2167-4790-ad96-39de1a74ed87",
    "content_hash": "c062afb1a43b0ef302b4ffd963cfc509edcebf77485910c97650dacd19103649",
    "identity_basis": "government_filing_facts",
    "change": {
      "type": "upsert",
      "state": "active",
      "observed_at": "2026-08-29T03:13:06.031Z",
      "reason": null
    },
    "member": {
      "member_id": "marjorie-taylor-greene",
      "person_id": "G000596",
      "full_name": "Marjorie Taylor Greene",
      "chamber": "house",
      "party": "Republican",
      "state": "GA",
      "district": "GA-14"
    },
    "asset": {
      "ticker": "NVDA",
      "name": "NVIDIA Corporation - Common Stock",
      "asset_type": "equity",
      "source_code": "ST",
      "description": null
    },
    "transaction": {
      "type": "buy",
      "date": "2024-09-03"
    },
    "filing": {
      "type": "periodic_transaction_report",
      "filed_date": "2024-09-04",
      "delay_days": 1,
      "statutory_window_days": 45,
      "within_statutory_window": true
    },
    "amount": {
      "range_low": 1001,
      "range_high": 15000,
      "currency": "USD",
      "midpoint": 8001,
      "basis": "bounded_range_as_disclosed",
      "verbatim_text": "$1,001 - $15,000"
    },
    "owner": {
      "label": "not_specified_in_filing",
      "determination": "receipt_verified_blank"
    },
    "receipt": {
      "document_id": "20025777",
      "url": "https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2024/20025777.pdf",
      "access": "open",
      "source_system": "house_clerk",
      "content_type": "application/pdf",
      "page": null,
      "retrieved_at": "2026-07-18T15:33:51.743Z"
    },
    "provenance": {
      "source_line_number": 63,
      "parsed_at": "2026-08-28T13:30:53.141Z",
      "parser_version": "house-ptr-line-v2",
      "methodology_version": "receipt-or-drop-v1",
      "source_ingested_at": "2026-07-18T15:33:51.743Z",
      "first_observed_at": "2026-07-18T15:33:51.743Z"
    }
  },
  "lookup": {
    "disclosure_id": "congress-49775610",
    "state": "active",
    "withdrawn_at": null,
    "withdrawal_reason": null
  },
  "access": {
    "tier": "free",
    "max_rows_per_request": 25,
    "requests_per_hour": 60,
    "no_key_required": true,
    "upgrade": {
      "max_rows_per_request": 1000,
      "request_a_key": "https://www.veridionmarkets.com/data-api"
    }
  },
  "cache": {
    "policy": "public",
    "browser_max_age_seconds": 0,
    "cdn_max_age_seconds": 300,
    "declared_max_staleness_seconds": 300,
    "age_header": "Age",
    "freshness_reference": {
      "source": "congress",
      "source_expected_max_age_seconds": 21600,
      "delivery_max_staleness_seconds": 300,
      "delivery_to_source_threshold_ratio": "1/72",
      "basis": "The declared 300-second shared-cache bound is exactly 1/72 of the 21,600-second Congress operational freshness threshold. The Age response header reports the current response age when the CDN serves a cached copy."
    }
  },
  "version": "1.3.17",
  "notice": "A withdrawn disclosure remains queryable under its permanent identifier. Amounts are bounded ranges as disclosed; no motive is inferred."
}

GET /api/v1/coverage

Key optional · Coverage · getCoverage

Get measured coverage and source provenance.

No parameters. Unrecognized query parameters are rejected with a typed 400.

200
Coverage and provenance counts.Body: PublicCoverageHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier
400 · 401 · 403
RFC 9457 problem document with a stable code; see Errors.400This endpoint accepts no query parameters.401The supplied bearer key is invalid.403The supplied key is not scoped for coverage.

GET /api/v1/members

Key optional · Members · listMembers

List filers with identity and row coverage.

ParameterTypeMeaning
chamberqueryenumhouse · senate · executive

Branch of government.

statequerystring

Two-letter state code.

bioguidequerystring

Official Bioguide identifier.

member_idquerystring

Exact filer identifier as it appears on a served disclosure row's member.member_id, for example nancy-pelosi. Returns that filer's directory entry or an empty page; never a near match.

namequerystring

Case-insensitive substring of the filer's full name, for example pelosi or Gottheimer. Matches the name as filed; a client resolving a person should confirm with bioguide or member_id before using the result.

200
Filer directory.Body: MemberDirectoryPageHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier · Age · Cache-Control · X-Veridion-Cache-Max-Staleness · ETag
304
The data-bearing part of the response matches If-None-Match; no body is returned. Cache headers are those of the equivalent 200.Headers: X-API-Version · X-Request-ID · X-Veridion-Tier · ETag
503
The filer directory could not be read.Body: LegacyError
400 · 401 · 403
RFC 9457 problem document with a stable code; see Errors.400A query parameter is invalid or unsupported.401The supplied bearer key is invalid.403The supplied key is not scoped for members.
A real 200 response, as embedded in the OpenAPI document
{
  "data": [
    {
      "member_id": "nancy-pelosi",
      "identity": {
        "bioguide": "P000197",
        "system": "us_congress_bioguide",
        "note": null
      },
      "full_name": "Nancy Pelosi",
      "chamber": "house",
      "party": "Democrat",
      "state": "CA",
      "district": "CA-11",
      "coverage": {
        "disclosures_available": 175,
        "filings_pending_receipt": 0,
        "filings_pending_qualification": 40,
        "latest_filed_date": "2026-06-23",
        "average_filing_delay_days": 30
      }
    }
  ],
  "count": 1,
  "identity_join": "measured",
  "served_at": "2026-09-03T18:33:46.051Z",
  "cache": {
    "policy": "public",
    "browser_max_age_seconds": 0,
    "cdn_max_age_seconds": 300,
    "declared_max_staleness_seconds": 300,
    "age_header": "Age",
    "freshness_reference": {
      "source": "congress",
      "source_expected_max_age_seconds": 21600,
      "delivery_max_staleness_seconds": 300,
      "delivery_to_source_threshold_ratio": "1/72",
      "basis": "The declared 300-second shared-cache bound is exactly 1/72 of the 21,600-second Congress operational freshness threshold. The Age response header reports the current response age when the CDN serves a cached copy."
    }
  },
  "version": "1.3.17",
  "notice": "Directory of filers with disclosures in the licensable warehouse. Coverage counts include only receipt-qualified rows; pending counts are published rather than hidden. Identification data, not investment advice."
}

GET /api/v1/export

Key required · Exports · getBulkExport

Get the latest licensed bulk snapshot manifest.

No parameters. Unrecognized query parameters are rejected with a typed 400.

200
Snapshot manifest and signed download URL.Body: ExportManifestHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier
400 · 401 · 403 · 404 · 503
RFC 9457 problem document with a stable code; see Errors.400This endpoint accepts no query parameters.401Request a key at /data-api and send it as Authorization: Bearer <key>.403The supplied key is not scoped for export.404No snapshot has been generated yet.503The manifest or signed URL could not be produced.
A real 200 response, as embedded in the OpenAPI document
{
  "snapshot": {
    "snapshot_day": "2026-09-03",
    "generated_at": "2026-09-03T14:13:02.729Z",
    "snapshot_as_of": "2026-09-03T14:11:34.218Z",
    "snapshot_generation": 574,
    "row_count": 64708,
    "source_row_count": 64708,
    "rows_dropped_failed_validation": 0,
    "duplicate_row_count": 0,
    "byte_size": 7945039,
    "sha256": "8147439394800b8da94684e0f3b4f9086aadcfad6e64b5277d784c557ceb3af5",
    "merkle_root": "147e8c24067968874ebf6844c6025c046c0ee989def938d915f38cd1a0e96b64",
    "content_hash_basis": "veridion-disclosure-content-v1",
    "methodology_version": "receipt-or-drop-v1",
    "artifact_verified_at": "2026-09-03T14:13:02.729Z",
    "format": "ndjson+gzip",
    "schema": "https://www.veridionmarkets.com/api/v1/openapi.json#/components/schemas/Disclosure"
  },
  "download": {
    "url": "https://storage.veridionmarkets.com/disclosure-api-exports/snapshots/2026-09-03/disclosures-2026-09-03.ndjson.gz",
    "expires_in_seconds": 3600
  },
  "integrity": "Verify: sha256(download) must equal snapshot.sha256. A mismatch means a corrupted transfer, never a silently different dataset, regenerated snapshots always carry a new manifest. When snapshot.merkle_root is set, scripts/verify-disclosure-export.mjs <file> --sha256 <sha256> --root <merkle_root> recomputes every row's content_hash and the root with no network.",
  "version": "1.3.17"
}

GET /api/v1/status

Key optional · Status · getStatus

Get measured source and bulk-snapshot state.

No parameters. Unrecognized query parameters are rejected with a typed 400.

200
Current measured state.Body: PublicStatusHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier
503
The status tables could not be read.Body: PublicStatusHeaders: X-API-Version · X-Request-ID · X-Veridion-Tier
400 · 401 · 403
RFC 9457 problem document with a stable code; see Errors.400This endpoint accepts no query parameters.401The supplied bearer key is invalid.403The supplied key is not scoped for status.

Workflows

Paginate

Pages are keyset, ordered by first_observed_at then disclosure_id. Follow page.next_cursor (or the Link header, rel="next") until page.has_more is false. A cursor is signed and bound to the query that issued it, so a page cannot be continued under different filters. Send the ETag back as If-None-Match to receive 304 when the data-bearing part of a page has not changed.

cursor=$(curl -s "https://www.veridionmarkets.com/api/v1/disclosures?ticker=NVDA&limit=25" | jq -r .page.next_cursor)
curl "https://www.veridionmarkets.com/api/v1/disclosures?ticker=NVDA&limit=25&cursor=$cursor"

Read the record as it stood at an instant

Add as_of (RFC 3339, up to six fractional digits) to any list request and the response is what was served at that instant, with page.snapshot_as_of naming the generation that answered. Point-in-time history grows from a fixed retained-history floor, not a rolling retention window; GET /api/v1/status publishes temporal_window.point_in_time_floor and unrounded depth_days at measured_at, and no payload history before that floor is reconstructed. A single disclosure's full sequence of versions is at /api/v1/disclosures/{disclosure_id}/history.

The change stream is append-only: a restatement supersedes rather than overwrites, so amendments never erase their predecessors. This returns the full observed sequence for one permanent disclosure_id, each entry with its own change block and version_id. restated=true states that content changed after first publication; no motive is inferred.

curl "https://www.veridionmarkets.com/api/v1/disclosures?member_id=<member_id>&as_of=2026-09-01T00:00:00Z"
curl "https://www.veridionmarkets.com/api/v1/disclosures/<disclosure_id>/history"

Stay current without re-reading everything

Results use stable keyset pagination ordered by first_observed_at and disclosure_id. Use as_of for point-in-time reconstruction and updated_since for incremental polling. Incremental pages echo page.requested_updated_since and contain both upserts and withdrawals, ordered oldest first. Consumers keep a map keyed by disclosure_id: an upsert replaces the current value; a supersede removes or marks the row withdrawn only when its version_id matches the version held locally. Continue through next_cursor before advancing the saved watermark to page.snapshot_as_of.

# First run: page to exhaustion, then save page.snapshot_as_of as the watermark
curl "https://www.veridionmarkets.com/api/v1/disclosures?limit=25"

# Every later run: only what changed since the watermark, oldest first
curl "https://www.veridionmarkets.com/api/v1/disclosures?updated_since=<watermark>"

Take the whole corpus and prove it

Get the latest licensed bulk snapshot manifest. returns a manifest and a signed download URL for the day's snapshot (ndjson+gzip). The manifest states the row count, the rows dropped by validation, the artifact's sha256 and a merkle_root over every row's content_hash. Recompute both from the bytes you received; if either differs, the file is not the one Veridion published.

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. Null for a snapshot generated before 1.3.6. Verify with scripts/verify-disclosure-export.mjs --sha256 <sha256> --root <merkle_root>.

curl -H "Authorization: Bearer <key>" "https://www.veridionmarkets.com/api/v1/export"

Response fields

Every response schema declares additionalProperties: false; a field that is not listed here is not served. Open a schema to read each field's meaning as the contract states it.

DisclosurePage98 fields · GET /api/v1/disclosures
FieldTypeMeaning
dataarray
data[].disclosure_idstring

Permanent identifier for the filing-derived transaction. It is never reused; parser versions and restatements retain this identifier.

data[].version_idstring

Immutable parse-generation identifier. Use disclosure_id, not version_id, for downstream identity across a restatement.

data[].content_hashstring

sha256, hex, of the canonical JSON array ["veridion-disclosure-content-v1", disclosure_id, version_id, member.member_id, member.full_name, member.chamber, asset.ticker, asset.name, asset.asset_type, asset.source_code, asset.description, transaction.type, transaction.date, filing.type, filing.filed_date, amount.range_low, amount.range_high, amount.verbatim_text, owner.label, owner.determination, receipt.document_id, receipt.url, receipt.source_system, receipt.page, provenance.source_line_number] using the served values exactly (null where null). Recompute it from this row to check the calculation; store it to check later that the same version_id still serves the same content. Derived fields (delay_days, statutory window, midpoint), timestamps, parser and methodology versions, and the change block are excluded, so a corrected derivation rule does not change the hash of an unchanged filing. The basis label changes if the field list ever changes.

data[].identity_basisenumgovernment_filing_facts

Identity uses only filer, document, filed instrument, transaction date and type, amount range, and owner. Parser line, span, version, and run identifiers are excluded.

data[].changeobject

Full pulls contain upserts. updated_since also emits supersede events; remove the row only when version_id matches the version held locally. A withdrawn stable identifier remains directly retrievable with its reason.

data[].change.typeenumupsert · supersede

upsert: this version is the one to hold. supersede: a version you may hold has been replaced, and is only emitted on updated_since reads.

data[].change.stateenumactive · withdrawn

active: served in snapshot reads. withdrawn: no longer served in snapshots but still directly retrievable by disclosure_id, with reason set.

data[].change.observed_atstring (date-time)

When Veridion observed the event this row reports (the version's first observation for an upsert; the supersession instant for a supersede).

data[].change.reasonstring | null

Why a row was withdrawn or superseded, when the pipeline recorded one; null for an ordinary upsert. States the mechanism, never a motive.

data[].memberobject

The filer, resolved against the congressional directory where a match exists. Identity fields only; what the filing itself says is in the receipt.

data[].member.member_idstring

Veridion's stable identifier for the filer, the same value /v1/members/{member_id} resolves and the member_id= filter takes. Derived from the name as filed; it does not change across filings or restatements.

data[].member.person_idstring | null

The filer's official Bioguide ID (for example G000596) where the congressional directory has one; null for executive-branch filers and for congressional filers the directory could not match. Never invented.

data[].member.full_namestring

The filer's name from the official directory where matched; otherwise the name as it appears on the filing with honorifics (Hon., Sen., Rep.) removed.

data[].member.chamberenumhouse · senate · executive

house or senate from the office that published the receipt; executive for Office of Government Ethics filers.

data[].member.partystring | null

Democrat, Republican or Independent, from the congressional directory's D, R or I; null when the directory records none and for every executive-branch filer.

data[].member.statestring | null

Two-letter state of the seat, as recorded in the congressional directory; null for executive-branch filers.

data[].member.districtstring | null

House district as STATE-N with N an integer and 0 an at-large seat (GA-14, AK-0); null for senators, executive-branch filers, and rows whose filing does not state one. The same form the /v1/members directory uses.

data[].assetobject

The instrument as the filing names it, classified from the office's own asset code. Nothing is resolved against a securities master; a ticker is served only when the filing states one.

data[].asset.tickerstring | null

The ticker as it appears on the filing, upper-cased; null when the filing states none (most OGE lines, bonds, funds without a symbol, and paper filings whose ticker column is blank). Not looked up or inferred from the asset name.

data[].asset.namestring

The asset as named on the filing, whitespace collapsed. If the filing names nothing but gives a ticker, the ticker; if it gives neither, the literal "Disclosed asset" so the row is not silently dropped.

data[].asset.asset_typeenumequity · etf · municipal_bond · corporate_bond · government_security · option · fund · partnership · crypto · other

Classified from the office's own asset code on congressional filings: ST equity, OP option, MF and EF fund, GS government_security, PS partnership, CT crypto, anything else other. OGE lines carry equity, fund or other. etf, municipal_bond and corporate_bond are reserved in the enum and produced by no current source.

data[].asset.source_codestring | null

The asset code exactly as the office recorded it (ST, OP, MF, EF, GS, PS, CT and others), upper-cased; the input to asset_type. Null when the source carries none.

data[].asset.descriptionstring | null

Free-text description from the filing's asset line when the office publishes one separately from the name; null otherwise. Never composed by Veridion.

data[].transactionobject

What was done and on what date, as stated on the filing.

data[].transaction.typeenumbuy · sell · exchange · other

buy from a P code or a purchase/buy label; sell from an S code or a sale/sell label; exchange from an E code or an exchange label; other for anything the filing marks differently. Partial versus full sale is not distinguished here; the filing's own wording is in amount.verbatim_text and the receipt.

data[].transaction.datestring (date)

The transaction date as stated on the filing. Not the filing date, and not adjusted for weekends or holidays.

data[].filingobject

The report this row was parsed from and its timing against the STOCK Act's 45-day transaction window, computed from the two dates on the filing.

data[].filing.typeenum | nullperiodic_transaction_report · annual_report

periodic_transaction_report for House Clerk and Senate eFD PTRs and OGE Form 278-T; annual_report for OGE Form 278e; null when the receipt URL matches no known form pattern. Determined from the office and receipt, not from the row's text.

data[].filing.filed_datestring (date)

The date the office records the report as filed. The STOCK Act window and delay_days are measured to this date.

data[].filing.delay_daysinteger | null

filed_date minus transaction.date, in whole days, as the two dates appear on the filing. Null when either is absent. Not clamped: a filing that predates its own transaction would serve a negative value rather than a corrected one.

data[].filing.statutory_window_daysinteger | null

45 for a periodic transaction report, the STOCK Act's transaction-level reporting window; null for annual reports and unknown forms, which carry no per-transaction deadline. A constant of the form, not a per-row judgement.

data[].filing.within_statutory_windowoptionalboolean

Present only when the filing type has an applicable transaction-level window and delay_days is known.

data[].amountobject

The bounded range exactly as disclosed. A missing amount is never estimated.

data[].amount.range_lowinteger

Lower bound of the band the filing discloses, in whole USD, as printed on the form ($1,001 to $15,000 serves 1001).

data[].amount.range_highinteger

Upper bound of the disclosed band, in whole USD. For an open-ended band such as "over $50,000,000" this is the stated threshold, and midpoint is absent.

data[].amount.currencyliteral= USD

Always USD. Every disclosure form Veridion serves reports in dollars.

data[].amount.midpointoptionalinteger

Veridion's arithmetic midpoint of range_low and range_high, rounded to the dollar. It is a convenience, not a disclosed value: the filer reported a band, never a figure. Absent when the band is open-ended ("over", "more than", "less than" and their variants) because a midpoint of an unbounded range is invented. Use it only with the range shown beside it.

data[].amount.basisliteral= bounded_range_as_disclosed

States what the amount fields are: the bounded range as the filing disclosed it. The only basis served today; a future exact-amount source would carry its own.

data[].amount.verbatim_textstring

The amount text exactly as it appears on the filing, before any parsing. When range_low and range_high disagree with this text, this text is the filing.

data[].ownerobject

Whose holding the transaction concerns, from the filing's Owner column, and how that value was established.

data[].owner.labelenumself · spouse · joint · dependent_child · not_specified_in_filing · undetermined

The filing's Owner column: self, spouse, joint or dependent_child as marked; not_specified_in_filing when the official receipt was checked and the column is blank; undetermined when the row was located but the column could not be read with confidence. See determination for how the value was established.

data[].owner.determinationenumparsed_from_filing · receipt_verified_blank · owner_column_undetermined · not_applicable_for_form

How the owner value was established. owner_column_undetermined means the filing row was located but the extracted text did not positively establish whether its Owner column was blank.

data[].receiptobject

The government receipt this row was parsed from. Preserve the access label.

data[].receipt.document_idstring

The office's own identifier for the document: the House Clerk's numeric document id, the Senate eFD report id, or the OGE document id. Resolves at /v1/receipts/{document_id}.

data[].receipt.urlstring (uri)

The government's URL for the document this row was parsed from, on the office's own domain. Never a Veridion-hosted copy. Cite it beside any claim built on the row.

data[].receipt.accessenumopen · gated

gated means the official Senate eFD URL requires acknowledging its access agreement before the filing is displayed; other supported sources are open.

data[].receipt.source_systemenumhouse_clerk · senate_efd · sec_edgar · oge

The office that published the receipt: house_clerk, senate_efd or oge. sec_edgar is declared in the enum and serves no rows; /v1/status reports it as no_data.

data[].receipt.content_typestring

MIME type of the document at receipt.url: application/pdf for House Clerk and OGE documents, text/html for Senate eFD filings, which the Senate publishes as pages.

data[].receipt.pageinteger | null

Page of the document the row was parsed from, where the source is paginated and the parser recorded it (OGE filings); null for congressional rows, whose position is given by provenance.source_line_number instead.

data[].receipt.retrieved_atstring (date-time)

When Veridion's warehouse first recorded the source document this row comes from. Independent of provenance.parsed_at, which belongs to the parser generation and may be earlier when a later retrieval re-attached an existing parse.

data[].provenanceobject

How and when this version of the row was produced, and when the row was first observed, which is the instant as_of reads against. None of these fields is in content_hash.

data[].provenance.source_line_numberinteger | null

House Clerk PTR rows carry a PDF source-line coordinate when the parser recorded one; null rows are reconciled by reason, and parser-output gaps are enumerated in house_clerk_gap_register. Senate eFD records are parsed as filing transactions rather than House PTR PDF lines, so source_line_number is null by design.

data[].provenance.parsed_atstring (date-time)

When the parser generation named in parser_version produced this version of the row. A reparse under a new parser writes a new version with its own parsed_at; the earlier version stays in /history.

data[].provenance.parser_versionstring

The parser generation that produced this version (for example house-ptr-line-v2). Not part of content_hash, so a reparse that changes no filing fact changes no hash.

data[].provenance.methodology_versionstring

The admission and derivation rules this row was served under, currently receipt-or-drop-v1. A rule change ships as a new label and a changelog entry; see the stability policy.

data[].provenance.source_ingested_atstring (date-time)

When the source record entered Veridion's warehouse. first_observed_at is never later than this; the two differ when identity resolution carried an earlier observation forward.

data[].provenance.first_observed_atstring (date-time)

When Veridion first observed this row. Immutable and used by the as_of filter.

coverageobject
coverage.as_ofstring (date-time)
coverage.requested_as_ofstring (date-time) | null
coverage.point_in_timeboolean
coverage.point_in_time_floorstring (date-time)

Inclusive lower bound for as_of and updated_since. Requests one millisecond before this instant are refused rather than returned as an empty result.

coverage.out_of_rangeboolean

True when requested_as_of predates retained point-in-time history. This is distinct from a genuine empty result.

coverage.rows_returnedinteger
coverage.rows_dropped_failed_validationinteger

Rows withheld because the serving view and executable response contract disagreed. Any value above zero means the page is partial.

coverage.served_atstring (date-time)
coverage.basisstring
pageobject
page.limitinteger
page.has_moreboolean
page.next_cursorstring | null
page.modeenumsnapshot · changes
page.requested_updated_sincestring (date-time) | null

The normalized updated_since filter applied to this incremental page. Null for a full snapshot pull.

page.snapshot_as_ofstring (date-time)

Pinned on page one and carried inside every cursor. Later writes cannot shift the result set during pagination.

page.snapshot_generationinteger

Atomic dataset generation pinned on page one. A value of zero means the requested as_of predates retained exact payload history, or the current-row fallback is active while temporal history is unavailable.

accessobject
access.tierliteral= free
access.max_rows_per_requestliteral= 25
access.requests_per_hourliteral= 60
access.no_key_requiredliteral= true
access.upgradeobject
access.upgrade.max_rows_per_requestliteral= 1000
access.upgrade.request_a_keystring (uri)
cacheobject
cache.policyliteral= public
cache.browser_max_age_secondsliteral= 0
cache.cdn_max_age_secondsliteral= 300
cache.declared_max_staleness_secondsliteral= 300
cache.age_headerliteral= Age
cache.freshness_referenceobject
cache.freshness_reference.sourceliteral= congress
cache.freshness_reference.source_expected_max_age_secondsliteral= 21600
cache.freshness_reference.delivery_max_staleness_secondsliteral= 300
cache.freshness_reference.delivery_to_source_threshold_ratioliteral= 1/72
cache.freshness_reference.basisstring
versionliteral= 1.3.17
noticestring
DisclosureHistory88 fields · GET /api/v1/disclosures/{disclosure_id}/history
FieldTypeMeaning
dataarray

Every observed version of this disclosure_id, oldest first. Each entry carries its own change block (upsert or supersede, active or withdrawn) and version_id. The last entry is the current state.

data[].disclosure_idstring

Permanent identifier for the filing-derived transaction. It is never reused; parser versions and restatements retain this identifier.

data[].version_idstring

Immutable parse-generation identifier. Use disclosure_id, not version_id, for downstream identity across a restatement.

data[].content_hashstring

sha256, hex, of the canonical JSON array ["veridion-disclosure-content-v1", disclosure_id, version_id, member.member_id, member.full_name, member.chamber, asset.ticker, asset.name, asset.asset_type, asset.source_code, asset.description, transaction.type, transaction.date, filing.type, filing.filed_date, amount.range_low, amount.range_high, amount.verbatim_text, owner.label, owner.determination, receipt.document_id, receipt.url, receipt.source_system, receipt.page, provenance.source_line_number] using the served values exactly (null where null). Recompute it from this row to check the calculation; store it to check later that the same version_id still serves the same content. Derived fields (delay_days, statutory window, midpoint), timestamps, parser and methodology versions, and the change block are excluded, so a corrected derivation rule does not change the hash of an unchanged filing. The basis label changes if the field list ever changes.

data[].identity_basisenumgovernment_filing_facts

Identity uses only filer, document, filed instrument, transaction date and type, amount range, and owner. Parser line, span, version, and run identifiers are excluded.

data[].changeobject

Full pulls contain upserts. updated_since also emits supersede events; remove the row only when version_id matches the version held locally. A withdrawn stable identifier remains directly retrievable with its reason.

data[].change.typeenumupsert · supersede

upsert: this version is the one to hold. supersede: a version you may hold has been replaced, and is only emitted on updated_since reads.

data[].change.stateenumactive · withdrawn

active: served in snapshot reads. withdrawn: no longer served in snapshots but still directly retrievable by disclosure_id, with reason set.

data[].change.observed_atstring (date-time)

When Veridion observed the event this row reports (the version's first observation for an upsert; the supersession instant for a supersede).

data[].change.reasonstring | null

Why a row was withdrawn or superseded, when the pipeline recorded one; null for an ordinary upsert. States the mechanism, never a motive.

data[].memberobject

The filer, resolved against the congressional directory where a match exists. Identity fields only; what the filing itself says is in the receipt.

data[].member.member_idstring

Veridion's stable identifier for the filer, the same value /v1/members/{member_id} resolves and the member_id= filter takes. Derived from the name as filed; it does not change across filings or restatements.

data[].member.person_idstring | null

The filer's official Bioguide ID (for example G000596) where the congressional directory has one; null for executive-branch filers and for congressional filers the directory could not match. Never invented.

data[].member.full_namestring

The filer's name from the official directory where matched; otherwise the name as it appears on the filing with honorifics (Hon., Sen., Rep.) removed.

data[].member.chamberenumhouse · senate · executive

house or senate from the office that published the receipt; executive for Office of Government Ethics filers.

data[].member.partystring | null

Democrat, Republican or Independent, from the congressional directory's D, R or I; null when the directory records none and for every executive-branch filer.

data[].member.statestring | null

Two-letter state of the seat, as recorded in the congressional directory; null for executive-branch filers.

data[].member.districtstring | null

House district as STATE-N with N an integer and 0 an at-large seat (GA-14, AK-0); null for senators, executive-branch filers, and rows whose filing does not state one. The same form the /v1/members directory uses.

data[].assetobject

The instrument as the filing names it, classified from the office's own asset code. Nothing is resolved against a securities master; a ticker is served only when the filing states one.

data[].asset.tickerstring | null

The ticker as it appears on the filing, upper-cased; null when the filing states none (most OGE lines, bonds, funds without a symbol, and paper filings whose ticker column is blank). Not looked up or inferred from the asset name.

data[].asset.namestring

The asset as named on the filing, whitespace collapsed. If the filing names nothing but gives a ticker, the ticker; if it gives neither, the literal "Disclosed asset" so the row is not silently dropped.

data[].asset.asset_typeenumequity · etf · municipal_bond · corporate_bond · government_security · option · fund · partnership · crypto · other

Classified from the office's own asset code on congressional filings: ST equity, OP option, MF and EF fund, GS government_security, PS partnership, CT crypto, anything else other. OGE lines carry equity, fund or other. etf, municipal_bond and corporate_bond are reserved in the enum and produced by no current source.

data[].asset.source_codestring | null

The asset code exactly as the office recorded it (ST, OP, MF, EF, GS, PS, CT and others), upper-cased; the input to asset_type. Null when the source carries none.

data[].asset.descriptionstring | null

Free-text description from the filing's asset line when the office publishes one separately from the name; null otherwise. Never composed by Veridion.

data[].transactionobject

What was done and on what date, as stated on the filing.

data[].transaction.typeenumbuy · sell · exchange · other

buy from a P code or a purchase/buy label; sell from an S code or a sale/sell label; exchange from an E code or an exchange label; other for anything the filing marks differently. Partial versus full sale is not distinguished here; the filing's own wording is in amount.verbatim_text and the receipt.

data[].transaction.datestring (date)

The transaction date as stated on the filing. Not the filing date, and not adjusted for weekends or holidays.

data[].filingobject

The report this row was parsed from and its timing against the STOCK Act's 45-day transaction window, computed from the two dates on the filing.

data[].filing.typeenum | nullperiodic_transaction_report · annual_report

periodic_transaction_report for House Clerk and Senate eFD PTRs and OGE Form 278-T; annual_report for OGE Form 278e; null when the receipt URL matches no known form pattern. Determined from the office and receipt, not from the row's text.

data[].filing.filed_datestring (date)

The date the office records the report as filed. The STOCK Act window and delay_days are measured to this date.

data[].filing.delay_daysinteger | null

filed_date minus transaction.date, in whole days, as the two dates appear on the filing. Null when either is absent. Not clamped: a filing that predates its own transaction would serve a negative value rather than a corrected one.

data[].filing.statutory_window_daysinteger | null

45 for a periodic transaction report, the STOCK Act's transaction-level reporting window; null for annual reports and unknown forms, which carry no per-transaction deadline. A constant of the form, not a per-row judgement.

data[].filing.within_statutory_windowoptionalboolean

Present only when the filing type has an applicable transaction-level window and delay_days is known.

data[].amountobject

The bounded range exactly as disclosed. A missing amount is never estimated.

data[].amount.range_lowinteger

Lower bound of the band the filing discloses, in whole USD, as printed on the form ($1,001 to $15,000 serves 1001).

data[].amount.range_highinteger

Upper bound of the disclosed band, in whole USD. For an open-ended band such as "over $50,000,000" this is the stated threshold, and midpoint is absent.

data[].amount.currencyliteral= USD

Always USD. Every disclosure form Veridion serves reports in dollars.

data[].amount.midpointoptionalinteger

Veridion's arithmetic midpoint of range_low and range_high, rounded to the dollar. It is a convenience, not a disclosed value: the filer reported a band, never a figure. Absent when the band is open-ended ("over", "more than", "less than" and their variants) because a midpoint of an unbounded range is invented. Use it only with the range shown beside it.

data[].amount.basisliteral= bounded_range_as_disclosed

States what the amount fields are: the bounded range as the filing disclosed it. The only basis served today; a future exact-amount source would carry its own.

data[].amount.verbatim_textstring

The amount text exactly as it appears on the filing, before any parsing. When range_low and range_high disagree with this text, this text is the filing.

data[].ownerobject

Whose holding the transaction concerns, from the filing's Owner column, and how that value was established.

data[].owner.labelenumself · spouse · joint · dependent_child · not_specified_in_filing · undetermined

The filing's Owner column: self, spouse, joint or dependent_child as marked; not_specified_in_filing when the official receipt was checked and the column is blank; undetermined when the row was located but the column could not be read with confidence. See determination for how the value was established.

data[].owner.determinationenumparsed_from_filing · receipt_verified_blank · owner_column_undetermined · not_applicable_for_form

How the owner value was established. owner_column_undetermined means the filing row was located but the extracted text did not positively establish whether its Owner column was blank.

data[].receiptobject

The government receipt this row was parsed from. Preserve the access label.

data[].receipt.document_idstring

The office's own identifier for the document: the House Clerk's numeric document id, the Senate eFD report id, or the OGE document id. Resolves at /v1/receipts/{document_id}.

data[].receipt.urlstring (uri)

The government's URL for the document this row was parsed from, on the office's own domain. Never a Veridion-hosted copy. Cite it beside any claim built on the row.

data[].receipt.accessenumopen · gated

gated means the official Senate eFD URL requires acknowledging its access agreement before the filing is displayed; other supported sources are open.

data[].receipt.source_systemenumhouse_clerk · senate_efd · sec_edgar · oge

The office that published the receipt: house_clerk, senate_efd or oge. sec_edgar is declared in the enum and serves no rows; /v1/status reports it as no_data.

data[].receipt.content_typestring

MIME type of the document at receipt.url: application/pdf for House Clerk and OGE documents, text/html for Senate eFD filings, which the Senate publishes as pages.

data[].receipt.pageinteger | null

Page of the document the row was parsed from, where the source is paginated and the parser recorded it (OGE filings); null for congressional rows, whose position is given by provenance.source_line_number instead.

data[].receipt.retrieved_atstring (date-time)

When Veridion's warehouse first recorded the source document this row comes from. Independent of provenance.parsed_at, which belongs to the parser generation and may be earlier when a later retrieval re-attached an existing parse.

data[].provenanceobject

How and when this version of the row was produced, and when the row was first observed, which is the instant as_of reads against. None of these fields is in content_hash.

data[].provenance.source_line_numberinteger | null

House Clerk PTR rows carry a PDF source-line coordinate when the parser recorded one; null rows are reconciled by reason, and parser-output gaps are enumerated in house_clerk_gap_register. Senate eFD records are parsed as filing transactions rather than House PTR PDF lines, so source_line_number is null by design.

data[].provenance.parsed_atstring (date-time)

When the parser generation named in parser_version produced this version of the row. A reparse under a new parser writes a new version with its own parsed_at; the earlier version stays in /history.

data[].provenance.parser_versionstring

The parser generation that produced this version (for example house-ptr-line-v2). Not part of content_hash, so a reparse that changes no filing fact changes no hash.

data[].provenance.methodology_versionstring

The admission and derivation rules this row was served under, currently receipt-or-drop-v1. A rule change ships as a new label and a changelog entry; see the stability policy.

data[].provenance.source_ingested_atstring (date-time)

When the source record entered Veridion's warehouse. first_observed_at is never later than this; the two differ when identity resolution carried an earlier observation forward.

data[].provenance.first_observed_atstring (date-time)

When Veridion first observed this row. Immutable and used by the as_of filter.

historyobject
history.disclosure_idstring
history.event_countinteger
history.first_observed_atstring (date-time)
history.latest_observed_atstring (date-time)
history.current_stateenumactive · withdrawn
history.restatedboolean

True when more than one version has been observed. States that the row's content changed after first publication; the reason, if the source gave one, is on each event's change block. No motive is inferred.

history.events_truncatedboolean

True when the version count exceeded the response cap and the oldest events were withheld rather than silently dropped mid-sequence. event_count still reports the full number observed.

accessobject
access.tierliteral= free
access.max_rows_per_requestliteral= 25
access.requests_per_hourliteral= 60
access.no_key_requiredliteral= true
access.upgradeobject
access.upgrade.max_rows_per_requestliteral= 1000
access.upgrade.request_a_keystring (uri)
cacheobject
cache.policyliteral= public
cache.browser_max_age_secondsliteral= 0
cache.cdn_max_age_secondsliteral= 300
cache.declared_max_staleness_secondsliteral= 300
cache.age_headerliteral= Age
cache.freshness_referenceobject
cache.freshness_reference.sourceliteral= congress
cache.freshness_reference.source_expected_max_age_secondsliteral= 21600
cache.freshness_reference.delivery_max_staleness_secondsliteral= 300
cache.freshness_reference.delivery_to_source_threshold_ratioliteral= 1/72
cache.freshness_reference.basisstring
versionliteral= 1.3.17
noticestring
DisclosureLookup85 fields · GET /api/v1/disclosures/{disclosure_id}
FieldTypeMeaning
dataobject
data.disclosure_idstring

Permanent identifier for the filing-derived transaction. It is never reused; parser versions and restatements retain this identifier.

data.version_idstring

Immutable parse-generation identifier. Use disclosure_id, not version_id, for downstream identity across a restatement.

data.content_hashstring

sha256, hex, of the canonical JSON array ["veridion-disclosure-content-v1", disclosure_id, version_id, member.member_id, member.full_name, member.chamber, asset.ticker, asset.name, asset.asset_type, asset.source_code, asset.description, transaction.type, transaction.date, filing.type, filing.filed_date, amount.range_low, amount.range_high, amount.verbatim_text, owner.label, owner.determination, receipt.document_id, receipt.url, receipt.source_system, receipt.page, provenance.source_line_number] using the served values exactly (null where null). Recompute it from this row to check the calculation; store it to check later that the same version_id still serves the same content. Derived fields (delay_days, statutory window, midpoint), timestamps, parser and methodology versions, and the change block are excluded, so a corrected derivation rule does not change the hash of an unchanged filing. The basis label changes if the field list ever changes.

data.identity_basisenumgovernment_filing_facts

Identity uses only filer, document, filed instrument, transaction date and type, amount range, and owner. Parser line, span, version, and run identifiers are excluded.

data.changeobject

Full pulls contain upserts. updated_since also emits supersede events; remove the row only when version_id matches the version held locally. A withdrawn stable identifier remains directly retrievable with its reason.

data.change.typeenumupsert · supersede

upsert: this version is the one to hold. supersede: a version you may hold has been replaced, and is only emitted on updated_since reads.

data.change.stateenumactive · withdrawn

active: served in snapshot reads. withdrawn: no longer served in snapshots but still directly retrievable by disclosure_id, with reason set.

data.change.observed_atstring (date-time)

When Veridion observed the event this row reports (the version's first observation for an upsert; the supersession instant for a supersede).

data.change.reasonstring | null

Why a row was withdrawn or superseded, when the pipeline recorded one; null for an ordinary upsert. States the mechanism, never a motive.

data.memberobject

The filer, resolved against the congressional directory where a match exists. Identity fields only; what the filing itself says is in the receipt.

data.member.member_idstring

Veridion's stable identifier for the filer, the same value /v1/members/{member_id} resolves and the member_id= filter takes. Derived from the name as filed; it does not change across filings or restatements.

data.member.person_idstring | null

The filer's official Bioguide ID (for example G000596) where the congressional directory has one; null for executive-branch filers and for congressional filers the directory could not match. Never invented.

data.member.full_namestring

The filer's name from the official directory where matched; otherwise the name as it appears on the filing with honorifics (Hon., Sen., Rep.) removed.

data.member.chamberenumhouse · senate · executive

house or senate from the office that published the receipt; executive for Office of Government Ethics filers.

data.member.partystring | null

Democrat, Republican or Independent, from the congressional directory's D, R or I; null when the directory records none and for every executive-branch filer.

data.member.statestring | null

Two-letter state of the seat, as recorded in the congressional directory; null for executive-branch filers.

data.member.districtstring | null

House district as STATE-N with N an integer and 0 an at-large seat (GA-14, AK-0); null for senators, executive-branch filers, and rows whose filing does not state one. The same form the /v1/members directory uses.

data.assetobject

The instrument as the filing names it, classified from the office's own asset code. Nothing is resolved against a securities master; a ticker is served only when the filing states one.

data.asset.tickerstring | null

The ticker as it appears on the filing, upper-cased; null when the filing states none (most OGE lines, bonds, funds without a symbol, and paper filings whose ticker column is blank). Not looked up or inferred from the asset name.

data.asset.namestring

The asset as named on the filing, whitespace collapsed. If the filing names nothing but gives a ticker, the ticker; if it gives neither, the literal "Disclosed asset" so the row is not silently dropped.

data.asset.asset_typeenumequity · etf · municipal_bond · corporate_bond · government_security · option · fund · partnership · crypto · other

Classified from the office's own asset code on congressional filings: ST equity, OP option, MF and EF fund, GS government_security, PS partnership, CT crypto, anything else other. OGE lines carry equity, fund or other. etf, municipal_bond and corporate_bond are reserved in the enum and produced by no current source.

data.asset.source_codestring | null

The asset code exactly as the office recorded it (ST, OP, MF, EF, GS, PS, CT and others), upper-cased; the input to asset_type. Null when the source carries none.

data.asset.descriptionstring | null

Free-text description from the filing's asset line when the office publishes one separately from the name; null otherwise. Never composed by Veridion.

data.transactionobject

What was done and on what date, as stated on the filing.

data.transaction.typeenumbuy · sell · exchange · other

buy from a P code or a purchase/buy label; sell from an S code or a sale/sell label; exchange from an E code or an exchange label; other for anything the filing marks differently. Partial versus full sale is not distinguished here; the filing's own wording is in amount.verbatim_text and the receipt.

data.transaction.datestring (date)

The transaction date as stated on the filing. Not the filing date, and not adjusted for weekends or holidays.

data.filingobject

The report this row was parsed from and its timing against the STOCK Act's 45-day transaction window, computed from the two dates on the filing.

data.filing.typeenum | nullperiodic_transaction_report · annual_report

periodic_transaction_report for House Clerk and Senate eFD PTRs and OGE Form 278-T; annual_report for OGE Form 278e; null when the receipt URL matches no known form pattern. Determined from the office and receipt, not from the row's text.

data.filing.filed_datestring (date)

The date the office records the report as filed. The STOCK Act window and delay_days are measured to this date.

data.filing.delay_daysinteger | null

filed_date minus transaction.date, in whole days, as the two dates appear on the filing. Null when either is absent. Not clamped: a filing that predates its own transaction would serve a negative value rather than a corrected one.

data.filing.statutory_window_daysinteger | null

45 for a periodic transaction report, the STOCK Act's transaction-level reporting window; null for annual reports and unknown forms, which carry no per-transaction deadline. A constant of the form, not a per-row judgement.

data.filing.within_statutory_windowoptionalboolean

Present only when the filing type has an applicable transaction-level window and delay_days is known.

data.amountobject

The bounded range exactly as disclosed. A missing amount is never estimated.

data.amount.range_lowinteger

Lower bound of the band the filing discloses, in whole USD, as printed on the form ($1,001 to $15,000 serves 1001).

data.amount.range_highinteger

Upper bound of the disclosed band, in whole USD. For an open-ended band such as "over $50,000,000" this is the stated threshold, and midpoint is absent.

data.amount.currencyliteral= USD

Always USD. Every disclosure form Veridion serves reports in dollars.

data.amount.midpointoptionalinteger

Veridion's arithmetic midpoint of range_low and range_high, rounded to the dollar. It is a convenience, not a disclosed value: the filer reported a band, never a figure. Absent when the band is open-ended ("over", "more than", "less than" and their variants) because a midpoint of an unbounded range is invented. Use it only with the range shown beside it.

data.amount.basisliteral= bounded_range_as_disclosed

States what the amount fields are: the bounded range as the filing disclosed it. The only basis served today; a future exact-amount source would carry its own.

data.amount.verbatim_textstring

The amount text exactly as it appears on the filing, before any parsing. When range_low and range_high disagree with this text, this text is the filing.

data.ownerobject

Whose holding the transaction concerns, from the filing's Owner column, and how that value was established.

data.owner.labelenumself · spouse · joint · dependent_child · not_specified_in_filing · undetermined

The filing's Owner column: self, spouse, joint or dependent_child as marked; not_specified_in_filing when the official receipt was checked and the column is blank; undetermined when the row was located but the column could not be read with confidence. See determination for how the value was established.

data.owner.determinationenumparsed_from_filing · receipt_verified_blank · owner_column_undetermined · not_applicable_for_form

How the owner value was established. owner_column_undetermined means the filing row was located but the extracted text did not positively establish whether its Owner column was blank.

data.receiptobject

The government receipt this row was parsed from. Preserve the access label.

data.receipt.document_idstring

The office's own identifier for the document: the House Clerk's numeric document id, the Senate eFD report id, or the OGE document id. Resolves at /v1/receipts/{document_id}.

data.receipt.urlstring (uri)

The government's URL for the document this row was parsed from, on the office's own domain. Never a Veridion-hosted copy. Cite it beside any claim built on the row.

data.receipt.accessenumopen · gated

gated means the official Senate eFD URL requires acknowledging its access agreement before the filing is displayed; other supported sources are open.

data.receipt.source_systemenumhouse_clerk · senate_efd · sec_edgar · oge

The office that published the receipt: house_clerk, senate_efd or oge. sec_edgar is declared in the enum and serves no rows; /v1/status reports it as no_data.

data.receipt.content_typestring

MIME type of the document at receipt.url: application/pdf for House Clerk and OGE documents, text/html for Senate eFD filings, which the Senate publishes as pages.

data.receipt.pageinteger | null

Page of the document the row was parsed from, where the source is paginated and the parser recorded it (OGE filings); null for congressional rows, whose position is given by provenance.source_line_number instead.

data.receipt.retrieved_atstring (date-time)

When Veridion's warehouse first recorded the source document this row comes from. Independent of provenance.parsed_at, which belongs to the parser generation and may be earlier when a later retrieval re-attached an existing parse.

data.provenanceobject

How and when this version of the row was produced, and when the row was first observed, which is the instant as_of reads against. None of these fields is in content_hash.

data.provenance.source_line_numberinteger | null

House Clerk PTR rows carry a PDF source-line coordinate when the parser recorded one; null rows are reconciled by reason, and parser-output gaps are enumerated in house_clerk_gap_register. Senate eFD records are parsed as filing transactions rather than House PTR PDF lines, so source_line_number is null by design.

data.provenance.parsed_atstring (date-time)

When the parser generation named in parser_version produced this version of the row. A reparse under a new parser writes a new version with its own parsed_at; the earlier version stays in /history.

data.provenance.parser_versionstring

The parser generation that produced this version (for example house-ptr-line-v2). Not part of content_hash, so a reparse that changes no filing fact changes no hash.

data.provenance.methodology_versionstring

The admission and derivation rules this row was served under, currently receipt-or-drop-v1. A rule change ships as a new label and a changelog entry; see the stability policy.

data.provenance.source_ingested_atstring (date-time)

When the source record entered Veridion's warehouse. first_observed_at is never later than this; the two differ when identity resolution carried an earlier observation forward.

data.provenance.first_observed_atstring (date-time)

When Veridion first observed this row. Immutable and used by the as_of filter.

lookupobject
lookup.disclosure_idstring
lookup.stateenumactive · withdrawn
lookup.withdrawn_atstring (date-time) | null
lookup.withdrawal_reasonstring | null
accessobject
access.tierliteral= free
access.max_rows_per_requestliteral= 25
access.requests_per_hourliteral= 60
access.no_key_requiredliteral= true
access.upgradeobject
access.upgrade.max_rows_per_requestliteral= 1000
access.upgrade.request_a_keystring (uri)
cacheobject
cache.policyliteral= public
cache.browser_max_age_secondsliteral= 0
cache.cdn_max_age_secondsliteral= 300
cache.declared_max_staleness_secondsliteral= 300
cache.age_headerliteral= Age
cache.freshness_referenceobject
cache.freshness_reference.sourceliteral= congress
cache.freshness_reference.source_expected_max_age_secondsliteral= 21600
cache.freshness_reference.delivery_max_staleness_secondsliteral= 300
cache.freshness_reference.delivery_to_source_threshold_ratioliteral= 1/72
cache.freshness_reference.basisstring
versionliteral= 1.3.17
noticestring
Disclosure57 fields · shared
FieldTypeMeaning
disclosure_idstring

Permanent identifier for the filing-derived transaction. It is never reused; parser versions and restatements retain this identifier.

version_idstring

Immutable parse-generation identifier. Use disclosure_id, not version_id, for downstream identity across a restatement.

content_hashstring

sha256, hex, of the canonical JSON array ["veridion-disclosure-content-v1", disclosure_id, version_id, member.member_id, member.full_name, member.chamber, asset.ticker, asset.name, asset.asset_type, asset.source_code, asset.description, transaction.type, transaction.date, filing.type, filing.filed_date, amount.range_low, amount.range_high, amount.verbatim_text, owner.label, owner.determination, receipt.document_id, receipt.url, receipt.source_system, receipt.page, provenance.source_line_number] using the served values exactly (null where null). Recompute it from this row to check the calculation; store it to check later that the same version_id still serves the same content. Derived fields (delay_days, statutory window, midpoint), timestamps, parser and methodology versions, and the change block are excluded, so a corrected derivation rule does not change the hash of an unchanged filing. The basis label changes if the field list ever changes.

identity_basisenumgovernment_filing_facts

Identity uses only filer, document, filed instrument, transaction date and type, amount range, and owner. Parser line, span, version, and run identifiers are excluded.

changeobject

Full pulls contain upserts. updated_since also emits supersede events; remove the row only when version_id matches the version held locally. A withdrawn stable identifier remains directly retrievable with its reason.

change.typeenumupsert · supersede

upsert: this version is the one to hold. supersede: a version you may hold has been replaced, and is only emitted on updated_since reads.

change.stateenumactive · withdrawn

active: served in snapshot reads. withdrawn: no longer served in snapshots but still directly retrievable by disclosure_id, with reason set.

change.observed_atstring (date-time)

When Veridion observed the event this row reports (the version's first observation for an upsert; the supersession instant for a supersede).

change.reasonstring | null

Why a row was withdrawn or superseded, when the pipeline recorded one; null for an ordinary upsert. States the mechanism, never a motive.

memberobject

The filer, resolved against the congressional directory where a match exists. Identity fields only; what the filing itself says is in the receipt.

member.member_idstring

Veridion's stable identifier for the filer, the same value /v1/members/{member_id} resolves and the member_id= filter takes. Derived from the name as filed; it does not change across filings or restatements.

member.person_idstring | null

The filer's official Bioguide ID (for example G000596) where the congressional directory has one; null for executive-branch filers and for congressional filers the directory could not match. Never invented.

member.full_namestring

The filer's name from the official directory where matched; otherwise the name as it appears on the filing with honorifics (Hon., Sen., Rep.) removed.

member.chamberenumhouse · senate · executive

house or senate from the office that published the receipt; executive for Office of Government Ethics filers.

member.partystring | null

Democrat, Republican or Independent, from the congressional directory's D, R or I; null when the directory records none and for every executive-branch filer.

member.statestring | null

Two-letter state of the seat, as recorded in the congressional directory; null for executive-branch filers.

member.districtstring | null

House district as STATE-N with N an integer and 0 an at-large seat (GA-14, AK-0); null for senators, executive-branch filers, and rows whose filing does not state one. The same form the /v1/members directory uses.

assetobject

The instrument as the filing names it, classified from the office's own asset code. Nothing is resolved against a securities master; a ticker is served only when the filing states one.

asset.tickerstring | null

The ticker as it appears on the filing, upper-cased; null when the filing states none (most OGE lines, bonds, funds without a symbol, and paper filings whose ticker column is blank). Not looked up or inferred from the asset name.

asset.namestring

The asset as named on the filing, whitespace collapsed. If the filing names nothing but gives a ticker, the ticker; if it gives neither, the literal "Disclosed asset" so the row is not silently dropped.

asset.asset_typeenumequity · etf · municipal_bond · corporate_bond · government_security · option · fund · partnership · crypto · other

Classified from the office's own asset code on congressional filings: ST equity, OP option, MF and EF fund, GS government_security, PS partnership, CT crypto, anything else other. OGE lines carry equity, fund or other. etf, municipal_bond and corporate_bond are reserved in the enum and produced by no current source.

asset.source_codestring | null

The asset code exactly as the office recorded it (ST, OP, MF, EF, GS, PS, CT and others), upper-cased; the input to asset_type. Null when the source carries none.

asset.descriptionstring | null

Free-text description from the filing's asset line when the office publishes one separately from the name; null otherwise. Never composed by Veridion.

transactionobject

What was done and on what date, as stated on the filing.

transaction.typeenumbuy · sell · exchange · other

buy from a P code or a purchase/buy label; sell from an S code or a sale/sell label; exchange from an E code or an exchange label; other for anything the filing marks differently. Partial versus full sale is not distinguished here; the filing's own wording is in amount.verbatim_text and the receipt.

transaction.datestring (date)

The transaction date as stated on the filing. Not the filing date, and not adjusted for weekends or holidays.

filingobject

The report this row was parsed from and its timing against the STOCK Act's 45-day transaction window, computed from the two dates on the filing.

filing.typeenum | nullperiodic_transaction_report · annual_report

periodic_transaction_report for House Clerk and Senate eFD PTRs and OGE Form 278-T; annual_report for OGE Form 278e; null when the receipt URL matches no known form pattern. Determined from the office and receipt, not from the row's text.

filing.filed_datestring (date)

The date the office records the report as filed. The STOCK Act window and delay_days are measured to this date.

filing.delay_daysinteger | null

filed_date minus transaction.date, in whole days, as the two dates appear on the filing. Null when either is absent. Not clamped: a filing that predates its own transaction would serve a negative value rather than a corrected one.

filing.statutory_window_daysinteger | null

45 for a periodic transaction report, the STOCK Act's transaction-level reporting window; null for annual reports and unknown forms, which carry no per-transaction deadline. A constant of the form, not a per-row judgement.

filing.within_statutory_windowoptionalboolean

Present only when the filing type has an applicable transaction-level window and delay_days is known.

amountobject

The bounded range exactly as disclosed. A missing amount is never estimated.

amount.range_lowinteger

Lower bound of the band the filing discloses, in whole USD, as printed on the form ($1,001 to $15,000 serves 1001).

amount.range_highinteger

Upper bound of the disclosed band, in whole USD. For an open-ended band such as "over $50,000,000" this is the stated threshold, and midpoint is absent.

amount.currencyliteral= USD

Always USD. Every disclosure form Veridion serves reports in dollars.

amount.midpointoptionalinteger

Veridion's arithmetic midpoint of range_low and range_high, rounded to the dollar. It is a convenience, not a disclosed value: the filer reported a band, never a figure. Absent when the band is open-ended ("over", "more than", "less than" and their variants) because a midpoint of an unbounded range is invented. Use it only with the range shown beside it.

amount.basisliteral= bounded_range_as_disclosed

States what the amount fields are: the bounded range as the filing disclosed it. The only basis served today; a future exact-amount source would carry its own.

amount.verbatim_textstring

The amount text exactly as it appears on the filing, before any parsing. When range_low and range_high disagree with this text, this text is the filing.

ownerobject

Whose holding the transaction concerns, from the filing's Owner column, and how that value was established.

owner.labelenumself · spouse · joint · dependent_child · not_specified_in_filing · undetermined

The filing's Owner column: self, spouse, joint or dependent_child as marked; not_specified_in_filing when the official receipt was checked and the column is blank; undetermined when the row was located but the column could not be read with confidence. See determination for how the value was established.

owner.determinationenumparsed_from_filing · receipt_verified_blank · owner_column_undetermined · not_applicable_for_form

How the owner value was established. owner_column_undetermined means the filing row was located but the extracted text did not positively establish whether its Owner column was blank.

receiptobject

The government receipt this row was parsed from. Preserve the access label.

receipt.document_idstring

The office's own identifier for the document: the House Clerk's numeric document id, the Senate eFD report id, or the OGE document id. Resolves at /v1/receipts/{document_id}.

receipt.urlstring (uri)

The government's URL for the document this row was parsed from, on the office's own domain. Never a Veridion-hosted copy. Cite it beside any claim built on the row.

receipt.accessenumopen · gated

gated means the official Senate eFD URL requires acknowledging its access agreement before the filing is displayed; other supported sources are open.

receipt.source_systemenumhouse_clerk · senate_efd · sec_edgar · oge

The office that published the receipt: house_clerk, senate_efd or oge. sec_edgar is declared in the enum and serves no rows; /v1/status reports it as no_data.

receipt.content_typestring

MIME type of the document at receipt.url: application/pdf for House Clerk and OGE documents, text/html for Senate eFD filings, which the Senate publishes as pages.

receipt.pageinteger | null

Page of the document the row was parsed from, where the source is paginated and the parser recorded it (OGE filings); null for congressional rows, whose position is given by provenance.source_line_number instead.

receipt.retrieved_atstring (date-time)

When Veridion's warehouse first recorded the source document this row comes from. Independent of provenance.parsed_at, which belongs to the parser generation and may be earlier when a later retrieval re-attached an existing parse.

provenanceobject

How and when this version of the row was produced, and when the row was first observed, which is the instant as_of reads against. None of these fields is in content_hash.

provenance.source_line_numberinteger | null

House Clerk PTR rows carry a PDF source-line coordinate when the parser recorded one; null rows are reconciled by reason, and parser-output gaps are enumerated in house_clerk_gap_register. Senate eFD records are parsed as filing transactions rather than House PTR PDF lines, so source_line_number is null by design.

provenance.parsed_atstring (date-time)

When the parser generation named in parser_version produced this version of the row. A reparse under a new parser writes a new version with its own parsed_at; the earlier version stays in /history.

provenance.parser_versionstring

The parser generation that produced this version (for example house-ptr-line-v2). Not part of content_hash, so a reparse that changes no filing fact changes no hash.

provenance.methodology_versionstring

The admission and derivation rules this row was served under, currently receipt-or-drop-v1. A rule change ships as a new label and a changelog entry; see the stability policy.

provenance.source_ingested_atstring (date-time)

When the source record entered Veridion's warehouse. first_observed_at is never later than this; the two differ when identity resolution carried an earlier observation forward.

provenance.first_observed_atstring (date-time)

When Veridion first observed this row. Immutable and used by the as_of filter.

Problem6 fields · GET /api/v1/coverage, GET /api/v1/disclosures, GET /api/v1/disclosures/{disclosure_id}, GET /api/v1/disclosures/{disclosure_id}/history, GET /api/v1/export, GET /api/v1/members, GET /api/v1/status

RFC 9457 problem detail.

FieldTypeMeaning
typestring (uri)

Dereferences to the catalog entry for this problem at https://www.veridionmarkets.com/data-api/problems/{code}: what it means, who has to change something, and whether to retry.

codestring

Stable short identifier for the problem, identical to the last path segment of type. Branch on this, not on title.

titlestring
statusinteger
detailstring | null
request_idstring

Equals the X-Request-ID response header. Quote it to support.

LegacyError2 fields · GET /api/v1/members
FieldTypeMeaning
errorstring
detailoptionalstring
MemberDirectoryPage34 fields · GET /api/v1/members
FieldTypeMeaning
dataarray
data[].member_idstring
data[].identityobject
data[].identity.bioguidestring | null
data[].identity.systemliteral= us_congress_bioguide
data[].identity.notestring | null
data[].full_namestring | null
data[].chamberstring | null
data[].partystring | null
data[].statestring | null
data[].districtstring | null

House district as STATE-N, 0 for an at-large seat; null for senators and executive-branch filers. The same form every disclosure row's member.district uses.

data[].coverageobject
data[].coverage.disclosures_availableinteger
data[].coverage.filings_pending_receiptinteger
data[].coverage.filings_pending_qualificationinteger
data[].coverage.latest_filed_datestring | null
data[].coverage.average_filing_delay_daysnumber | null
countinteger
identity_joinenummeasured · unavailable
served_atstring (date-time)
cacheobject
cache.policyliteral= public
cache.browser_max_age_secondsliteral= 0
cache.cdn_max_age_secondsliteral= 300
cache.declared_max_staleness_secondsliteral= 300
cache.age_headerliteral= Age
cache.freshness_referenceobject
cache.freshness_reference.sourceliteral= congress
cache.freshness_reference.source_expected_max_age_secondsliteral= 21600
cache.freshness_reference.delivery_max_staleness_secondsliteral= 300
cache.freshness_reference.delivery_to_source_threshold_ratioliteral= 1/72
cache.freshness_reference.basisstring
versionliteral= 1.3.17
noticestring
PublicCoverage147 fields · GET /api/v1/coverage
FieldTypeMeaning
datasetliteral= veridion-disclosure-api
versionliteral= v1-preview
generated_atstring (date-time)
cacheobject
cache.policyliteral= no-store

The cache contract this response was served under; always no-store for a measurement. Rendered as Cache-Control: no-store, max-age=0 with CDN-Cache-Control and Vercel-CDN-Cache-Control: no-store, and echoed in X-Veridion-Cache-Policy.

cache.browser_max_age_secondsliteral= 0

Seconds a browser or client cache may reuse this body without revalidating; 0, the max-age the Cache-Control header carries.

cache.cdn_max_age_secondsliteral= 0

Seconds the CDN may reuse this body; 0, because CDN-Cache-Control is no-store. Public record responses declare a nonzero value here; measurements never do.

cache.declared_max_staleness_secondsliteral= 0

The upper bound on how old this body can be when it reaches a client, counted from generated_at; 0 for a measurement, and the same number the X-Veridion-Cache-Max-Staleness header carries.

cache.age_headernull

The name of the response header that reports how long a cache held this body, or null when no cache is permitted to hold it, as here. Public record responses name the Age header.

descriptionstring
servingobject

Rows /v1/disclosures returns right now, counted from the serving view at read time after every exclusion. Not the count of rows that qualify. Every count is nullable because the measurement reports unavailable rather than guessing when it cannot reach the view.

serving.stateenummeasured · unavailable
serving.measured_atstring (date-time)
serving.basisstring
serving.total_rowsinteger | null
serving.by_source_systemobject
serving.by_source_system.house_clerkinteger | null
serving.by_source_system.senate_efdinteger | null
serving.by_source_system.ogeinteger | null
serving.by_chamberobject
serving.by_chamber.houseinteger | null
serving.by_chamber.senateinteger | null
serving.by_chamber.executiveinteger | null
congressobject
congress.measured_atstring (date-time) | null
congress.as_ofstring (date-time) | null
congress.age_secondsnumber | null
congress.expected_max_age_secondsnumber
congress.threshold_basisstring
congress.detailstring | null
congress.stateliteral= ready
congress.warehouse_rowsinteger
congress.unique_membersinteger
congress.unique_tickersinteger
congress.unique_filingsinteger
congress.first_party_verified_rowsinteger
congress.licensed_feed_document_reference_rowsinteger

Licensed-feed rows for which the warehouse holds a valid HTTPS document reference.

congress.licensed_feed_rowsinteger

Deprecated compatibility alias for licensed_feed_document_reference_rows; this is not the total licensed-feed population.

congress.no_document_reference_rowsinteger
congress.document_reference_definitionsobject
congress.document_reference_definitions.first_party_verified_rowsstring
congress.document_reference_definitions.licensed_feed_document_reference_rowsstring
congress.document_reference_definitions.licensed_feed_rowsstring
congress.document_reference_definitions.no_document_reference_rowsstring
congress.receipt_linked_rowsinteger

Deprecated compatibility alias for rows with a document URL.

congress.deprecated_fieldsarray
congress.field_successorsobject
congress.field_successors.licensed_feed_rowsliteral= licensed_feed_document_reference_rows
congress.amount_disclosed_rowsinteger
congress.amount_disclosed_pctnumber | null
congress.by_chamberobject
congress.by_chamber.houseobject
congress.by_chamber.house.rowsinteger
congress.by_chamber.house.amount_disclosed_rowsinteger
congress.by_chamber.senateobject
congress.by_chamber.senate.rowsinteger
congress.by_chamber.senate.amount_disclosed_rowsinteger
congress.last_90_daysobject
congress.last_90_days.rowsinteger
congress.last_90_days.unique_filingsinteger
congress.last_90_days.unique_membersinteger
provenanceobject
provenance.stateenummeasured · unavailable
provenance.total_rowsinteger | null
provenance.measured_atstring (date-time)
provenance.by_collection_channelobject
provenance.by_collection_channel.house_clerk_direct_ocrinteger | null
provenance.by_collection_channel.senate_efd_directinteger | null
provenance.by_collection_channel.licensed_bulk_feedinteger | null
provenance.self_collected_rowsinteger | null
provenance.licensed_feed_rows_totalinteger | null

All rows collected through the licensed-feed channel, whether or not a government document reference is held.

provenance.third_party_rowsinteger | null

Deprecated compatibility alias for licensed_feed_rows_total.

provenance.unattributed_rowsinteger | null
provenance.deprecated_fieldsarray
provenance.field_successorsobject
provenance.field_successors.third_party_rowsliteral= licensed_feed_rows_total
provenance.by_receipt_officeobject
provenance.by_receipt_office.us_house_clerkinteger | null
provenance.by_receipt_office.us_senate_efdinteger | null
provenance_field_coverageobject
provenance_field_coverage.stateliteral= measured
provenance_field_coverage.measured_atstring (date-time)
provenance_field_coverage.rows_examinedinteger
provenance_field_coverage.fieldsarray
provenance_field_coverage.fields[].source_systemenumhouse_clerk · senate_efd
provenance_field_coverage.fields[].fieldliteral= source_line_number
provenance_field_coverage.fields[].populatedinteger
provenance_field_coverage.fields[].examinedinteger
provenance_field_coverage.fields[].ratenumber

populated divided by examined. The integer denominator and numerator remain authoritative.

provenance_field_coverage.fields[].null_interpretationenumgap · not_applicable
provenance_field_coverage.fields[].reasonstring
provenance_field_coverage.house_clerk_gap_classesarray
provenance_field_coverage.house_clerk_gap_classes[].reasonenumwarehouse_fallback_without_line_provenance · parser_output_without_line_provenance
provenance_field_coverage.house_clerk_gap_classes[].affected_rowsinteger
provenance_field_coverage.house_clerk_gap_classes[].classificationstring
provenance_field_coverage.house_clerk_gap_registerarray
provenance_field_coverage.house_clerk_gap_register[].document_idstring
provenance_field_coverage.house_clerk_gap_register[].affected_rowsinteger
provenance_field_coverage.house_clerk_gap_register[].parser_versionsarray
provenance_field_coverage.house_clerk_gap_register[].reasonliteral= parser_output_without_line_provenance
provenance_field_coverage.detailnull
house_clerk_ptr_completenessobject

Exact per-year DocID membership against completed House Clerk PTR indexes. No cross-year aggregate coverage rate is published because archive-year and filing-date buckets are different scopes.

house_clerk_ptr_completeness.stateliteral= measured
house_clerk_ptr_completeness.measured_atstring (date-time)
house_clerk_ptr_completeness.age_secondsinteger
house_clerk_ptr_completeness.expected_max_age_secondsliteral= 172800
house_clerk_ptr_completeness.rows_examinedinteger
house_clerk_ptr_completeness.source_year_startliteral= 2015
house_clerk_ptr_completeness.source_year_endliteral= 2026
house_clerk_ptr_completeness.source_yearsliteral= 12
house_clerk_ptr_completeness.measurement_definitionstring
house_clerk_ptr_completeness.missing_document_ids_retainedliteral= true
house_clerk_ptr_completeness.yearsarray
house_clerk_ptr_completeness.years[].yearinteger
house_clerk_ptr_completeness.years[].stateliteral= measured
house_clerk_ptr_completeness.years[].rows_examinedinteger
house_clerk_ptr_completeness.years[].clerk_published_documentsinteger
house_clerk_ptr_completeness.years[].documents_heldinteger
house_clerk_ptr_completeness.years[].documents_missinginteger
house_clerk_ptr_completeness.years[].ratenumber

documents_held divided by clerk_published_documents for this archive year. Counts are authoritative; a value of 1 is emitted only when documents_missing is exactly zero.

house_clerk_ptr_completeness.years[].missing_by_classificationobject
house_clerk_ptr_completeness.years[].missing_by_classification.never_attemptedinteger
house_clerk_ptr_completeness.years[].missing_by_classification.attempted_failedinteger
house_clerk_ptr_completeness.years[].missing_by_classification.present_under_different_identifierinteger
house_clerk_ptr_completeness.years[].detailnull
house_clerk_ptr_completeness.detailnull
provenance_reconciliationobject
provenance_reconciliation.stateliteral= reconciled
provenance_reconciliation.rows_examinedinteger
provenance_reconciliation.measurement_timestampsobject
provenance_reconciliation.measurement_timestamps.receipt_referencestring (date-time)
provenance_reconciliation.measurement_timestamps.collection_ownershipstring (date-time)
provenance_reconciliation.licensed_feed_rows_totalinteger
provenance_reconciliation.licensed_feed_document_reference_rowsinteger
provenance_reconciliation.licensed_feed_rows_without_document_referenceinteger
provenance_reconciliation.licensed_feed_rows_without_document_reference_pct_of_licensed_feednumber | null
provenance_reconciliation.licensed_feed_rows_without_document_reference_pct_of_warehousenumber | null
provenance_reconciliation.reasonstring
provenance_reconciliation.relationshipsarray
provenance_reconciliation.detailnull
sources_of_recordarray
sources_of_record[].officestring
sources_of_record[].urlstring (uri)
sources_of_record[].publishingboolean

Whether this office publishes rows into v1 today. sec_edgar is listed and false: it is the declared scope boundary, not an omission. A reader should learn the boundary from the response rather than infer it from a query that returns nothing.

exclusionsarray
noticestring
request_accessstring (uri)
ExportManifest22 fields · GET /api/v1/export
FieldTypeMeaning
snapshotobject
snapshot.snapshot_daystring (date)
snapshot.generated_atstring (date-time)
snapshot.snapshot_as_ofstring (date-time)
snapshot.snapshot_generationinteger
snapshot.row_countinteger
snapshot.source_row_countinteger
snapshot.rows_dropped_failed_validationinteger
snapshot.duplicate_row_countinteger
snapshot.byte_sizeinteger
snapshot.sha256string
snapshot.merkle_rootstring | null

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. Null for a snapshot generated before 1.3.6. Verify with scripts/verify-disclosure-export.mjs --sha256 <sha256> --root <merkle_root>.

snapshot.content_hash_basisstring | null
snapshot.methodology_versionstring
snapshot.artifact_verified_atstring (date-time)
snapshot.formatliteral= ndjson+gzip
snapshot.schemastring (uri)
downloadobject
download.urlstring (uri)
download.expires_in_secondsinteger
integritystring
versionliteral= 1.3.17
PublicStatus173 fields · GET /api/v1/status
FieldTypeMeaning
versionliteral= 1.3.17

The contract version this response was produced under; the same value as X-API-Version.

generated_atstring (date-time)

When this response was computed. Every age_seconds below is measured from this instant, so the block is internally consistent even when read from a cache.

cacheobject

Always no-store with zero max-age at every layer: a status page that could be served stale would defeat itself. age_header is null because no cache is permitted to add one.

cache.policyliteral= no-store

The cache contract this response was served under; always no-store for a measurement. Rendered as Cache-Control: no-store, max-age=0 with CDN-Cache-Control and Vercel-CDN-Cache-Control: no-store, and echoed in X-Veridion-Cache-Policy.

cache.browser_max_age_secondsliteral= 0

Seconds a browser or client cache may reuse this body without revalidating; 0, the max-age the Cache-Control header carries.

cache.cdn_max_age_secondsliteral= 0

Seconds the CDN may reuse this body; 0, because CDN-Cache-Control is no-store. Public record responses declare a nonzero value here; measurements never do.

cache.declared_max_staleness_secondsliteral= 0

The upper bound on how old this body can be when it reaches a client, counted from generated_at; 0 for a measurement, and the same number the X-Veridion-Cache-Max-Staleness header carries.

cache.age_headernull

The name of the response header that reports how long a cache held this body, or null when no cache is permitted to hold it, as here. Public record responses name the Age header.

stateenumready · degraded · unavailable

ready when no check below is failing. degraded when any source is stale or unavailable, the export is stale, unavailable or missing its merkle_root, coverage recovery is stale or unavailable, the Congress summary is stale, unavailable or unattested, a temporal-conformance contract fails, the temporal window is unreadable, the House index lists unaccounted filings, or a pipeline job is not delivering. unavailable when the status itself could not be measured. The endpoint never reports a state more optimistic than its own arithmetic: a stored 'ready' older than its threshold is reported stale.

detailoptionalstring

Present only on the unavailable body, naming what could not be read.

temporal_windowobject

How far back as_of reads can go. The floor is the activation instant of retained payload history; depth is the time since. Neither says anything about filing completeness before the floor, which is what /v1/coverage measures.

temporal_window.stateenumavailable · unavailable

available when the temporal dataset-state resolver answered; unavailable when it did not, which degrades the endpoint with the reason in detail.

temporal_window.point_in_time_floorstring (date-time) | null

Inclusive millisecond boundary from the same temporal dataset-state resolver used by disclosure queries; null if unreadable.

temporal_window.depth_daysnumber | null

Unrounded (measured_at - point_in_time_floor) / 86400000 milliseconds. Temporal depth is not filing completeness; null means unmeasured.

temporal_window.measured_atstring (date-time)

The instant depth_days was measured against; equals generated_at.

temporal_window.retention_regimeliteral= growing

Retained versions are close-only and generations append-only; the current mechanism has no age-based rolling prune.

temporal_window.basisstring

The sentence stating how the floor and depth are measured, carried on every response.

temporal_window.detailstring | null

Why the window is unavailable, when it is; null when available.

degraded_reasonsarray

Which checks pulled state down, and the measurement behind each. Empty when state is 'ready', and empty when state is 'unavailable' because nothing could be measured. This names the cause; it does not change when the endpoint reports degraded.

degraded_reasons[].checkstring

The check that failed, named as the block it lives in: source:<system>, source:<system>:index_reconciliation, bulk_export, bulk_export:merkle_root, coverage_recovery, congress_public_summary, temporal_conformance, temporal_window, pipeline:attendance, or pipeline:<cron>.

degraded_reasons[].measuredstring

The measurement behind the failure, quoted with its numbers and timestamps, so a caller can act on it without diffing the block it came from.

sourcesarray

Freshness of every source Veridion polls, measured from the same table the serving views read. One entry per source system, including the ones that publish nothing.

sources[].source_systemstring | null

house_clerk, senate_efd, oge or sec_edgar. sec_edgar is listed in no_data state as a declared scope boundary, so a reader learns it from the response rather than from a query that returns nothing.

sources[].statestring

ready: the last poll succeeded within expected_max_age_seconds. stale: the stored state says ready but last_success_at is older than the threshold; the worse of the two is reported. source_unavailable: the most recent poll failed. no_data: the source publishes no rows into v1 by policy. unknown: the stored state was unreadable.

sources[].last_success_atstring | null

When the source was last polled successfully; null if never.

sources[].failure_sincestring | null

When the current run of failed polls began; null while polls succeed.

sources[].age_secondsnumber | null

generated_at minus last_success_at, in whole seconds; null when there is no success to measure from.

sources[].expected_max_age_secondsnumber | null

The age past which the source reads stale: 86400 for House Clerk and Senate eFD, 3888000 (45 days) for OGE annual filings, null for sec_edgar which has no poll to age.

sources[].threshold_basisstring | null

An operational alerting threshold chosen by Veridion. Not a service commitment; commercial terms live in a license.

sources[].detailstring | null

The stored explanation for the state, as the poller recorded it; the no_data boundary statement for sec_edgar.

sources[].index_reconciliationobject | null

The government's own index reconciled against what this API serves, when a source publishes an index we can read (House Clerk PTR search). Age says when we last succeeded; this says whether the index lists filings we do not yet account for. Null for sources without a readable index.

sources[].index_reconciliation.stateenumcurrent · unaccounted · index_unavailable · unmeasured

current: every document on the index since cutoff_date is accounted for (parsed, or terminal without qualifying rows). unaccounted: at least one is not. index_unavailable: the government index could not be read at the last check. unmeasured: no reconciliation newer than expected_max_age_seconds.

sources[].index_reconciliation.checked_atstring (date-time) | null

When the hourly ingest run last reconciled the House Clerk's searchable PTR index against the warehouse; null when no reconciliation has been stored.

sources[].index_reconciliation.age_secondsnumber | null

generated_at minus checked_at, in whole seconds, floored at zero; null when checked_at is null.

sources[].index_reconciliation.expected_max_age_secondsnumber

The age past which the reconciliation is reported unmeasured: 21600 (6 h), the same threshold as the Congress summary, because the same hourly ingest cadence refreshes both. An operational alerting threshold, not a service commitment.

sources[].index_reconciliation.cutoff_datestring (date) | null

The earliest filing date the reconciliation examined: the check date minus 14 days. Documents filed before it are outside this measurement.

sources[].index_reconciliation.documents_on_indexinteger | null

Documents the Clerk's index listed with a filing date on or after cutoff_date at the last check; null when the index could not be read.

sources[].index_reconciliation.parsed_documentsinteger | null

Of documents_on_index, those the parser finished with qualifying rows that are served.

sources[].index_reconciliation.terminal_without_rowsinteger | null

Documents the parser finished and found no qualifying transaction rows in; accounted for, not served.

sources[].index_reconciliation.unaccounted_documentsinteger | null

Documents on the index since cutoff_date that are neither served nor terminal without rows, plus any document the discovery pass could not fetch. Any value above zero degrades the endpoint.

sources[].index_reconciliation.latest_index_filing_datestring (date) | null

The newest filing date among documents_on_index; null when there are none.

sources[].index_reconciliation.latest_served_filing_datestring (date) | null

The newest filing date among parsed_documents; the gap to latest_index_filing_date is the visible lag of the served corpus behind the government index.

sources[].index_reconciliation.unaccounted_samplearray

Up to five unaccounted documents with the recorded reason.

sources[].index_reconciliation.unaccounted_sample[].doc_idstring

The House Clerk DocID of the unaccounted filing.

sources[].index_reconciliation.unaccounted_sample[].filing_datestring (date) | null

The filing date the index lists for it; null when the index gave none.

sources[].index_reconciliation.unaccounted_sample[].reasonstring

The recorded overlay status and reason, as status:reason, or overlay_row_missing when the document was never attempted, truncated to 200 characters.

bulk_exportoptionalobject

The daily bulk snapshot: its day, generation, size, file hash and Merkle commitment. Absent only on the unavailable body.

bulk_export.statestring

ready: the latest daily snapshot manifest is readable and younger than expected_max_age_seconds. stale: older. unavailable: the manifest could not be read. no_snapshot_yet: none has been written.

bulk_export.latest_snapshot_daystring | null

The UTC day the newest snapshot was pinned to, the same day /v1/export names.

bulk_export.generated_atstring | null

When the newest snapshot finished writing and its manifest was recorded.

bulk_export.snapshot_generationinteger | null

The temporal generation the snapshot was pinned to; the same value as_of reads and /v1/export report for that day.

bulk_export.row_countinteger | null

Rows in the snapshot file after validation; the leaves the merkle_root commits to.

bulk_export.rows_dropped_failed_validationinteger | null

Rows the serving view returned that failed the contract schema and were left out of the file rather than written broken. Zero is the expected value; a positive count is published, never hidden.

bulk_export.byte_sizeinteger | null

Size in bytes of the stored snapshot file, as verified after writing.

bulk_export.sha256string | null

sha256, hex, of the stored snapshot file. Verify a download against it before reading.

bulk_export.merkle_rootstring | null

Merkle root over every row's content_hash in the export: leaves in disclosure_id order, sha256 over the concatenated 32-byte child digests, an odd node paired with itself. Recomputed from the stored bytes before the manifest was written. Null for a snapshot generated before 1.3.6. scripts/verify-disclosure-export.mjs recomputes it from a downloaded export with no network and compares it with this value.

bulk_export.content_hash_basisstring | null

The content_hash basis the leaves were hashed under (veridion-disclosure-content-v1). Set exactly when merkle_root is set.

bulk_export.age_secondsnumber | null

generated_at minus the snapshot's generated_at, in whole seconds.

bulk_export.expected_max_age_secondsnumber

108000 (30 hours): the snapshot runs daily at 07:40 UTC, so one slow run passes and a fully missed day is flagged before a second day of silence.

bulk_export.threshold_basisstring

An operational alerting threshold chosen by Veridion. Not a service commitment; commercial terms live in a license.

bulk_export.detailstring | null

Why the export is not ready, when it is not; null when ready.

observation_delayoptionalobject

Hours from a filing's filed_date to Veridion's first observation, per source. Published only over rows with verified continuity; withheld with the reason otherwise. Absent only on the unavailable body.

observation_delay.stateenummeasured · partial · unavailable

measured when every eligible source has a published distribution; partial when some do; unavailable when none does. Never degrades the endpoint: an unpublished distribution is a disclosed limit, not a failure of served rows.

observation_delay.computed_atstring

When the observation-delay report was computed; the same report /data-api renders.

observation_delay.basisstring

The sentence stating the measurement and its eligibility rule, carried on every response.

observation_delay.sourcesarray

One entry per eligible source, measured or unevaluated with its record.

observation_delay.sources[].stateliteral= measured

A distribution is published for this source.

observation_delay.sources[].source_systemenumhouse_clerk · senate_efd

The source measured. OGE is excluded by policy: one annual document is one event, not a distribution.

observation_delay.sources[].observation_started_onstring

The configured day continuous observation of this source began.

observation_delay.sources[].window_startstring

Earliest filed_date of a row in the distribution.

observation_delay.sources[].window_endstring

Latest filed_date of a row in the distribution.

observation_delay.sources[].measured_rowsinteger

Rows in the distribution: served rows whose source has verified daily continuity for every day between filed_date and first observation.

observation_delay.sources[].median_hoursnumber

Median of first_observed_at minus filed_date, in hours, over measured_rows.

observation_delay.sources[].p95_hoursnumber | null

95th percentile in hours; null when withheld under 100 rows.

observation_delay.sources[].max_hoursnumber

The largest observation delay in the distribution, in hours.

observation_delay.sources[].percentile_stateenummeasured · withheld_small_n

withheld_small_n when measured_rows is under 100, in which case p95_hours is null.

pipelineoptionalobject

Attendance of the jobs that produce this API's data, from the cron attendance store. Absent only on the fail-closed 503 body. A missed, died or never-run job, a failed export run, or an unreadable store degrades the endpoint by name.

pipeline.stateenumready · degraded · unavailable

degraded when any listed job is not delivering: no successful completion since its most recent due slot, its latest run died, it has never run, or (export job only) its latest run failed. unavailable when the attendance store could not be read, which also degrades the endpoint.

pipeline.measured_atstring

When attendance was evaluated; the 24-hour window ends here.

pipeline.observation_started_atstring | null

When the attendance instrument was installed. Due slots are counted only after this instant.

pipeline.instrumented_jobsinteger

Deprecated in 1.3.14; the same value as instrumented_invocations. Kept for additive compatibility.

pipeline.unwrapped_jobsinteger

Deprecated in 1.3.14; the same value as unwrapped_invocations.

pipeline.scheduled_jobsinteger

Deprecated in 1.3.14; the same value as scheduled_invocations.

pipeline.instrumented_invocationsinteger

Distinct scheduled invocations (pathname plus query) whose route records attendance. One route scheduled under several query shapes counts once per shape, because a due slot belongs to one invocation.

pipeline.unwrapped_invocationsinteger

Distinct scheduled invocations whose route records no attendance.

pipeline.scheduled_invocationsinteger

instrumented_invocations plus unwrapped_invocations: every distinct invocation in vercel.json.

pipeline.instrumented_routesinteger

Distinct cron pathnames that record attendance. This is the coverage figure: read it, not the invocation pair, when asking how much of the cron surface is watched.

pipeline.unwrapped_routesinteger

Distinct cron pathnames that record no attendance.

pipeline.scheduled_routesinteger

instrumented_routes plus unwrapped_routes: every distinct cron pathname in vercel.json.

pipeline.schedule_entriesinteger

Lines in vercel.json's cron list. Exceeds scheduled_invocations when one URL carries more than one schedule.

pipeline.deprecated_fieldsarray

Fields in this block that are kept for compatibility and should not be read for new work.

pipeline.field_successorsobject

For each deprecated field, the field that carries the same value under its correct name.

pipeline.basisstring

The full statement of how attendance is measured: the store, the two units, slot attribution and its tolerance, and what each job state means. Carried on every response so the numbers never travel without their rules.

pipeline.detailstring | null

Why the block is unavailable, when it is; null otherwise.

pipeline.jobsarray

The jobs that produce this API's data, one entry per invocation shape observed or scheduled.

pipeline.jobs[].cron_namestring

The invocation as scheduled: pathname plus query string, exactly as vercel.json lists it.

pipeline.jobs[].schedulesarray

Every cron expression vercel.json schedules this invocation under; empty when it appears in none.

pipeline.jobs[].scheduled_jobboolean

false for an invocation shape that appears in no vercel.json entry. It has no due slots and cannot miss one; it is listed rather than hidden.

pipeline.jobs[].stateenumunwrapped · unevaluated · never_ran · missed · running · died · failed · wrote_zero · write_count_unavailable · succeeded

The job now, not the last 24 hours. missed: a due slot with no run attributed. died: the latest attempt started and never finished within its ceiling. failed: the latest run returned an error. wrote_zero: the latest run succeeded and wrote no rows. write_count_unavailable: succeeded, count unreadable. running: the latest run has not finished and is within its ceiling. never_ran: no run recorded although slots were due. unevaluated: attendance could not be read, or no run and no due slot yet. unwrapped: the route records no attendance. Precedence in that order when several apply.

pipeline.jobs[].expected_slots_24hinteger | null

Due slots in the window, from the schedules, counted only after observation_started_at.

pipeline.jobs[].observed_slots_24hinteger | null

Due slots in the window that a run was attributed to.

pipeline.jobs[].missed_count_24hinteger | null

expected_slots_24h minus observed_slots_24h.

pipeline.jobs[].unattributed_runs_24hinteger | null

Runs that started in the window and attribute to no due slot, counted rather than dropped, because they ran.

pipeline.jobs[].died_countinteger | null

Runs in the window that started and never finished within their ceiling, including ones a later run has since superseded. History; the state field describes now.

pipeline.jobs[].last_okstring | null

When the job last completed successfully; null if never.

pipeline.jobs[].latest_runobject | null

The most recent run of this invocation; null when it has never run.

pipeline.jobs[].latest_run.started_atstring

When the latest run started.

pipeline.jobs[].latest_run.finished_atstring | null

When the latest run finished; null while running or after it died.

pipeline.jobs[].latest_run.okboolean | null

Whether the latest run reported success; null until it finishes.

pipeline.jobs[].latest_run.rows_writteninteger | null

Rows the latest run wrote, in the unit rows_written_basis names; null when the run did not report one.

pipeline.jobs[].latest_run.rows_written_basisstring

What rows_written counts, named per route, because a row means different things to different jobs.

pipeline.jobs[].latest_run.http_statusinteger | null

The HTTP status the run returned; null while running.

pipeline.jobs[].latest_run.errorstring | null

The run's own error text, with credentials and URLs redacted; null on success.

coverage_recoveryoptionalobject

Where House Clerk document recovery stands: how many documents are parsed, queued, failing, terminally failed, or withheld by the lossless-reparse check. Absent only on the unavailable body.

coverage_recovery.stateenumready · recovery_in_progress · complete_with_terminal_gaps · stale · unavailable

ready: every House document is parsed or terminal and the stamped measurement is current. recovery_in_progress: documents remain pending or in progress. complete_with_terminal_gaps: nothing pending, but some documents ended in a terminal failure. stale: the stamped measurement is older than its budget. unavailable: it could not be read. Any state other than ready degrades the endpoint with the measurement quoted, as does a refresh_outcome other than succeeded.

coverage_recovery.computed_atstring | null

When the stamped coverage measurement was computed.

coverage_recovery.is_staleboolean

true when computed_at is older than the measurement's own stale_after budget.

coverage_recovery.documents_totalinteger | null

House Clerk PTR documents known to the recovery ledger.

coverage_recovery.pendinginteger | null

Documents queued for a parse or reparse and not yet attempted.

coverage_recovery.in_progressinteger | null

Documents with an attempt under way.

coverage_recovery.failedinteger | null

Documents whose latest attempt failed and will be retried.

coverage_recovery.failed_terminalinteger | null

Documents whose attempts are exhausted; no further retry is scheduled and no rows are served from them.

coverage_recovery.parser_reparse_row_lossinteger | null

Documents where a reparse produced fewer rows than were served before and the lossless check rejected the replacement. Those documents are absent from the API rather than served with a lossy replacement.

coverage_recovery.refresh_outcomeobject

The latest recorded refresh of the coverage measurement, so a reader can tell a fresh number from a stale one.

coverage_recovery.refresh_outcome.stateenumsucceeded · failed · unevaluated · unavailable

The recorded outcome of the latest coverage refresh; unevaluated when none has been recorded; unavailable when the record could not be read.

coverage_recovery.refresh_outcome.stageenum | nullparser_state · coverage_snapshot · complete

The stage the latest refresh reached: parser_state, then coverage_snapshot, then complete.

coverage_recovery.refresh_outcome.attempted_atstring | null

When the latest refresh started.

coverage_recovery.refresh_outcome.completed_atstring | null

When the latest refresh finished; null if it did not.

coverage_recovery.refresh_outcome.age_secondsnumber | null

generated_at minus completed_at, in whole seconds.

coverage_recovery.refresh_outcome.rows_examinedinteger

Documents the refresh examined to produce the counts above.

coverage_recovery.refresh_outcome.parser_state_duration_msinteger | null

Milliseconds spent in the parser_state stage.

coverage_recovery.refresh_outcome.coverage_refresh_duration_msinteger | null

Milliseconds spent in the coverage_snapshot stage.

coverage_recovery.refresh_outcome.route_duration_msinteger | null

Milliseconds for the whole refresh route invocation.

coverage_recovery.refresh_outcome.error_codestring | null

The stable code of the failure, when the refresh failed; null otherwise.

coverage_recovery.refresh_outcome.detailstring | null

The failure's own text, or why no outcome could be read; null on success.

coverage_recovery.detailstring | null

Why the block is stale or unavailable, when it is; null otherwise.

congress_public_summaryoptionalobject

The Congress public summary that /api/congress/summary serves, its age, and whether the newest owner outcome attests to it. Absent only on the unavailable body.

congress_public_summary.stateenumready · stale · unavailable · unattested · succeeded · failed · unevaluated · running · stalled

ready: the newest successful refresh outcome attests to the served summary. unattested: the summary's refreshed_at is newer than any recorded outcome, so the served figures were written by a path that did not record its outcome. stale/unavailable: age or read failure. The remaining values echo refresh_outcome.state when no better word applies; 'succeeded' is no longer emitted.

congress_public_summary.refreshed_atstring (date-time) | null

When the served Congress summary was last rewritten, in the warehouse's own timestamp form.

congress_public_summary.age_secondsnumber | null

generated_at minus refreshed_at, in whole seconds.

congress_public_summary.expected_max_age_secondsnumber

21600 (6 hours): the summary's independently scheduled owner runs every four hours.

congress_public_summary.threshold_basisstring

An operational alerting threshold chosen by Veridion. Not a service commitment; commercial terms live in a license.

congress_public_summary.warehouse_rowsinteger | null

Congressional warehouse rows the summary was computed over, including rows not yet qualified for the API.

congress_public_summary.refresh_outcomeobject

The newest outcome recorded by the summary's owner, which is what attests the served figures.

congress_public_summary.refresh_outcome.stateenumsucceeded · failed · unevaluated · running · stalled · unavailable

The newest recorded outcome of the summary's owner: succeeded or failed at a stage, running while an attempt is open, stalled when an open attempt has outlived its ceiling, unevaluated when none is recorded, unavailable when the ledger could not be read.

congress_public_summary.refresh_outcome.attempt_idstring | null

The owner attempt this outcome belongs to. Every refresh of the summary records one; a summary refreshed without one reads unattested.

congress_public_summary.refresh_outcome.stageenum | nullpreflight · amount_coverage · public_summary · disclosure_aggregates · verification · complete

The stage the attempt reached, in order: preflight, amount_coverage, public_summary, disclosure_aggregates, verification, complete.

congress_public_summary.refresh_outcome.started_atstring (date-time) | null

When the attempt started.

congress_public_summary.refresh_outcome.observed_atstring (date-time) | null

When the terminal event was recorded.

congress_public_summary.refresh_outcome.age_secondsnumber | null

generated_at minus observed_at, in whole seconds.

congress_public_summary.refresh_outcome.rows_examinedinteger

Warehouse rows the attempt examined; zero on a failure before the summary stage.

congress_public_summary.refresh_outcome.warehouse_rowsinteger | null

Warehouse rows at the time of the attempt, as the owner counted them.

congress_public_summary.refresh_outcome.summary_refreshed_atstring (date-time) | null

The refreshed_at the attempt stamped on the summary. When this equals the block's refreshed_at, the served summary is attested by this outcome.

congress_public_summary.refresh_outcome.amount_coverage_duration_msinteger | null

Milliseconds in the amount_coverage stage.

congress_public_summary.refresh_outcome.public_summary_duration_msinteger | null

Milliseconds in the public_summary stage.

congress_public_summary.refresh_outcome.disclosure_aggregates_duration_msinteger | null

Milliseconds in the disclosure_aggregates stage.

congress_public_summary.refresh_outcome.total_duration_msinteger | null

Milliseconds for the whole attempt.

congress_public_summary.refresh_outcome.error_codestring | null

The stable code of the failure, when the attempt failed; null otherwise.

congress_public_summary.refresh_outcome.detailstring | null

The failure's own text; null on success.

congress_public_summary.detailstring | null

Why the summary is not ready, when it is not; null when ready.

temporal_conformanceoptionalobject

The four temporal contracts, verified against the pinned bulk snapshot. A failing contract degrades the endpoint by name. Absent only on the unavailable body.

temporal_conformance.stateenumready · degraded · unavailable

ready when every contract passed on the pinned snapshot; degraded when any failed; unavailable when the snapshot could not be read.

temporal_conformance.computed_atstring | null

When the contracts were last verified, against the pinned bulk snapshot.

temporal_conformance.contractsarray

One entry per contract, T1 through T4.

temporal_conformance.contracts[].contractenumT1 · T2 · T3 · T4

T1: point-in-time reads exclude later versions. T2: pagination stays fixed while writes continue. T3: incremental sync reconstructs the full set. T4: restatements preserve permanent row identity.

temporal_conformance.contracts[].stateenumpass · fail · unevaluated

pass with zero violations; fail with the count; unevaluated when the evidence is missing.

temporal_conformance.contracts[].violationsinteger | null

Rows that broke the contract; null when unevaluated.

temporal_conformance.contracts[].rows_examinedinteger

Rows the contract was checked over.

temporal_conformance.contracts[].verified_onstring | null

The UTC day the contract was last verified.

institutional_deliveryobject

A declared boundary, stated rather than discovered.

institutional_delivery.availableliteral= false

Always false in v1: no institutional delivery channel is offered through this endpoint.

institutional_delivery.reasonliteral= first_party_provenance_not_proven

The declared reason: first-party provenance for institutional delivery has not been proven and is not claimed.

noticeoptionalstring

Standing guidance on reading this block: what no_data means, what degraded does and does not imply, and how to verify a download.

Errors

Every problem response carries a stable `code` from the catalog at /data-api/problems and a `type` URL that resolves to that code's page. Codes are added, never reused or removed within a major version. The request_id in the body equals the X-Request-ID header; quote it to support@veridionmarkets.com.

HTTP 400

HTTP 401

HTTP 403

HTTP 404

HTTP 409

HTTP 429

HTTP 503

Caching and rate limits

Free tier
60 requests per 3600 seconds per IP, 25 rows per page. Declared on every free response: X-RateLimit-Limit: 60 X-RateLimit-Policy: 60;w=3600. Exceeding it returns 429 with Retry-After.
Record responses
Public, browser max-age 0s, shared cache max-age 300s, with an Age header stating how long the copy has been held. Weak ETag and If-None-Match on list and lookup operations.
OpenAPI document
Public, browser max-age 3600s, shared cache max-age 86400s. Generated at 2026-09-06T23:46:55.190Z; the version is in info.version.
Status and coverage
Never cached; each read is a measurement. `/v1/status` reports what was measured and degrades itself when its own arithmetic says so; every degraded state names each cause in `degraded_reasons`. Thresholds are operational alerting thresholds chosen by Veridion and are labelled as such in the response; they are not a service commitment. Commercial terms, where they exist, live in a license, never in this document.

Retention, stability, changelog

Point-in-time history grows from a fixed retained-history floor, not a rolling retention window; GET /api/v1/status publishes temporal_window.point_in_time_floor and unrounded depth_days at measured_at, and no payload history before that floor is reconstructed.

Versioning

The version is major.minor.patch, served on every response as X-API-Version and in this document's info.version. Minor and patch versions are additive: a field, parameter, enum value, endpoint or header may be added; nothing served is removed, renamed or retyped, and every response schema declares additionalProperties: false so an addition is visible in the document the day it ships. Every version has a changelog entry below, dated to the day it reached production.

Breaking changes

A change that removes, renames or retypes anything served is a new major version under a new path prefix (/api/v2). /api/v1 is served, unchanged, for at least twelve months after the new major version is announced, and the announcement is a changelog entry on both versions.

Deprecation

An operation, parameter or field that will be withdrawn in the next major version is announced in the changelog and, on the affected operation, with the Deprecation and Sunset response headers (RFC 9745, RFC 8594) from the day of the announcement until the sunset date. No operation is deprecated today; a test refuses an operation marked deprecated in this document without both headers declared.

Methodology

methodology_version on every row names the parsing and admission rules that produced it (currently receipt-or-drop-v1). A change to a derivation rule ships as a new methodology_version and a changelog entry. content_hash covers the government-filing facts and receipt coordinates only, so a methodology change never alters the hash of an unchanged filing; a change to the hash basis itself is a new basis label, never a silent edit.

History

Served rows are never edited in place. A restatement is a new version_id; the prior version stays readable at /v1/disclosures/{id}/history, and as_of reads return what was served at that instant. The daily export's merkle_root commits to the corpus of the day.

Errors

Every problem response carries a stable code from the catalog at /data-api/problems and a type URL that resolves to that code's page. Codes are added, never reused or removed within a major version.

Licensed keys

A licensed key is shown once at issuance and stored only as a sha256 hash; Veridion cannot recover it. A key can be revoked at any moment and can carry an expiry. Rotation is a second active key issued for the same license with an expiry set on the first, so both are valid for the rotation window the licensee chooses. Usage records reference a key by its id, never by its value.

Status

/v1/status reports what was measured and degrades itself when its own arithmetic says so; every degraded state names each cause in degraded_reasons. Thresholds are operational alerting thresholds chosen by Veridion and are labelled as such in the response; they are not a service commitment. Commercial terms, where they exist, live in a license, never in this document.

Changelog

Every version, dated to the day it reached production. Also at /data-api/changelog and as a feed at /data-api/changelog.xml.

1.3.17 · 2026-09-05 · 3 changes
  • Served disclosure instants carry six fractional digits: snapshot_as_of, requested_as_of, coverage as_of, receipt and provenance timestamps, and change observed_at. Previously these values were truncated to milliseconds while the warehouse retained microseconds: replaying the served snapshot boundary selected the previous generation for 637 of 641 generations, measured 2026-09-04. The exact-instant replay now resolves to the generation it names, 641 of 641 on the pinned PostgreSQL fixture; that fixture is not a new production measurement.

  • as_of and updated_since accept up to six fractional digits and reject seven or more with the existing 400 instead of truncating them.

  • Cursors issued before this version with three-digit signed instants remain accepted: stored instants are canonicalised on read after signature verification, so equivalent three- and six-digit values compare equal.

1.3.16 · 2026-09-04 · 3 changes
  • /api/v1/status.temporal_window publishes point_in_time_floor, depth_days, measured_at, retention_regime, and the arithmetic basis. History grows from the retained-history floor rather than rolling off with age. The floor comes from the same dataset-state resolver as disclosure queries; depth is unrounded elapsed days, or null when the floor cannot be read. Queries before the floor still return the existing typed 400, never reconstructed history.

  • Impossible calendar dates in disclosure date filters return a corrective 400 instead of reaching the database as a retryable 503. Problem responses that lack a route-specific detail use the existing problem catalog's next action.

  • The MCP initialize handshake and public/.well-known/mcp.json state the served version. Both had read 1.3.1 since that release while the API advanced to 1.3.15. Deploy gate 27 now checks the descriptor against the contract on every deploy.

1.3.15 · 2026-09-03 · 1 change
  • /v1/status.pipeline attributes a run to its due slot by a published rule rather than by the exact minute it started. Until now a run that began even a few seconds past its due minute was recorded as unscheduled and its slot published as missed. Measured 2026-09-03 on the busiest wrapped cron, eight slots an hour: 18 of its 192 due slots read missed, and 17 of those 18 had a run that started 65 to 185 seconds late, every one at a :00 or :30 minute. A run now belongs to the most recent due minute at or before its start when it started within 300 seconds of it; the tolerance and the measurement behind it are stated in basis. On a schedule whose gap is shorter than a run's lateness the run is attributed to the later slot, so the rule can over-report a miss and never under-report one. Attribution is derived at read time from each run's start, so rows the instrument stored as unscheduled before this version are read the same way as rows stored after it; the store is not rewritten. Each job gains unattributed_runs_24h: runs that started in the window and attribute to no slot, counted rather than dropped, because they ran.

1.3.14 · 2026-09-03 · 3 changes
  • /v1/status.pipeline names the unit it counts. instrumented_jobs, unwrapped_jobs and scheduled_jobs counted canonical invocations, a pathname with its query, so one cron route scheduled under several query shapes was counted several times. Read as route coverage, which is what a reader means by "is this job watched", the published 13 of 68 overstated us fourfold: the true figure is 3 routes of 58. The block now publishes instrumented_routes, unwrapped_routes and scheduled_routes for coverage, instrumented_invocations, unwrapped_invocations and scheduled_invocations for the per-slot unit attendance is actually evaluated in, and schedule_entries for the number of lines in vercel.json, which exceeds the invocation count when one URL is scheduled twice. The three original fields keep their values and are listed in deprecated_fields with their successors in field_successors. Measured 2026-09-03: 3 of 58 routes instrumented, 13 of 68 invocations, 69 schedule entries.

  • A pipeline job's state describes the job now rather than the last 24 hours. died had been set by any run in the window that started and never finished within its ceiling, so the daily export read died although the run killed at 07:40Z was followed by a successful one at 14:13:02Z; three of five published rows carried a state their own basis did not support. died now requires the latest attempt to be the dead one, matching the rule that decides whether the endpoint degrades, and every such run in the window is still counted in died_count. No threshold moved and no verdict changes: the endpoint never used the label.

  • Each pipeline job publishes scheduled_job. False means an invocation shape that appears in no vercel.json entry, so it has no due slots and cannot report a missed one. Such a row is listed rather than hidden, and the flag lets a reader see why its denominator is zero.

1.3.13 · 2026-09-03 · 2 changes
  • The OpenAPI document carries a response example on every record-shaped operation (disclosure page, single disclosure, history, member directory, export manifest) and on every problem response. Each example is a production response captured on 2026-09-03, edited only to describe the opaque cursor and the signed download URL rather than print them, and each is parsed in the build by the same schema that describes the live response, so an example cannot drift from the contract.

  • /v1/export: the manifest's generated_at, snapshot_as_of and artifact_verified_at are served in the Z form the schema has always declared. They had carried the warehouse's +00:00 form, which a client validating against the published schema would have rejected. Found by the example test. A manifest whose timestamps cannot be read now returns the new manifest_timestamp_unreadable problem rather than a body the contract rejects; the snapshot file itself is unaffected.

1.3.12 · 2026-09-03 · 1 change
  • /v1/status gains observation_delay: hours from a filing's filed_date to Veridion's first observation, the measurement /data-api has shown since 1.3.4, now machine-readable. Per eligible source (House Clerk, Senate eFD): state measured or unevaluated; when measured, the filed-date window, row count, median, p95 (withheld under 100 rows) and maximum in hours; when unevaluated, the reason the distribution refused and the record behind the verdict: the configured observation start, the first and last day of continuity telemetry, days polled successfully, and whether the configured start predates that telemetry. Nothing in this block degrades the endpoint; an unevaluated measurement is a disclosed limit, not a failure of the served rows. Measured 2026-09-03: both sources unevaluated, 90 served rows without a current assessment, telemetry from 2026-08-26 against a configured start of 2026-07-08.

1.3.11 · 2026-09-03 · 2 changes
  • /v1/status.pipeline degrades on non-delivery rather than on history: a job degrades the endpoint when it has not completed successfully since its most recent due slot (a slot counts once its run ceiling has elapsed), when its latest run is the one that died, when it has never run, or, for the export job, when its latest run failed. A job that missed a slot and completed since, or whose dead run was followed by a successful one, keeps its missed and died counts in the block without degrading the endpoint. Each pipeline:<cron> reason now ends with the last due slot it was judged against. Measured on 2026-09-03: the 07:40Z export run was killed by the platform for running out of memory and re-run by hand; under the previous rule the day's dead row would have degraded the endpoint until the next scheduled run.

  • The daily export job builds and verifies its file as a stream; its result reports the process's own peak memory (memory.rss_peak_mb). No served field changes.

1.3.10 · 2026-09-03 · 1 change
  • /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.9 · 2026-09-03 · 1 change
  • 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.8 · 2026-09-03 · 1 change
  • 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.7 · 2026-09-03 · 2 changes
  • /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.6 · 2026-09-02 · 1 change
  • 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.5 · 2026-09-02 · 2 changes
  • 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.4 · 2026-09-02 · 3 changes
  • /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.3 · 2026-09-02 · 4 changes
  • 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.2 · 2026-09-02 · 1 change
  • 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.1 · 2026-09-02 · 1 change
  • 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.0 · 2026-09-01 · 5 changes
  • 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.0 · 2026-08-27 · 2 changes
  • 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.0 · 2026-08-25 · 1 change
  • 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.0 · 2026-07-29 · 1 change
  • Initial v1: /v1/disclosures, /v1/disclosures/{disclosure_id}, /v1/members, /v1/coverage, /v1/status, /v1/export, and the OpenAPI document.

Generated from /api/v1/openapi.json version 1.3.17. An AI client can read the same contract through the MCP server described on the overview page.

Weekly Veridion brief

Rating changes, public disclosure activity, methodology notes, and product updates. One email per week. No advertising list resale.