# Joint CPI/PPI monthly declines: how unusual is June 2026?

Research working file. Compiled 2026-07-15. Not for publication as written.
All figures computed from BLS public API pulls, not transcribed from news coverage.

---

## 1. The headline finding

Joint declines are **not rare**. June 2026 is the **17th month since December 2009** in which both
CPI-U (all items, SA) and PPI final demand (SA) fell month over month. That is 17 of 197 months, or
one every 11.6 months. In the pre-pandemic window (Dec 2009 to Dec 2020) the base rate was even
higher: one every 8.3 months.

**So "both fell in the same month" is, on its own, an unremarkable event. Roughly annual.**

What is genuinely without precedent in this series is the *regime* in which it happened:

1. **June 2026 is the first joint decline in 74 months.** The previous one was April 2020. The
   longest prior gap in the whole series is 27 months. So this gap is nearly 3x the previous record.
   The entire 2021 to 2026 inflation era (63 months, Jan 2021 to May 2026) contains **zero**.
2. **It is the only joint decline ever recorded with headline CPI inflation above 2.2% y/y.**
   June 2026 CPI y/y = +3.5%. The highest of the other 16 is +2.2% (Nov 2018). Most sit between
   0% and 2%.
3. **It is the only one that follows an acceleration.** The prior three months averaged +0.67%/mo
   on CPI (Mar +0.9, Apr +0.6, May +0.5). The next-hottest run-in to any joint decline is +0.30%/mo
   (Jul 2016). Every other joint decline came out of a flat or disinflating trend.
4. **Underlying inflation is still hot.** Core PPI (final demand less foods, energy, trade) rose
   +0.1% on the month and is running **+5.1% y/y**. Core CPI was flat (-0.0%) at +2.6% y/y.
   In 2020, by contrast, core collapsed alongside headline.

**Proposed one-line framing:** *Two indexes falling together is a once-a-year event. Two indexes
falling together while underlying inflation runs near 3.5% has never happened before in the
final-demand era.*

This is an **energy unwind sitting on top of hot underlying inflation** — mechanically closest to
the 2015 oil-collapse months, but occurring in an inflation regime that is the opposite of 2015's.

---

## 2. Data sources (exact, citable)

| What | Series ID | Source |
|---|---|---|
| CPI-U, all items, US city avg, **SA** | `CUSR0000SA0` | BLS API |
| CPI-U, all items, **NSA** (for y/y) | `CUUR0000SA0` | BLS API |
| CPI-U, all items less food & energy, SA | `CUSR0000SA0L1E` | BLS API |
| PPI final demand, **SA** | `WPSFD4` | BLS API |
| PPI final demand, **NSA** (for y/y) | `WPUFD4` | BLS API |
| PPI final demand **goods**, SA | `WPSFD41` | BLS API |
| PPI final demand less foods, energy, trade ("core"), SA | `WPSFD49116` | BLS API |

**API endpoint used (POST, no key required):**
`https://api.bls.gov/publicAPI/v1/timeseries/data/`

POST body example:
```json
{"seriesid":["CUSR0000SA0","WPSFD4"],"startyear":"2017","endyear":"2026"}
```

> **Gotcha worth recording.** The GET form documented in many places
> (`.../data/CUSR0000SA0?startyear=2010&endyear=2020`) **silently ignores the year parameters** and
> returns only the default 3 years. It does not error. Anyone reproducing this must POST. This is a
> live trap for reproducing our numbers.

**Release pages (for citation in the article):**
- CPI, June 2026: `https://www.bls.gov/news.release/archives/cpi_07142026.htm` (released 2026-07-14)
- CPI PDF: `https://www.bls.gov/news.release/pdf/cpi.pdf`
- PPI, June 2026: `https://www.bls.gov/news.release/archives/ppi_07152026.htm` (released 2026-07-15)
- PPI PDF: `https://www.bls.gov/news.release/pdf/ppi.pdf`
- CPI series landing: `https://www.bls.gov/cpi/data.htm`
- PPI series landing: `https://www.bls.gov/ppi/`

**Access note:** `bls.gov` HTML news releases return **HTTP 403 to automated fetchers** ("Access
Denied ... bot activity"). The **API is not blocked**. FRED (`fred.stlouisfed.org/graph/fredgraph.csv`)
was **unreachable from this environment entirely** (connection failed, not a 403), so FRED was not
used as a cross-check. See section 6.

---

## 3. Method

1. Pulled SA index **levels** for `CUSR0000SA0` and `WPSFD4` via two POST calls each (the v1 API caps
   at 10 years per call): 2007-2016 and 2017-2026.
2. Computed month-over-month percent change myself from the index levels:
   `pct = (idx[t] - idx[t-1]) / idx[t-1] * 100`, then rounded to 1 decimal to match BLS convention.
3. Flagged months where **both** rounded values are strictly < 0.
4. Enforced consecutiveness: any month whose prior month is missing is **excluded** rather than
   bridged. This matters exactly once (see the Oct 2025 gap below).
5. Cross-checked the June 2026 result against the published releases via independent news coverage,
   since BLS HTML is bot-blocked.

**Verification of June 2026 (computed vs published):**

| | Computed from index | BLS published | Match |
|---|---|---|---|
| CPI MoM SA | -0.4224% -> **-0.4** | -0.4 (JEC quotes -0.42) | yes |
| PPI MoM SA | -0.2771% -> **-0.3** | -0.3 | yes |
| CPI y/y NSA | +3.53% -> **+3.5** | 3.5 | yes |
| PPI y/y NSA | +5.51% -> **+5.5** | 5.5 | yes |
| Core CPI MoM | **-0.0** | flat | yes |
| Core CPI y/y | +2.57% -> **+2.6** | 2.6 | yes |
| FD goods MoM | **-1.4** | -1.4 | yes |

Raw index levels underpinning the headline: CPI 333.979 (May) -> 332.568 (Jun);
PPI FD 157.001 (May) -> 156.566 (Jun).

Every published figure reproduces from the index levels. The computation is sound.

---

## 4. The full table: every joint-decline month, Dec 2009 to Jun 2026

y/y columns are NSA (the basis BLS headlines). MoM columns are SA.

| # | Month | CPI MoM | PPI MoM | CPI y/y | PPI y/y | Core CPI MoM | Core PPI MoM | FD goods MoM | Context |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2010-02 | -0.1 | -0.2 | +2.1 | n/a | +0.0 | n/a | -0.6 | Post-GFC energy wobble |
| 2 | 2012-05 | -0.2 | -0.1 | +1.7 | +1.6 | +0.1 | n/a | -0.7 | Euro crisis, oil slide |
| 3 | 2012-06 | -0.1 | -0.3 | +1.7 | +1.3 | +0.2 | n/a | -0.6 | same |
| 4 | 2013-04 | -0.2 | -0.2 | +1.1 | +0.9 | +0.0 | n/a | -0.7 | Soft patch |
| 5 | 2014-11 | -0.2 | -0.2 | +1.3 | +1.3 | +0.1 | +0.0 | -0.4 | **Oil collapse begins** |
| 6 | 2014-12 | -0.3 | -0.3 | +0.8 | +0.9 | +0.1 | +0.1 | -1.3 | Oil collapse |
| 7 | 2015-01 | -0.6 | -0.6 | -0.1 | +0.0 | +0.1 | -0.1 | -1.8 | Oil collapse trough |
| 8 | 2015-09 | -0.2 | -0.4 | -0.0 | -1.1 | +0.2 | -0.1 | -1.1 | Second oil leg |
| 9 | 2015-12 | -0.1 | -0.1 | +0.7 | -1.1 | +0.1 | +0.1 | -0.6 | Oil |
| 10 | 2016-02 | -0.1 | -0.3 | +1.0 | +0.1 | +0.2 | +0.0 | -0.7 | Oil trough (~$26 WTI) |
| 11 | 2016-07 | -0.1 | -0.1 | +0.8 | +0.0 | +0.1 | +0.2 | -0.1 | Energy |
| 12 | 2017-05 | -0.1 | -0.1 | +1.9 | +2.3 | +0.1 | +0.1 | -0.7 | Energy |
| 13 | 2018-11 | -0.1 | -0.1 | +2.2 | +2.6 | +0.2 | +0.2 | -0.5 | Q4-18 oil selloff |
| 14 | 2019-01 | -0.1 | -0.3 | +1.6 | +1.9 | +0.3 | +0.2 | -0.9 | Oil selloff tail |
| 15 | 2020-03 | -0.5 | -0.5 | +1.5 | +0.3 | -0.1 | -0.2 | -1.8 | **COVID onset** |
| 16 | 2020-04 | -0.8 | -1.2 | +0.3 | -1.5 | -0.5 | -0.8 | -2.7 | **COVID trough** |
| 17 | **2026-06** | **-0.4** | **-0.3** | **+3.5** | **+5.5** | **-0.0** | **+0.1** | **-1.4** | **Energy unwind** |

**Clustering confirms the prior:** 10 of the 16 pre-2026 events sit in the 2014-2016 oil collapse
and its aftershocks; 2 are COVID; the rest are minor energy wobbles (2012 euro crisis, Q4-2018
oil selloff). **Every single one is an energy story.** There is no joint decline in this series
that is not driven by energy or a demand collapse.

### Strictness filter

Only **8 of 17** survive a "both <= -0.2" filter (i.e. are not resting on a single -0.1 print that
could round to zero): 2013-04, 2014-11, 2014-12, 2015-01, 2015-09, 2020-03, 2020-04, **2026-06**.

The other 9 (2010-02, 2012-05, 2012-06, 2015-12, 2016-02, 2016-07, 2017-05, 2018-11, 2019-01) have
at least one leg at exactly -0.1 and are **inside the noise**. This matters: the honest count is
"17 loosely, 8 if you require the declines to be meaningful."

**June 2026 is one of only 8 unambiguous joint declines, and one of only 4 where CPI fell 0.4% or
more** (the others: 2015-01, 2020-03, 2020-04).

### Gap structure

Gaps between consecutive joint declines, in months, descending:
`74, 27, 19, 18, 14, 10, 10, 8, 5, 3, 2, 2, 1, 1, 1, 1`

The 74-month gap (Apr 2020 -> Jun 2026) is the outlier by a wide margin.

### Ranking of the CPI decline itself

Most negative CPI MoM prints, Dec 2009 to Jun 2026:
`2020-04 (-0.8), 2015-01 (-0.6), 2020-03 (-0.5), 2026-06 (-0.4), 2013-03 (-0.3), 2014-12 (-0.3)`

June 2026 is the **4th largest monthly CPI decline in the series** and the largest since April 2020.
This corroborates the widely reported "biggest drop in six years."

### The swing

June 2026's CPI swing (this month's MoM minus last month's MoM) is **-0.9pp** (from +0.5 to -0.4).
That is the **2nd largest negative swing in the entire 197-month series**, behind only July 2022
(-1.3pp, from +1.3 to -0.0 — the post-peak gasoline unwind). Notably, July 2022 was *not* a joint
decline: CPI printed -0.0 (rounded), so it does not qualify.

### Independence check

CPI fell in 21 of 197 months (10.7%). PPI fell in 43 of 197 (21.8%). If the two were independent,
we would expect 4.6 joint months. We observe 17 — roughly **3.7x** the independent-chance rate.
The two indexes co-move strongly, which is expected (shared energy input), and is worth stating
explicitly so nobody reads the joint event as two independent coin flips. **Do not describe a joint
decline as a "1-in-N coincidence."** It is not a coincidence; it is one energy shock hitting two
indexes that both contain energy.

---

## 5. What is different about June 2026 (the actual story)

| Dimension | 2014-16 oil collapse | 2020 COVID | **June 2026** |
|---|---|---|---|
| Headline CPI y/y | ~0% | +0.3 to +1.5% | **+3.5%** |
| Core CPI MoM | positive (+0.1 to +0.2) | **negative** (-0.1, -0.5) | **flat (-0.0)** |
| Core PPI y/y | ~0-1% | negative | **+5.1%** |
| Prior 3mo CPI trend | flat/disinflating | flat | **+0.67%/mo accelerating** |
| Fed stance | on hold / gradual | emergency easing | **market pricing a Sept HIKE (63%)** |
| Driver | supply-side oil glut | demand collapse | **energy unwind after a spike** |

**The mechanism.** June's decline is narrow and energy-driven: CPI energy index -5.7% (biggest since
Apr 2020) while gasoline is still **+26.7% y/y**; PPI final demand goods -1.4% with gasoline -12%,
accounting for roughly two-thirds of the goods decline. Reporting attributes the energy spike that
is now unwinding to Middle East conflict. So this is a **round trip in oil**, not a broad
disinflation — the y/y energy figure is still deeply positive.

**Why it matters analytically:** in 2015 the energy decline pulled headline *toward* an already-low
core. In June 2026 the energy decline pulls headline *away from* a core that is still running
2.6% (CPI) and 5.1% (PPI). The gap between the headline print and the underlying trend is the
widest of any joint-decline month on record. That is the piece nobody else has assembled.

**The trap for other outlets:** a -0.4% CPI print alongside a -0.3% PPI print reads as
"inflation is beaten" (Breitbart's framing: "Inflation Crushed"). The core data says the opposite:
nothing about the underlying trend changed in June. One month of cheaper gasoline did.

---

## 6. What the data CANNOT tell us — read this before writing

1. **These are current-vintage numbers, not what printed at the time.** Both agencies recompute
   seasonal adjustment factors annually (CPI revises ~5 years of SA data each January; PPI similarly
   revises ~4 years). **Every historical figure in the table above is the revised, current-vintage
   value.** Some of these months may not have *printed* as joint declines on the day. We have **not**
   reconstructed real-time vintages (ALFRED would be needed, and FRED/ALFRED was unreachable). So the
   claim must be phrased as **"as the data now stands"**, not "markets saw N joint declines."
   *This is the single most important caveat.* Do not write "this has happened 17 times" without it.
2. **June 2026 itself will be revised.** PPI May 2026 was already revised down (+0.6 from a higher
   initial print) in the June release. A -0.3 can become -0.2 or -0.4. The 3-month CPI run-in
   (+0.9/+0.6/+0.5) is also subject to next January's seasonal recalculation.
3. **A -0.1 print is not a decline in any meaningful sense.** Nine of the 17 rest on a -0.1 leg.
   Use the 8-month strict count if the sentence implies significance. Do not present "17" as if all
   17 are equivalent events.
4. **Hard series break: PPI final demand does not exist before November 2009.** The FD-ID system
   started then. The analysis window is therefore **Dec 2009 to Jun 2026 (197 months)** — it is
   **not possible** to say "the first time since [1990s]" or make any pre-2009 claim about final
   demand. The legacy stage-of-processing "finished goods" series (`WPSSOP3000`/`WPUSOP3000`), which
   would have extended the concept to 1947, **does not exist in the BLS API** (returns "Series does
   not exist") and FRED's `PPIFGS` was unreachable. **We could not extend the history.** Any claim
   like "first time in decades" is UNSUPPORTED by what we have. Cap all claims at "since the final
   demand series began in 2009."
5. **October 2025 CPI does not exist.** BLS footnote code X: *"Data unavailable due to the 2025
   lapse in appropriations."* So Oct 2025 and Nov 2025 have **no computable CPI MoM**. Two months
   are structurally missing from the 197. PPI has October 2025; CPI does not. If either of those
   months would have been a joint decline, we cannot know. This slightly weakens the "74 months"
   claim — strictly it is "74 calendar months, of which 2 are unobservable on the CPI side."
   **Disclose this.** It also means the "first since Aug 2025" PPI claim and our CPI series are not
   on identical footings.
6. **Seasonal adjustment is a modeling choice, not a measurement.** Joint declines are far more
   common in NSA data for seasonal reasons; the entire analysis is conditional on BLS's SA method.
7. **Two data points are not a regime.** June 2026 is one month. The 74-month gap is a real,
   computed fact; "inflation has turned" is a forecast and this data cannot support it. Core at
   +5.1% y/y (PPI) actively argues against it.
8. **Correlation is mechanical, not causal.** PPI does not "lead" CPI here. Both contain energy and
   both got hit by the same oil move in the same month. Do not imply a pipeline story.

---

## 7. Prior published analysis of this specific question

**Searched and found none.** No outlet, Fed regional bank, or research shop appears to have computed
the joint CPI/PPI monthly-decline frequency. Coverage treats the two releases as separate events
one day apart (CPI on 7/14, PPI on 7/15).

The closest published framings, none of which contain a count:
- XTB: "PPI Confirms Cooling Price Pressure Trend From CPI" — narrative, no data work.
  `https://www.xtb.com/int/market-analysis/news-and-research/breaking-us-ppi-confirms-cooling-price-pressure-trend-from-cpi`
- Moomoo: "The PPI, in tandem with the CPI, has dashed July rate-hike expectations" — notes the
  tandem move, no frequency analysis.
  `https://www.moomoo.com/news/post/73017368/the-ppi-in-tandem-with-the-cpi-has-dashed-july`
- Benzinga: "PPI Drops By 0.3% In June, Backing The Case For A Fed On Hold"
  `https://www.benzinga.com/markets/economic-data/26/07/60466687/producer-inflation-june-2026-report-fed-interest-rates-july-preview`

**The joint-decline framing appears to be genuinely unoccupied.** This supports running the piece.

**Correction opportunity (verified false claim in the wild).** Cryptobriefing published
*"United States reports first negative month-over-month CPI reading since 2000"*
(`https://cryptobriefing.com/us-negative-cpi-reading-since-2000/`). **This is flatly false.** Per
`CUSR0000SA0`, CPI SA fell in 21 separate months since 2009 alone, including -0.8% in April 2020 and
-0.6% in January 2015. The BLS data disproves it outright. Same outlet elsewhere correctly reported
the PPI figure, so it is inconsistent with itself. Worth a footnote — it demonstrates the value of
doing the arithmetic.

---

## 8. Proposed article structure (PK writes)

**Working title direction:** something on "the joint decline that shouldn't have happened yet" —
avoid "rare," because the honest finding is that it is *not* rare in the abstract.

1. **Lede — resist the obvious.** Both indexes fell. The instinct is "inflation is beaten." The
   data does not say that.
2. **The base rate, stated against interest.** 17 times in 197 months. About once a year. On its
   own this is *not* a rare event, and any outlet calling it unprecedented is wrong. Establishes
   credibility by giving away the deflationary angle first.
3. **The turn — the 74-month gap.** Zero joint declines in the entire inflation era (Jan 2021 -
   May 2026, 63 months). The previous record gap was 27 months. Something did break its streak.
4. **The table.** All 17 months. Let the reader see the clustering: 2014-16 oil, 2020 COVID. Every
   one is an energy story.
5. **What makes June 2026 unlike all 16 others.** The regime table from section 5. The load-bearing
   fact: **it is the only joint decline ever recorded above 2.2% CPI y/y, and it happened at 3.5%.**
   And the only one following an acceleration (+0.67%/mo prior three months).
6. **The core data kills the "inflation is beaten" read.** Core CPI flat, core PPI +0.1% MoM and
   **+5.1% y/y**. Gasoline still +26.7% y/y. This is a round trip in oil, not disinflation. The
   market still prices a September *hike* at 63%.
7. **Caveats, in the body, not buried.** Revisions (May PPI already revised down). The -0.1 noise
   problem (only 8 of 17 are unambiguous). The Nov-2009 series floor. **The missing October 2025 CPI
   from the shutdown.** Running these in the body rather than a footnote is the differentiator
   versus the outlets that got this wrong.
8. **Close on the open question, not a prediction.** Whether June was the turn depends entirely on
   whether core follows. It hasn't yet. Do not forecast.

**Charts worth building:**
- Scatter: CPI MoM (x) vs PPI MoM (y), 197 points, joint-decline quadrant shaded, June 2026 labeled.
  Immediately shows the event is real but not isolated.
- Timeline strip: 197 months, joint declines marked, showing the 2014-16 cluster, the COVID pair,
  the 74-month desert, then June 2026.
- **The money chart:** each joint decline plotted by CPI y/y at the time. Sixteen dots between -0.1%
  and +2.2%, then June 2026 alone at +3.5%. One image carries the whole thesis.

**Honest-answer check:** the "this is unremarkable" outcome was live and is *partly* true — the raw
joint-decline event is ordinary. The finding is not manufactured, but it is **conditional**: it is
the *regime*, not the *event*, that is unprecedented. The article must be built on that distinction
or it overclaims.

---

## 9. Reproduction

All raw BLS API responses and the computation script are archived alongside this file:
`C:\Users\W11\Documents\Claude\Projects\MoneyAndWorld\research\cpi-ppi-data\`

| File | Contents |
|---|---|
| `post_a.json`, `post_b.json` | `CUSR0000SA0` + `WPSFD4` SA index levels, 2007-2026 |
| `nsa_a.json`, `nsa_b.json` | `CUUR0000SA0` + `WPUFD4` NSA index levels (y/y basis) |
| `core_a.json`, `core_b.json` | `CUSR0000SA0L1E` core CPI + `WPSFD41` FD goods |
| `pcore_a.json`, `pcore_b.json` | `WPSFD49116` core PPI (starts 2013-08) |
| `computed.json` | Derived MoM series + joint-month list |
| `final_table.json` | The section 4 table as structured data |
| `compute.py` | The computation, re-runnable against the JSON |

These are the verbatim API responses as pulled on 2026-07-15, so the vintage is frozen even after
BLS revises. Re-run: `python compute.py` from that directory.
