Loading
Loading
How we collect, parse and verify executive branch financial disclosures. The law behind them is on the About page.
Executive branch public financial disclosures include periodic transaction reports and reports of holdings, income and other financial interests. Open Cabinet’s trade dataset comes from 278-T reports, plus the Part 7 transaction tables of the annual and termination reports OGE has posted for tracked officials (the annual-report lane, below).
Source: OGE’s transaction-report guide and report-type overview.
Reported trades alone do not show all of an official’s holdings or establish whether an official has fulfilled an ethics agreement.
Follow the filing from source PDF to publication: who does each step, when processing stops, and where a person is required.
A daily cron job emails the owner when it finds a possible new filing. It does not ingest anything.
The owner confirms the filing is new and relevant, then manually starts ingest.
Claude PDF support reads the filing and proposes transaction rows.
Readable PDF: pdftotext + column parser. Scanned PDF: Tesseract OCR. Code compares the result with Claude’s rows.
The program confirms the rows. Skip the fallback model.
Another provider’s model independently reads the PDF.
Agrees with Claude: continue to the audit.
Disagrees or fails: hold for a person.
A readable-PDF text mismatch goes directly to human review.
A separate model checks each proposed row beside the source page and looks for missing or extra rows.
The rows have corroborating evidence and a confirming page audit, or recorded human decisions resolving the exceptions.
Read the source PDF, check the disagreement, record a visual decision and rerun the checks.
Review and merge the proposed data update.
Publish the website, CSV and JSON. Subscriber email has a separate review and send step.
Planned confidence safeguard: when a fallback model is used, both extraction models must report at least 0.8 confidence for each row; lower or missing scores require human review. This threshold is not yet enforced. Confidence does not replace the comparison or page-image audit.
OCR does not have to agree when a fallback model provides corroboration. Unresolved differences and audit problems require human review.
Publication always requires owner approval.
From government PDFs to searchable data, the pipeline behind Open Cabinet.
The Office of Government Ethics maintains a public index of financial disclosures. Open Cabinet reads that index through its public API, which includes names, titles, agencies, filing types and available PDF links. This is the entry point for finding source documents.
We filter for 278-T Periodic Transaction Reports, the ongoing stock trade disclosures. The most senior officials (Level I and II), cabinet officials and selected senior appointees have PDFs directly downloadable from OGE. Open Cabinet tracks the officials whose transaction reports can be independently checked through those source PDFs. Hundreds more officials have filed reports that require individual written requests to access.
Each 278-T is a PDF containing a table: asset description, transaction type (sale, purchase, exchange), date, amount range and whether the filing was late. For large or difficult filings, Open Cabinet splits PDFs into page chunks before structured parsing. That keeps oversized filings from failing as one giant document and preserves a source trail back to the original PDF.
Code checks transaction types, amount ranges, dates and ticker format, and compares the data with saved samples for five officials. Those sample comparisons use a 95 percent field-match threshold; volume outliers are review notes. These checks catch regressions, but they do not establish that every row matches its PDF. Independent text or OCR comparisons, the conditional fallback model and recorded human decisions provide separate evidence.
The public site reads static JSON files and generated exports. The owner manually starts the workflow, which prepares a data update for a person to review and merge before publication. Each official record keeps its OGE source filing URLs so a row can be traced back to the PDF and corrected.
The structured data powers D3 visualizations: scatter-plot timelines for each official, a swim lane chart showing thousands of trades on one canvas, treemaps for asset categories and bar charts for company lookups. D3 computes the math; React renders the SVG.
Every morning, a Vercel Cron job checks OGE and emails the owner when it finds a new filing. It does not import anything. The owner reviews the filing and starts the GitHub Actions import only if it belongs on the site.
PDF parsing uses AI to convert OGE tables into structured transaction rows, followed by schema checks, regression samples and source-PDF review. Official summaries use computed facts; current model-written candidates require a separate review-and-publish step. Older summaries predate that gate. The application was built by Trevor Brown. All data traces back to government-filed source documents.
pnpm validate:trace) confirms, for every row that names a page, that the printed row number, the trade date and the amount appear on that page of the PDF, searches the document for rows without a page, and mutates a seeded sample of rows to prove the check rejects a wrong date, row number or description; its runs are logged in the public repository.This project uses AI at several stages. In the interest of transparency, here is exactly where and how.
Each filing PDF is sent whole through Claude PDF support, which reads the document’s text and page images and returns the transaction table as structured rows. There is no separate text-extraction step in front of the model. Large filings are split into page ranges first. Every returned row is checked for valid fields: five transaction types plus an explicit “Unstated” type with a note, eleven dollar ranges or an explicit unknown, calendar dates, and no unexpected fields. Reviewed source exceptions can retain an undated row or an impossible printed date with an explanatory note. Where the PDF carries its own text (a text layer, as opposed to a scanned image), an independent PDF parser (pdftotext plus a column parser) reads the same table and the two are compared row for row.
As of the last build, of the 12,713 rows from 278-T filings, the PDF parser agreed with the model on 2,203, OCR of the page image on 5,413, a second company’s model on 10,435, and the page audit confirmed 12,632. A row can be counted under more than one; the row-level totals below show each row’s current status. The comparison covers type, date, amount, late flag and row count, with a limited name-word check. It does not verify ticker symbols; asset resolution and the independent name check are separate. Rows from annual and termination reports are checked by the annual-report lane’s own artifacts, described under known limitations.
For scanned filings, a second program renders each page to an image, runs optical character recognition on it (tesseract, locally, ignoring any text the scanner embedded) and compares the result the same way. It has run on 17 filings. When OCR cannot confirm Claude’s rows, an independent model reads the page. Any remaining disagreement holds the filing for a person.
A separate model sees the proposed rows beside the source-page images. It checks whether each row matches and whether anything is missing or extra. Any difference goes to a person. This visual audit was also applied during the dataset-wide reverification of existing records. These checks reduce transcription risk but do not guarantee that a government filing itself is accurate.
The plain-English summary on each official's page is either a fixed template built from the counts, or prose a model wrote from a block of facts computed in code. The model never sees the transactions, only the computed facts. Since September 2026, model-written prose is published only after a person reads and approves it, and only if every number in it appears in the facts it was given. Summaries published before that gate existed were not individually approved. When new filings change an official’s facts, the existing summary is kept and marked as behind the data until a new one is approved. The prompt prohibits editorial judgments and compliance conclusions; review remains necessary because a number appearing in the facts does not establish that a sentence uses it correctly.
Claude turns a reader’s question into a constrained query plan. Code validates that plan, queries the published checked rows from both lanes (278-T periodic reports and the transactions section of annual and termination reports) and calculates the answer. Answers that mix lanes say how many rows came from annual reports; late shares count 278-T rows only. The default answer sentence is a fixed template. An optional configuration lets a model phrase the result; number and language checks must pass or the template remains. The answer identifies which process was used.
An operator can ask Claude to draft a digest introduction from filing facts, sample transactions and existing official summaries. It is shown in the admin draft for review before sending. The saved introduction is included only when its filing set still matches the digest; generating it sends no email.
The "In the News" sections link to outside reporting. The article list is curated separately from filing ingestion; search tools can help find coverage. Changes to the saved list are reviewed before publication. The site does not generate the linked articles.
Architecture, design and editorial decisions are human-directed. Automated tooling helps with implementation, but it does not decide what to track, what to publish or how to frame the findings.
Models are instructed to extract the filing’s values, not invent transactions or judge whether trades are legal or ethical. They can misread a page; the checks and review process above address that risk. Coverage is set by the project’s source rules. Published transaction rows retain their government filing links.
The full dataset is available for journalists, researchers and anyone who wants to work with it. Download as CSV or JSON. Includes all transactions, official metadata and ticker mappings. Federal government data carries no copyright.
Official portraits are U.S. government works in the public domain, retrieved from agency press pages and Wikimedia Commons. Where an official has no released portrait, we crop a headshot from another public-domain federal photograph — Sara Bailey's is taken from a U.S. Senate photo released by the office of Sen. John Cornyn.
July 25, 2026— Corrected the statutory citation for the $200 late-filing fee from 5 U.S.C. Section 13106(a) to Section 13106(d), and clarified that the fee attaches only when a report runs more than 30 days past its deadline, not at the deadline itself. Claims about how often the fee is waived are now attributed to reporting on Congress; comparable data for the executive branch is not public.
33,964 of 33,964 rows (100 percent) have a recorded checked status for their trade columns: type, date, amount and late flag.
Verification records last rebuilt (UTC). These are saved results; this page does not rerun the checks.
“Checked” means an independent program or a second provider’s model agreed with the first read, or a person compared the row to the PDF. Company names and ticker symbols have separate checks. A public ticker also requires a matching independent name read or a recorded human decision.
“Not yet checked” rows come from one model read with no independent comparison yet. “Under review” rows are on the site while a person decides.
Filings print asset names the way a broker statement does: “TEXAS INSTRS INC,” “Apple Inc Com Solicited Order Discretion Exercised,” a municipal bond with its coupon and maturity. Most print no ticker symbol. To put a trade on a company page, the site first decides what kind of thing the row is from the printed text (stock, ETF, mutual fund, preferred, corporate note, municipal bond, Treasury, crypto, private holding, option). Only a stock or an exchange-traded fund can get a ticker; bonds, notes, preferreds, mutual funds and private holdings never do.
A stock or ETF row is tied to a company only on exact evidence: a symbol the filing itself prints, confirmed by the exchange listing of the same name; or the printed name, after broker boilerplate is removed, matching one security by exact name on two public reference lists (the Nasdaq symbol directory and the SEC’s issuer list) that agree on the symbol; or a person’s recorded decision. An exact listed name with a printed share class can also resolve when only one listed class matches and the SEC reference has no symbol for that name or corroborates the issuer. One allowance for ETFs, whose legal and marketing names differ: a printed ETF symbol is accepted when every distinguishing word of the printed name appears in the listing (“Vanguard Tax-Exempt Bond Index Fund ETF” and “Vanguard Tax-Exempt Bond ETF”). Selecting a ticker from the reference lists does not use fuzzy matching or a model guess. Apart from the share-class exception above, a name found on only one list, or cut short by the broker, waits for a person. A public ticker also needs a matching independent name read or a recorded human decision. That name check tolerates spelling and wording differences, so it is not a guarantee of exact transcription.
Today: 29,770 rows are stocks or ETFs. 25,584 are tied to a company on that evidence, and 7,768 of those appear on company pages (the rest belong to former officials outside the main directory or lack an independent reading of the name); 4,186 show the printed name only until a person looks. Reference lists fetched 2026-09-07.
This tool is for informational and journalism purposes only. Nothing here constitutes investment advice. Asset values and transaction amounts are reported in ranges as required by federal law. This database may not include all executive branch filers. It covers trades reported on 278-T periodic transaction reports and the Part 7 transaction tables of the annual and termination reports OGE has posted for tracked officials; holdings, income and liabilities are not included. Data sourced from the U.S. Office of Government Ethics under the Ethics in Government Act (5 U.S.C. Section 13107). Federal government documents carry no copyright (17 U.S.C. Section 105).