Version history for the PEPIndex (Presidential Economic Pressure Index)
Photo by RUBENIMAGES. on Unsplash
| Identifier | Current | Meaning |
|---|---|---|
| API path version | v1 | URL contract — /api/v1/… |
| API implementation | 2.0.0 | App / OpenAPI version |
| Schema (data dictionary) | 1.4.4 | Output / table schema |
| Methodology | 1.2.20 | Scoring framework |
| Data build | generated_at | ISO timestamp on every snapshot |
/openapi.json
(interactive docs at /docs), with versioned copies pinned per methodology release.
Stability promise: additive changes (new endpoints, new optional response fields) ship at any time
— clients should tolerate unknown fields. Breaking changes (removing or renaming a top-level
response field, removing an endpoint, changing an endpoint's access tier) are announced in this section at least
30 days before taking effect. The /api/v1 path prefix changes only with a v2.
| Date | Change | Type |
|---|---|---|
| Oct 2026 | GET /api/v1/index/branch/congressional adds cbo_estimates_30d and related_bills; the free snapshot's branch_reaction.congressional carries both | Additive |
| Oct 2026 | New free endpoint: GET /api/v1/labor/government (government workforce trends); the free snapshot adds government_workforce | Additive |
| Oct 2026 | New error: 403 unavailable_in_region for requests from jurisdictions where PEPIndex is not offered | Additive |
| Aug 2026 | Versioned OpenAPI contract published (pinned per methodology release; live at /openapi.json) | Additive |
| Jul 2026 | New endpoints: GET /api/v1/index/branch/{judicial|congressional} (free), GET /api/v1/sector-reactions (Standard), GET /api/v1/events/{id}/sector-reaction (Premium) | Additive |
| Jul 2026 | Free snapshot adds branch_reaction; index history adds branch columns and daily S&P 500 close | Additive |
| — | No breaking changes announced. | — |
An audit of the live headline found events recorded as abandoned with no evidence. Most were official documents that themselves imposed a measure — a proclamation or order that carried a policy out — mistaken for unmet threats when their monitoring window closed; one had kept a resolver's verdict on its evidence after being re-opened. Twenty-eight such outcomes were re-opened and the action documents among them retired with no outcome; one benchmark (the June 2026 Section 232 metals amendment, which took effect on its stated date) is now recorded as carried out; and the published history was rebuilt. The chicken-out rate and the live headline moved as a result; the scoring formula did not change.
Some trade threats were carried out by a proclamation or order that never names the threat's target, such as a worldwide import surcharge. Those threats stayed open, added to live deadline pressure, and would eventually have been recorded as abandoned, a chicken-out for an action that happened. Before a trade threat's window closes it is now checked against independent reporting, after the Federal Register has had its chance, and the outcome is recorded with where the evidence came from. Congress's resolutions to end the Brazil and the worldwide tariff emergencies are now linked to the threats they answer, still by reviewed exact rules rather than by topic.
The congressional reaction index had read zero, because it only counted bills that a threat itself names, and presidential threats almost never name one. It now also counts the legislation Congress uses to answer a threat, linked by exact rules rather than by topic: resolutions to terminate the national emergency a tariff rests on, and resolutions disapproving a rule tied to a threat. Recorded votes and Congressional Budget Office cost estimates on those bills come in with the same data. The free congressional index endpoint and the Overview tile now list the bills with their latest action. A response resolution adds to the reaction index but never decides a threat's outcome. The headline index and every event score are unchanged.
PEPIndex — the website, the API and paid subscriptions — is not offered in certain jurisdictions. Visitors from them see an availability page, API requests are refused with 403 unavailable_in_region, and no key is issued for a billing address there. See the terms.
Federal, state and local government payrolls, and federal job openings, hires, quits and layoffs, now come in with the monthly labor data. They are free, on the Live Data tab and at /api/v1/labor/government: the latest month, the change from a month and a year earlier, the change since January 2025, two years of history, and the tracked threats aimed at government workers. Federal payrolls were 2.68 million in September 2026, down 328,000 (10.9%) from January 2025. No score or index value changes: these series are shown alongside the index, not used to compute it.
The live headline adds pressure from open threats whose deadline has passed. Some open events were not threats at all but the official documents that carried a policy out, such as a proclamation imposing duties; the document is the follow-through, so there is no deadline for it to miss. Those events no longer add live pressure, and neither do statements classified as something other than a new threat. The live headline drops as a result. The settled index, its history and every event score are unchanged.
A new corroboration source: an independent nonprofit's public records of federal workforce, funding and program cuts. It is collected to corroborate domestic outcomes and appears in the source-freshness view; it is not yet matched to events and feeds no score.
No scoring or methodology change — three data-integrity fixes on the economic input layer:
Four scoring inputs existed only as function parameters, with nothing stored behind them, so two dimensions — Rhetorical Dilution and Scope Reduction — were arithmetically constant for every live event, and Framing Shift ran on one input instead of two. Each is now measured and stored: dilution and framing are measured from follow-up statements the classifier already processed and previously discarded, matched to their event deterministically; scope is judged by the resolvers on their existing calls and recorded as null rather than guessed when the evidence is silent. A separate defect is corrected in the same release: events minted from a Federal Register document were being “resolved” by that same document, producing an outcome on the threat date and a single repeated score. Published history is rebuilt in full so the whole series is computed under one formula (methodology v1.2.17).
Correction (August 2026): the dilution and framing half of that release did not initially take effect. Two independent defects had to be fixed in sequence — the writer’s branch condition was unsatisfiable, and the classifier’s output contract nulled the very fields the matcher reads — so those two inputs measured nothing until both were corrected. Scope Reduction, the other half, worked throughout. The two are now populated by the corrected live path and by a historical pass that attaches a follow-up statement to an already-resolved event only when it was contemporaneous with it (after the threat, no later than the outcome). Coverage is still thin and is stated as a limit on the validation page — an unmeasured input contributes nothing rather than assuming no softening.
The index tracked executive orders on the way in, but not the litigation that decides them (schema v1.4.4, methodology v1.2.16):
judicial_index counted every filing equally. Because the trade-court docket is admitted unfiltered and is mostly routine antidumping work, that made the series a measure of trade-court throughput — one landmark Supreme Court ruling moved it exactly as much as one unrelated duty opinion. Filings are now scaled by each court's precedential reach and the signal purity of what is admitted from it. Published judicial_index history was rebuilt; the congressional series is unchanged.Market reaction now goes beyond the single economic lens (schema v1.4.2, methodology v1.2.15):
GET /api/v1/events/{id}/sector-reaction (Premium), GET /api/v1/sector-reactions (Standard).GET /api/v1/index/branch/{judicial|congressional} needs no key, and the free snapshot carries a branch_reaction summary plus the branch columns in index_history.A full dataset audit populated four surfaces that were empty or NULL and fixed two bugs (schema v1.4.1, no methodology change):
/events/{id}/timeline and in the Snowflake shares. Historical events backfilled.rhetorical_index) now populates, seeded with documented pure-signaling threats that were made and never acted upon (broadcast-license threats, “open up the libel laws,” and the subsidies/contracts feud threat). The full four-domain calibration catalogue is listed on the methodology page, and the data dictionary now documents the event timeline endpoint.Operational and product updates under the v1.2.14 methodology (schema v1.4.0):
[threat date, today], backed by a database constraint; historical impossible dates repaired.Operational updates under the v1.2.13 methodology (schema v1.3.7–v1.3.8):
data.json fallback is baked fresh at deploy time instead of committed each cycle.Corrected an artifact where the index recorded a ~97% chicken-out rate with zero follow-throughs. Four fixes:
indeterminate state. Non-trade events that lapse with no evidence now finalize to indeterminate (not scored, excluded from the chicken-out rate) instead of a fabricated abandoned. Trade lapses still slip to abandoned (the statutory↔applied gap is observable evidence).Closed a limbo gap where deadline-after-threat events could drop out of both the live-pressure and settled index between their threat-aging and finalization anchors. Live pressure now runs from the stated deadline to the end of the monitoring window, the exact complement of finalization.
Every event now terminates as a TACO or a facilitation rather than tracking indefinitely. Historical backfill finalizes immediately instead of parking in monitoring. The calibration lock is applied consistently across both seed catalogues.
Overdue, unresolved threats now build a provisional live_pressure_score each cycle, so an unmet deadline visibly accrues pressure over time. The settled index value is unchanged; a new index.live_value folds overdue pressure in so the headline can move in real time.
Section 301 USTR actions publish as Federal Register notices (not presidential documents) and were previously invisible to the index. The pipeline now ingests USTR notices as a threat source of their own, with a notice-window backfill fix (v1.2.9) and a calibration-catalogue lock (v1.2.8) that freezes hand-curated benchmarks so their values never drift.
The dashboard now reads live data from GET /api/v1/snapshot, decoupling published-data freshness from deployments. Presidential proclamations (Section 232 / reciprocal tariffs) are now classified into events. Academic-only replication datasets were removed in favor of freely-citable published constants.
Added the statutory_authority field (IEEPA, Section 301/232/122, etc.), a redundant fallback source for trade-court records, and BEA PCE pass-through series for cross-validation against the Yale Budget Lab Tariff Tracker.
Integrated the four-group economic-impact methodology, formalized the six-dimension behavioral scoring framework, added the recency-weighted rolling index, and published the REST API specification.
Four-criterion event definition (specificity, actionability, measurability, materiality), four-domain taxonomy (Trade, Foreign Policy, Domestic, Rhetorical), five-stage event lifecycle, and AI-assisted detection with human-in-the-loop review.