Strait of Hormuz Closure: Where Did 1.5 Billion Barrels Go? Testing the Hidden-Shortage Claim With EIA Data
By OilPriceAPI · Published November 11, 2026 · EIA weekly stocks to the week ending Oct 30, 2026 (released Nov 4, 2026); EIA STEO, November 2026
On EIA's numbers, about 30% of the lost barrels came out of world stocks, and lower consumption matched the rest. EIA's Short-Term Energy Outlook (STEO, November 2026) puts world production 1,737 million barrels below its February 2026 level over March to July 2026, against an implied world stock draw of 514 million barrels (514 ÷ 1,737 = 30%).
Goehring & Rozencwajg's (G&R) hidden-shortage case disputes that consumption drop. Tested against EIA data, G&R are directionally right: US stocks fell by a record amount and Cushing touched its lowest level since August 2014. But two of their numbers were early or do not match what EIA shows.
The claim
Four claims from G&R, paraphrased. The last three come from its blog post of Aug 7, 2026, “Why Haven't the Tanks Run Dry?”
| G&R claim (paraphrased) | What EIA data shows | Verdict |
|---|---|---|
| More than 1.5 billion barrels of supply withheld by the closure | World production 1,737M bbl below its Feb 2026 level, Mar–Jul 2026 (STEO) | Plausible on supply; only 514M bbl shows up as a stock draw |
| US crude plus products down about 200M bbl since March, the sharpest drop in 40 years of data | −156.8M bbl from Mar 6 to Jul 31; −195.8M bbl by Oct 30, 2026. Largest 22-week drop in EIA weekly data since 1990 | Early: about 200M arrived in late October. The record holds |
| Cushing near 20M bbl, effectively its operational minimum | 18.6M bbl in the week ending Jul 24, 2026, the lowest since Aug 2014 | The level holds for late July |
| OECD stocks drew nearly 300M bbl through June | OECD commercial stocks −89.7M bbl, Feb–Jun 2026 (STEO) | Does not match EIA |
Sources: G&R (claim 1) and G&R blog, Aug 7, 2026 (claims 2–4), both paraphrased; EIA weekly stocks, week ending Oct 30, 2026 (WTTSTUS1, W_EPC0_SAX_YCUOK_MBBL); EIA STEO, November 2026 (PAPR_WORLD, T3_STCHANGE_WORLD, PASC_OECD_T3).
Supply lost vs stocks drawn
The research behind this article has no figure for how much oil normally moves through the Strait of Hormuz. So we test the claim from the balance side: barrels not produced against barrels drawn from stocks.
| Window | World production below Feb 2026 level (million bbl) | Implied world stock draw (million bbl) | Neither produced nor drawn from stocks (million bbl) |
|---|---|---|---|
| Mar–Jul 2026 | 1,737 | 514 | 1,223 |
| Mar–Oct 2026 | 2,285 | 572 | 1,713 |
Source: EIA STEO, November 2026. Production shortfall from PAPR_WORLD against its February 2026 level; stock draw from T3_STCHANGE_WORLD; both summed by month. Last column = shortfall − stock draw.
The shortfall passes G&R's 1.5 billion barrels by July. But stocks covered about 30% of it through July and 25% through October (572 ÷ 2,285). In STEO's balance, lower consumption covers the rest.
Measured OECD stocks also drew less than claimed. STEO's OECD commercial inventory fell 89.7 million barrels from February to June 2026, about 30% of G&R's figure of nearly 300 million (89.7 ÷ 300). It was 50.9 million below February in July and 100.6 million below in October. The STEO series counts commercial stocks only; the research does not show which measure G&R used.
US stocks: the SPR did most of the work
US crude plus products, including the strategic petroleum reserve (EIA WTTSTUS1), fell 156.8 million barrels from Mar 6 to Jul 31, 2026. The largest draw visible by G&R's Aug 7 post was 165.3 million, in the week ending Jul 3. The total reached 195.8 million by Oct 30. So G&R's figure of about 200 million was early in August and close by late October.
The record claim holds. The 22-week drop to Jun 26, 2026 was 188.6 million barrels, against a previous worst of 158.1 million in February 2000, in EIA weekly data since 1990. That is 30.5 million barrels, or 19%, deeper (188.6 ÷ 158.1 − 1).
| US stock (EIA series) | Window, 2026 | Change (million bbl) |
|---|---|---|
| Total crude + products incl. SPR (WTTSTUS1) | Mar 6 – Oct 30 | −195.8 |
| SPR crude (WCSSTUS1), 415.4 → 282.2 | Mar 6 – Oct 30 | −133.3 |
| Commercial crude + products (WTESTUS1) | Mar 6 – Oct 30 | −62.6 |
| Commercial crude | Feb 27 – Oct 30 | −29.5 |
| Gasoline | Feb 27 – Oct 30 | −44.2 |
| Distillate | Feb 27 – Oct 30 | −21.5 |
Source: EIA weekly stocks, week ending Oct 30, 2026 (released Nov 4, 2026). Changes use unrounded data, so the SPR and commercial rows do not sum exactly to the total. The last three rows start a week earlier and leave out other products, so they do not add up to the commercial row.
The SPR supplied 68% of the US draw (133.3 ÷ 195.8). Commercial stocks fell 62.6 million barrels; of the three categories shown, gasoline fell most. Weekly levels are on the weekly US oil inventory report and the SPR level page.
Cushing: near 20 million in July, rebuilt since
Crude stocks at Cushing, Oklahoma, the WTI delivery hub, hit an EIA 2026 low of 18.6 million barrels in the week ending Jul 24, 2026, the lowest since August 2014. G&R's figure of about 20 million was right for late July.
Stocks were 22.6 million in the week of Aug 7 and 27.2 million on Oct 30, 2026, 8.6 million above the July low. The research has no independent figure for Cushing's operational minimum; that part is G&R's judgment. Track the weekly level on the Cushing storage levels page or through the Cushing oil storage API.
The demand-destruction dispute
This is where the claim turns. STEO world consumption fell from 104.3 million barrels a day in February 2026 to 99.4 in April, a drop of 4.9 million barrels a day (4.7%). In EIA's accounting, that drop is why a 1,737 million barrel shortfall needed only 514 million barrels from stocks by July.
G&R dispute that drop. Production minus consumption equals the change in stocks. If consumption stayed closer to its February level, the world stock draw was larger than 514 million barrels, and the extra barrels came from stocks the published data does not capture. That is the hidden shortage.
The measured stocks do not settle it. US crude plus products fell 195.8 million barrels (Mar 6 to Oct 30) and OECD commercial stocks 100.6 million (February to October), both far below the 2,285 million barrel shortfall over March to October. That fits EIA's demand drop, or draws from stocks these series do not cover.
The verdict would move toward G&R if EIA revised 2026 consumption up without a matching revision to production, or if large draws appeared in stock data outside these series.
What to watch
Each item below is an observable condition, not a forecast.
- SPR refill. The SPR held 282.2 million barrels in the week ending Oct 30, 2026, down from 415.4 million on Mar 6. Weekly increases in EIA WCSSTUS1 would show refilling has begun.
- Cushing. 27.2 million barrels on Oct 30, 2026. A fall back toward the July low of 18.6 million would reopen the operational-minimum question.
- Distillate stocks. 99.3 million barrels in the week ending Oct 30, 2026 (EIA WDISTUS1), the lowest since May 2003 and 21.5 million below Feb 27. Weekly builds or draws show whether that is turning.
- STEO consumption. EIA's next estimates of world consumption for March to October 2026 are the numbers the dispute turns on.
Track it with the API
CUSHING_STORAGE carries EIA's weekly Cushing stocks in million barrels; for Oct 30, 2026 it read 27.25, matching EIA's 27.2 million. The SPR series US_SPR is on the storage endpoints, which keep about 90 days of history: not enough to reach the March starting level, so use EIA WCSSTUS1 for the full drawdown. The API has no codes yet for weekly US commercial crude, gasoline or distillate stocks.
import requests
API = "https://api.oilpriceapi.com"
HEADERS = {"Authorization": "Token YOUR_API_KEY"}
def get(path, **params):
r = requests.get(API + path, headers=HEADERS, params=params, timeout=10)
r.raise_for_status()
return r.json()
# Cushing crude stocks, EIA weekly, million barrels (paid plans).
rows = get("/v1/prices/past_year", by_code="CUSHING_STORAGE")["data"]["prices"]
weekly = {}
for row in rows:
day = (row.get("as_of") or row.get("created_at") or "")[:10]
if day and isinstance(row.get("price"), (int, float)):
weekly[day] = row["price"] # one value per date, as returned
if not weekly:
raise SystemExit("No CUSHING_STORAGE rows returned")
latest, low = max(weekly), min(weekly, key=weekly.get)
print(f"Cushing latest: {weekly[latest]:.1f}M bbl ({latest})")
print(f"Cushing 1-year low: {weekly[low]:.1f}M bbl ({low})")
# US SPR, about 90 days of weekly history (plans above Hobby).
spr = get("/v1/storage/history/US_SPR")
print(spr) # inspect the fields before you build on themThe past_year endpoint needs a paid plan. Free and Hobby keys get a 403 from the storage endpoints.