---
title: "Get every observed version of a disclosure, oldest first."
method: GET
path: "/api/v1/disclosures/{disclosure_id}/history"
tags: ["Disclosures"]
---

# Get every observed version of a disclosure, oldest first.

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

## Request

- Base URL: `https://www.veridionmarkets.com`
- URL: `https://www.veridionmarkets.com/api/v1/disclosures/{disclosure_id}/history`
- Auth: one of:
  - none
  - HTTP bearer

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.

## Path parameters

- `disclosure_id` string, required

## Response `200`

Every observed version, oldest first; the last entry is current.

- DisclosureHistory
  - `data` object[], required: 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.
    - `disclosure_id` string, required: Permanent identifier for the filing-derived transaction. It is never reused; parser versions and restatements retain this identifier.
    - `version_id` string, required: Immutable parse-generation identifier. Use disclosure_id, not version_id, for downstream identity across a restatement.
    - `content_hash` string, required: 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_basis` 'government_filing_facts', required: Identity uses only filer, document, filed instrument, transaction date and type, amount range, and owner. Parser line, span, version, and run identifiers are excluded.
    - `change` object, required: 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.
      - `type` 'upsert' | 'supersede', required: 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.
      - `state` 'active' | 'withdrawn', required: active: served in snapshot reads. withdrawn: no longer served in snapshots but still directly retrievable by disclosure_id, with reason set.
      - `observed_at` string, date-time, required: When Veridion observed the event this row reports (the version's first observation for an upsert; the supersession instant for a supersede).
      - `reason` string, nullable, required: Why a row was withdrawn or superseded, when the pipeline recorded one; null for an ordinary upsert. States the mechanism, never a motive.
    - `member` object, required: The filer, resolved against the congressional directory where a match exists. Identity fields only; what the filing itself says is in the receipt.
      - `member_id` string, required: 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.
      - `person_id` string, nullable, required: 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.
      - `full_name` string, required: 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.
      - `chamber` 'house' | 'senate' | 'executive', required: house or senate from the office that published the receipt; executive for Office of Government Ethics filers.
      - `party` string, nullable, required: 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.
      - `state` string, nullable, required: Two-letter state of the seat, as recorded in the congressional directory; null for executive-branch filers.
      - `district` string, nullable, required: 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.
    - `asset` object, required: 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.
      - `ticker` string, nullable, required: 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.
      - `name` string, required: 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_type` 'equity' | 'etf' | 'municipal_bond' | 'corporate_bond' | 'government_security' | 'option' | 'fund' | 'partnership' | 'crypto' | 'other', required: 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.
      - `source_code` string, nullable, required: 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.
      - `description` string, nullable, required: Free-text description from the filing's asset line when the office publishes one separately from the name; null otherwise. Never composed by Veridion.
    - `instrument` object, required: Additive projection from the filing's printed asset and description. Every absent or conflicting ticker or option term has a named reason. It is not an order instruction or a securities-master lookup; the original asset fields remain unchanged.
      - `kind` 'equity' | 'option' | 'etf' | 'bond' | 'fund' | 'crypto' | 'other', required: Instrument category supported by the printed code or text. Explicit option transactions include exercised options even where the original source code is ST. Other means unclassified, not a guessed equity.
      - `kind_reason` string, required: Named source-code or printed-text rule used to classify this line.
      - `ticker` string, nullable, required: Single printed symbol, uppercased without joining tokens. An explicit ticker label or security-named parenthetical may resolve a blank ticker field; issuer names alone never do. Not a guarantee of an executable option-series identifier.
      - `ticker_status` 'printed' | 'resolved_from_printed_text' | 'missing' | 'ambiguous' | 'invalid', required: Distinguishes the original printed ticker field, a symbol resolved from explicit asset text, and missing, conflicting or malformed evidence.
      - `ticker_reason` string, required: Exact ticker-resolution rule or named missing/ambiguous reason. Never empty, including for untickered assets.
      - `underlying` string, nullable, required: Explicitly labelled underlying or the printed stock name on an option-related line. Never decoded from the ticker or resolved from an issuer lookup.
      - `option_type` 'call' | 'put', nullable, required: Call or put only when printed as the option type. Conflicting types and unlabelled verbs produce null.
      - `strike` string, nullable, required: Exact printed decimal strike, with grouping separators and dollar sign removed. String avoids binary floating-point rounding. Currency is not inferred.
      - `expiration` string, nullable, required: Date as printed, not necessarily ISO. Two-digit years retain two digits; no century or missing day is inferred. See field_evidence.expiration.reason.
      - `contracts` integer, nullable, required: Explicit count of options or contracts. Shares and units are never converted, nor is a partial-sale count calculated from holdings.
      - `field_evidence` object, required: Required per-field evidence for every option field, including missing fields and non-option rows.
        - `underlying` object, required: Printed underlying name/label evidence or why an underlying was withheld.
          - `status` 'printed' | 'missing' | 'ambiguous' | 'invalid' | 'not_applicable', required: Whether this value is explicitly printed, absent, ambiguous, invalid or inapplicable to a non-option line.
          - `reason` string, required: Named extraction rule or refusal reason; always present, including when the value is null.
          - `raw` string[], required: Matched filing-text spans, retaining competing values and printed share/unit counts. Empty when no applicable evidence was found.
        - `option_type` object, required: Printed call/put evidence, conflict or absence.
          - `status` 'printed' | 'missing' | 'ambiguous' | 'invalid' | 'not_applicable', required: Whether this value is explicitly printed, absent, ambiguous, invalid or inapplicable to a non-option line.
          - `reason` string, required: Named extraction rule or refusal reason; always present, including when the value is null.
          - `raw` string[], required: Matched filing-text spans, retaining competing values and printed share/unit counts. Empty when no applicable evidence was found.
        - `strike` object, required: Exact printed strike span, or the missing, malformed or conflicting-price reason.
          - `status` 'printed' | 'missing' | 'ambiguous' | 'invalid' | 'not_applicable', required: Whether this value is explicitly printed, absent, ambiguous, invalid or inapplicable to a non-option line.
          - `reason` string, required: Named extraction rule or refusal reason; always present, including when the value is null.
          - `raw` string[], required: Matched filing-text spans, retaining competing values and printed share/unit counts. Empty when no applicable evidence was found.
        - `expiration` object, required: Printed expiration span and date-format/refusal rule. A two-digit year is identified explicitly and not expanded.
          - `status` 'printed' | 'missing' | 'ambiguous' | 'invalid' | 'not_applicable', required: Whether this value is explicitly printed, absent, ambiguous, invalid or inapplicable to a non-option line.
          - `reason` string, required: Named extraction rule or refusal reason; always present, including when the value is null.
          - `raw` string[], required: Matched filing-text spans, retaining competing values and printed share/unit counts. Empty when no applicable evidence was found.
        - `contracts` object, required: Explicit option/contract-count spans plus any share/unit spans. Describes quantity ambiguity without conversions or arithmetic.
          - `status` 'printed' | 'missing' | 'ambiguous' | 'invalid' | 'not_applicable', required: Whether this value is explicitly printed, absent, ambiguous, invalid or inapplicable to a non-option line.
          - `reason` string, required: Named extraction rule or refusal reason; always present, including when the value is null.
          - `raw` string[], required: Matched filing-text spans, retaining competing values and printed share/unit counts. Empty when no applicable evidence was found.
    - `transaction` object, required: What was done and on what date, as stated on the filing.
      - `type` 'buy' | 'sell' | 'exchange' | 'other', required: 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.
      - `date` string, date, required: The transaction date as stated on the filing. Not the filing date, and not adjusted for weekends or holidays.
    - `filing` object, required: 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.
      - `type` 'periodic_transaction_report' | 'annual_report', nullable, required: 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.
      - `filed_date` string, date, required: The date the office records the report as filed. The STOCK Act window and delay_days are measured to this date.
      - `delay_days` integer, nullable, required: 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.
      - `statutory_window_days` integer, nullable, required: 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. Note that 45 days from the transaction is only one of the two clocks: a report is due by the EARLIER of 45 days from the transaction or 30 days from the filer being notified of it. The House PTR form includes a notification-date column; this dataset does not capture it, so the 30-day clock is not represented here.
      - `within_statutory_window` boolean: Present only when the filing type has an applicable transaction-level window and delay_days is known. True means delay_days <= statutory_window_days -- that is, within the 45-day transaction clock. It does NOT mean the filing was timely: the 30-day notification clock may have expired first, and we do not measure it. Do not treat this field as a compliance determination.
    - `amount` object, required: The disclosed band. Only two enumerated House PTR labels have an open upper bound; a missing amount is never estimated.
      - `range_low` integer, required: Lower bound of the band the filing discloses, in whole USD, as printed on the form ($1,001 to $15,000 serves 1001).
      - `range_high` integer, nullable, required: Upper bound of the disclosed band, in whole USD. Null only for the two enumerated House PTR open-ended brackets; never a fabricated ceiling.
      - `currency` 'USD', required: Always USD. Every disclosure form Veridion serves reports in dollars.
      - `midpoint` integer: 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.
      - `basis` 'bounded_range_as_disclosed' | 'open_ended_as_disclosed', required: Names whether the filing disclosed a bounded or one of the two enumerated House PTR open-ended brackets. Neither basis represents an exact amount.
      - `verbatim_text` string, required: The filed amount label; casing is canonicalized for the two enumerated House PTR open-ended brackets. Other text retains the parsed filing's spelling. The source line and receipt remain the source of truth.
    - `owner` object, required: Whose holding the transaction concerns, from the filing's Owner column, and how that value was established.
      - `label` 'self' | 'spouse' | 'joint' | 'dependent_child' | 'not_specified_in_filing' | 'undetermined', required: 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.
      - `determination` 'parsed_from_filing' | 'receipt_verified_blank' | 'owner_column_undetermined' | 'not_applicable_for_form', required: 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.
    - `receipt` object, required: The government receipt this row was parsed from. Preserve the access label.
      - `document_id` string, required: 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}.
      - `url` string, uri, required: 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.
      - `access` 'open' | 'gated', required: `gated` means the official Senate eFD URL requires acknowledging its access agreement before the filing is displayed; other supported sources are `open`.
      - `source_system` 'house_clerk' | 'senate_efd' | 'sec_edgar' | 'oge', required: 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.
      - `content_type` string, required: 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.
      - `page` integer, nullable, required: 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.
      - `retrieved_at` string, date-time, required: 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.
    - `provenance` object, required: 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.
      - `senate_line` object: Immutable retained Senate line evidence assigned at assigned_at, bound privately to this exact canonical version and payload hash. An identical-fact assignment is a forward methodology choice, not discovered historical attribution. These additions are outside veridion-disclosure-content-v1; original provenance.source_line_number and asset facts remain unchanged. Omitted before assignment and when evidence is unavailable. partial_sale is raw affirmative extent evidence; it does not change the normalized transaction type.
        - `source_line_number` integer, required: Actual positive row number printed in the retained eFD report; never an array position.
        - `owner_type_raw` string, nullable, required: Retained parser owner type; null stays unknown.
        - `owner_label_raw` string, nullable, required: Owner column exactly retained from eFD; not inferred from another line.
        - `comment` string, nullable, required: Comment or subholding text retained for the assigned printed line; null when absent.
        - `asset_type_raw` string, nullable, required: Asset Type column retained verbatim from eFD; no securities lookup.
        - `asset_type` 'equity' | 'option' | 'municipal_bond' | 'corporate_bond' | 'government_security' | 'fund' | 'etf' | 'other', nullable, required: Exact mapped printed asset class; null for an unknown label. Separate from immutable canonical asset.asset_type.
        - `transaction_type_raw` string, nullable, required: Original retained transaction label, including affirmative Full or Partial wording.
        - `partial_sale` boolean, nullable, required: True only for Sale (Partial), false only for Sale (Full), otherwise null. Separate from the A3 public transaction.partial contract.
        - `assignment_basis` 'unique_retained_facts_v1' | 'retained_coordinate_v1' | 'retained_new_line_v1' | 'affirmative_child_owner_unique_v1' | 'identical_fact_group_lowest_row_v1', required: Named prospective coordinate assignment rule; identical-fact assignment is methodology rather than historical attribution.
        - `assigned_at` string, required: Actual time the coordinate and exact-version witness were both recorded; no historical backdating.
        - `methodology` 'When a Senate report prints several lines with identical facts, the earliest-collected record is assigned the lowest row number; facts are unchanged.', required: Published Senate identical-fact assignment methodology.
      - `source_line_number` integer, nullable, required: 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.
      - `parsed_at` string, date-time, required: 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.
      - `parser_version` string, required: 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.
      - `transcription_method` 'pdf_text_layer' | 'verified_transcription': Present only for OGE rows. pdf_text_layer means the official PDF text was parsed; verified_transcription means the row was read from a checked transcription whose SHA-256 matched the official scanned PDF at ingestion.
      - `methodology_version` string, required: 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.
      - `source_ingested_at` string, date-time, required: 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.
      - `first_observed_at` string, date-time, required: When Veridion first observed this row. Immutable and used by the as_of filter.
  - `history` object, required
    - `disclosure_id` string, required
    - `event_count` integer, required
    - `first_observed_at` string, date-time, required
    - `latest_observed_at` string, date-time, required
    - `current_state` 'active' | 'withdrawn', required
    - `restated` boolean, required: 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.
    - `events_truncated` boolean, required: 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.
  - `access` union, required
    - object
      - `tier` 'free', required
      - `max_rows_per_request` 25, required
      - `requests_per_hour` 60, required
      - `no_key_required` true, required
      - `upgrade` object, required
        - `max_rows_per_request` 1000, required
        - `request_a_key` string, uri, required
    - object
      - `tier` 'free' | 'developer' | 'evaluator', required
      - `max_rows_per_request` 1000, required
  - `cache` union, required
    - object
      - `policy` 'public', required
      - `browser_max_age_seconds` 0, required
      - `cdn_max_age_seconds` 300, required
      - `declared_max_staleness_seconds` 300, required
      - `age_header` 'Age', required
      - `freshness_reference` object, required
        - `source` 'congress', required
        - `source_expected_max_age_seconds` 21600, required
        - `delivery_max_staleness_seconds` 300, required
        - `delivery_to_source_threshold_ratio` '1/72', required
        - `basis` string, required
    - object
      - `policy` 'private-no-store', required
      - `browser_max_age_seconds` 0, required
      - `cdn_max_age_seconds` 0, required
      - `declared_max_staleness_seconds` 0, required
      - `age_header` unknown, required
  - `version` '1.21.0', required
  - `notice` string, required

## Other responses

- `304`: The data-bearing part of the response matches If-None-Match; no body is returned. Cache headers are those of the equivalent 200.
- `400`: The disclosure identifier is malformed or a query parameter is unsupported.
- `401`: The supplied bearer key is invalid. Omit Authorization to use the free tier.
- `403`: The supplied key is not scoped for disclosures.
- `404`: No active or withdrawn record in the permanent v1 disclosure_id namespace has ever used this identifier.
- `429`: The free-tier request budget was exceeded.
- `503`: The disclosure warehouse could not be read.

---

[API](https://skmtc.dev/veridionmarkets/apis/veridion-disclosure-api.md) · [All operations](https://skmtc.dev/veridionmarkets/apis/veridion-disclosure-api/llms.txt) · [OpenAPI document](https://skmtc.dev/veridionmarkets/apis/veridion-disclosure-api/revisions/af69a5d7354e?raw)
