API
The live picture, free. Depth, metered.
The current headline state is free to query with no key: verdicts, prices, counts, the Hormuz Index, and shallow history. CORS is open, and cache headers are set so a polite caller never overruns the upstream feed. Full history, the per-vessel manifest, and the other intelligence feeds are machine-payable per request. If you only need one endpoint, start with /status; it bundles every live indicator the homepage renders.
License: the indicators and metrics we compute (verdicts, day counts, derived ratios, normalized aggregates, baselines, synthesis prose, methodology) are released under CC0 1.0 (public domain). Use them however you like: republish, redistribute, remix, no attribution required (credit is appreciated). The upstream third-party datasets we ingest (AIS broadcast data, EIA petroleum series, IMF PortWatch transit counts, OFAC SDN entries, and the supplementary feeds disclosed on the methodology page) each carry their own terms. We don’t relicense those; if you plan to redistribute raw upstream data, check the original publisher’s terms first.
Snapshot
One bundle, every live indicator. The recommended starting point.
All-in-one bundle: verdict, live oil prices, IMF PortWatch daily transit count + throughput, AIS concurrent presence overlay, insurance multiple, trade impact, carrier suspensions, pipeline bypass, SPR, gas, and a per-section dataHealth chip. Powers the embed widget; recommended starting point for newsroom integrations.
curl https://straits.live/status
{
"asOf": "2026-09-09T12:57:14Z",
"status": "restricted",
"verdict": { "status": "closed", "short": "Effectively no", "long": "…", "basis": "insurance" },
"brent": 100.74, "wti": 95.87, "change24h": 2.53,
"transits": { "count": 6, "baseline": 85, "throughputPct": 7, "asOfDate": "2026-08-30", "asOfAgeDays": 10, "stale": false },
"insurance": { "multiple": 40, "vlccPremiumLow": 250000, "vlccPremiumHigh": 10000000 },
"hormuzIndex": { "crisisPressure": { "value": 92 }, "escalationProbability": { "value": 55 } },
"carrierSuspensions": [ … ],
"dataHealth": { "ships": { "source": "live" }, "oil": { "source": "live" }, … }
}Markets & risk
Prices, premiums, odds: what the market is doing right now.
Crisis Pressure and Escalation Forecast composites: current reading plus a per-component breakdown for each. Time series is opt-in: append ?history=24h, 7d, or 30d, returned nested at indices.<name>.history (30d resolves to daily points from the historical rollup, the rest to the raw 5-minute series).
Queryhistory (24h | 7d | 30d)
curl https://straits.live/api/index
{
"asOf": "2026-08-23T13:00:00Z",
"indices": {
"crisisPressure": { "value": 94, "band": "extreme", "components": { … } },
"escalationProbability": { "value": 56, "band": "elevated", "components": { … } }
}
}Brent and WTI time-series
Underlying feed every 10 minutes; not cached at the edge, each request reaches the origin
Rolling Brent and WTI prices from intraday front-month futures contracts (Yahoo Finance chart data, continuous quotes as fallback, EIA daily backstop). Companion to /data/oil.csv for programmatic consumers. The points are futures. The latest block normally holds a futures print too, but when the futures feed has been stale for over 2 hours it holds the EIA daily Dated Brent spot close, which can sit well off futures. Tell them apart with latest.sourceKind ("eia" for the spot close, null for futures) and latest.observedAt (the trading day of that close). source and stale are unchanged by it.
Querylimit (the newest N stored points, default 168, max 2000; points are not evenly spaced, so N points cover an irregular span, not a fixed number of hours), since (ISO timestamp; use it for a time window, and pair it with a large limit when the window is long)
curl 'https://straits.live/api/v1/oil?limit=2'
{
"asOf": "2026-06-10T17:23:00Z",
"count": 2,
"source": "Intraday Brent / WTI front-month futures contracts …",
"points": [
{ "t": 1781110302601, "iso": "2026-06-10T16:51:42Z", "brent": 93.99, "wti": 91.06 },
{ "t": 1781112144785, "iso": "2026-06-10T17:22:24Z", "brent": 94.12, "wti": 91.20 }
]
}Top Hormuz / Iran-conflict / oil-shock contracts from Kalshi (api.elections.kalshi.com), Polymarket (gamma-api.polymarket.com) and Manifold. Strict keyword filter to avoid sweeping in election or macro contracts. liquidityUsd is null where a venue does not report it (Kalshi). total counts the rows that passed the deadline and venue filters before the limit, limit is the value applied, and truncated is true when total is more than count.
Querylimit (default 50, max 50), venue (kalshi | polymarket | manifold)
curl 'https://straits.live/api/v1/markets?venue=polymarket&limit=1'
{
"asOf": "2026-06-10T17:23:00Z",
"count": 1,
"total": 15,
"limit": 1,
"truncated": true,
"markets": [
{ "id": "polymarket_665374", "venue": "polymarket",
"title": "Will the U.S. invade Iran before 2027?",
"probability": 0.175, "volumeUsd": 35039246.83,
"closeAt": "2026-12-31T00:00:00Z",
"sourceUrl": "https://polymarket.com/…" }
]
}Per-state regular-grade averages plus a national mean computed across the 50 states + DC.
Querystates (1 / true to include the per-state list; default omitted for payload size)
Throughput
Authoritative daily transit count from IMF PortWatch (chokepoint6 dataset), plus a comparative table across the five global energy chokepoints and two coarser fallback aggregates used when AIS is silent.
IMF PortWatch daily transits
Underlying data publishes weekly (Tue 9 AM ET); re-fetched hourly 12-16 UTC, then 18 and 21 UTC
The dashboard's authoritative throughput figure. Carries the per-type breakdown (tanker, cargo, container, dry bulk, general cargo, Ro-Ro), capacity in deadweight tonnage, the trailing 30-day rolling baseline median, and a separate pre-crisis baseline median (fixed window: the final pre-crisis year, 2025-02-28 to 2026-02-27) used as the stable peacetime anchor. The per-type fields nest: nTotal is nTanker plus nCargo, and nCargo is nContainer plus nDryBulk plus nGeneralCargo plus nRoro, so summing all seven fields double-counts. Not a programmer? The same series is a readable day-by-day table at /how-many-ships-passed-through-the-strait-of-hormuz-today.
Queryhistory (1 / true to include chokepointTransitsHistory rows), limit (default 90, max 365)
curl https://straits.live/api/v1/transits
{
"asOf": "2026-08-30",
"generatedAt": "2026-09-09T13:02:00Z",
"methodology": "IMF PortWatch daily vessel transit count …",
"latest": {
"date": "2026-08-30",
"nTotal": 6, "nTanker": 2, "nCargo": 4, "nContainer": 0,
"capacity": 70732,
"baselineMedian": 5,
"preCrisisBaselineMedian": 85,
"ma7": 5.57,
"provisional": false
}
}Side-by-side daily counts for Hormuz, Bab el-Mandeb, Suez, the Cape of Good Hope, and Malacca, sorted Hormuz first, then by nTotal descending, largest route by vessel count first.
Queryhistory (1 / true to include per-chokepoint daily history[])
The upstream port-page aggregates this fed went behind a subscription on 2026-08-28. The endpoint still responds but returns a frozen snapshot from that date, marked "RETIRED FEED, DO NOT READ AS CURRENT". Do not poll this as an AIS fallback; for day-by-day transit counts use /api/v1/transits or the readable table at /how-many-ships-passed-through-the-strait-of-hormuz-today.
Same upstream loss as /api/v1/hormuz-snapshot: the source port-page aggregates went behind a subscription on 2026-08-28. The endpoint still responds but returns a frozen snapshot from that date, marked "RETIRED FEED, DO NOT READ AS CURRENT".
Live AIS & vessels
AIS-derived overlay: live presence, port congestion, AIS-gap detection, the OFAC × AIS sanctioned-vessel join, and a fallback vessel manifest when AIS is silent. Persian Gulf bounding box.
Live counts at Fujairah, Sohar, Bandar Abbas, and Jebel Ali derived from live AIS positions inside a 10–18 km radius per port. Broken down by status (anchored, transiting) and vessel type.
Anchored-vessel count inside the Persian Gulf bounding box, hourly. Powers the homepage sparkline.
Querylimit (default 168 = 7 days hourly, max 720), since (ISO)
Hourly cross-tab of vessels in transit by vessel type (tanker, cargo, military, other). Pairs with /api/v1/stranded for a full picture of the strait's vessel mix over time. The response carries a methodology field covering how type is resolved and why the military count is a floor.
Querylimit (default 168 = 7 days hourly, max 720), since (ISO)
Free summary: the count of tankers gone dark inside the strait core area plus the 7-day baseline. Filters: type === tanker, totalSightings ≥ 50, last position in lat 24–28 / lng 55–58, last seen 3–24 hours ago. The per-vessel dark-fleet identities are in the premium vessel-intelligence API.
OFAC SDN cross-join (count)
Cross-join every 15 minutes; OFAC list checked daily and rebuilt when OFAC changes it
Free summary: the count of vessels visible on AIS in the Persian Gulf window whose identity matches an OFAC SDN entry (IMO / normalised-name join; false positives possible). The per-vessel manifest with sanction programs, flag, and call sign is in the premium vessel-intelligence API.
Free summary: how many vessels are on live AIS right now across the Gulf and Cape routes, broken down by corridor and ship type. The per-vessel manifest with identities is in the premium vessel-intelligence API. ?flagged=1 counts the OFAC-SDN-matched subset.
Queryflagged (1 / true for OFAC-matched only), region (hormuz | cape)
Macro & risk pricing
Hand-curated indicators, reviewed from time to time against trade press, that move slower than oil price but matter more for "is the strait open in any commercial sense?": war-risk insurance, world-oil-at-risk, and the Joint War Committee listed-areas circular.
Multiple over the peace-baseline VLCC premium, per-voyage cost in USD from the peacetime baseline to the current crisis high, and the list of P&I clubs and war-risk underwriters that have publicly withdrawn cover, imposed quotas, or refused renewals.
curl https://straits.live/api/v1/insurance
{
"asOf": "2026-08-05T17:23:00Z",
"methodology": "War-risk insurance multiple compares …",
"insurance": {
"multiple": 30,
"vlccPremiumLow": 250000,
"vlccPremiumHigh": 10000000,
"withdrawnClubs": ["Gard", "Skuld", "North Standard", …],
"sourceName": "straits.live estimate · carrier advisories, Lloyd's List, TradeWinds, Reuters"
}
}EIA/IEA shares of global seaborne oil and LNG that transit the strait, a curated estimate of the daily economic cost, the most-affected importing economies, and the extra voyage days of the Cape reroute.
Marine war-risk high-risk-areas designations as published in the industry circular, plus a flag noting whether the latest revision mentions the Arabian Gulf. Drives war-risk premium loads at most London-market underwriters. updatedAt restamps on every check; lastChangedAt moves only when the circular itself changes.
Carriers & bypass routes
Top container carriers' Strait of Hormuz posture and pipeline routes that move crude out of the Gulf without transiting the strait.
Top global container carriers (ranked by TEU capacity) and their current posture: suspended, rerouting, limited, or transiting. Includes vessels-trapped count, combined trapped-TEU capacity, and the per-carrier surcharge in USD per TEU. hormuzPosture is the operative field: ≥5 carriers with hormuzPosture "stopped" drives the dashboard's "effectively closed" verdict, counting only rows whose advisoryDate (the carrier's own advisory date) is 60 days old or less.
curl https://straits.live/api/v1/carriers
{
"asOf": "2026-09-15T17:01:00Z",
"count": 9,
"carriers": [
{ "id": "cma-cgm", "carrier": "CMA CGM", "rank": 3, "status": "rerouting",
"surchargeUsdPerTeu": 950, "vesselsTrapped": 8, "trappedTeu": null,
"notes": "…", "sourceName": "CMA CGM Q2 earnings call, via WorldCargo News", "sourceUrl": "https://…" }
]
}Petroline (Saudi Arabia → Yanbu) and Habshan-Fujairah (UAE → Gulf of Oman) are the main lines that move crude out of the Gulf without transiting Hormuz. Each row carries nameplate capacity in BPD and current utilisation percent.
Iran financial stress
Open-market USD/IRR rate as a proxy for civilian-side pressure inside Iran.
Sell/buy rates in both Toman (1 Toman = 10 Rial) and Rial, plus 24-hour and 7-day percentage deltas off the midRial. The basis field is "direct" for a quoted dollar rate or "cross-aed" when the source is not quoting the dollar and the figure is implied from the UAE dirham rate at the 3.6725 peg.
Editorial briefs
Dated daily briefs: AI-assisted when an API key is configured, curated fallback otherwise.
JSON archive of every brief written by the dailyBrief Cloud Function, keyed by UTC date. Each brief carries 3–6 bullets, a short summary, the day's Brent price plus 24-hour delta, and the day's transit count. source is ai-assisted, curated or mock (the template fallback); before 2026-10-02 ai-assisted briefs carried a vendor-specific value.
Querydate (YYYY-MM-DD for a single brief; 404 if missing), limit (default 30, max 120)
Real-time deltas
Lightweight polling endpoints for client-side updaters and "while-you-were-away" experiences.
Bare-minimum payload polled by the homepage ticker every two minutes: Brent price, 24-hour change, transit and stranded counts, plus a verifiedAt anchor. The Brent price is a futures print, except that when the futures feed has been stale for over 2 hours it is the EIA daily Dated Brent spot close. oil.sourceKind is "eia" for that case (null otherwise) and oil.observedAt is the trading day of the close; oil.source and oil.stale are not flipped for it.
Compares the current state to a caller-provided anchor timestamp. Returns a material flag once any of: ≥24h elapsed, |Brent %| ≥ 1, ≥1 event, ≥1 carrier posture change, |transit delta| ≥ 3, or |stranded delta| ≥ 5.
Queryat (required ISO timestamp)
Inventories & reserves
The slow-moving counter-pressure to a fast-moving disruption.
Backed by EIA Weekly Petroleum Status Report. Carries the 4-week change so spike-vs-baseline reads correctly.
Cushing, Oklahoma is the WTI delivery hub. Inventory swings here track the North-American crude balance independent of the Gulf-Coast / SPR picture; pairs with the Brent–WTI spread to indicate whether disruption is global or American-specific.
Events
Indexed strikes, ship incidents, closures, and negotiations.
Indexed strikes, ship incidents, closures, and negotiations. Mirrors the curated Firestore record so consumers see the same source attribution as the homepage timeline. Companion to /data/events.csv and /feed.xml. count is headlines, one row per outlet report; stories (added 8 October 2026) groups the same rows by incident, because several outlets can report one.
Querysince (ISO), type (strike | ship_incident | closure | negotiation), limit (default 50, max 200)
curl 'https://straits.live/api/v1/events?type=strike&limit=2'
{
"asOf": "2026-05-27T14:30:00Z",
"count": 1, "stories": 1,
"events": [
{ "id": "ev_2026-05-26_…", "type": "strike", "severity": "high",
"occurredAt": "2026-05-26T11:20:00Z",
"title": "Strike reported on Bandar Abbas refinery",
"sourceName": "Reuters", "sourceUrl": "https://…" }
]
}Other formats.
For workflows that don’t want JSON: spreadsheet imports, RSS readers, copy-paste embed.
Downloads catalogueEvery CSV/JSON download on one page with per-file licensing. Start here for spreadsheet or notebook work.
Status snapshot CSVOne-row snapshot of the current dashboard state: verdict, transits, AIS-dark count, Brent, insurance multiple, JWC, Tehran rate (with tehran_rate_basis: direct, or cross-aed when implied from the dirham rate at the 3.6725 peg), carriers, and data-source health. transits_provisional and transits_ma7 flag a still-revisable newest PortWatch row and give its 7-day mean. brent_usd is a futures print, except that when the futures feed has been stale for over 2 hours it is the EIA daily spot close; brent_basis (futures or eia-spot, appended 8 October 2026) says which. Re-poll daily to build a history in your spreadsheet. events_recent_count counts headlines; events_recent_stories (appended 8 October 2026) groups them into stories. Column order is stable; new columns are appended.
Daily transits CSVIMF PortWatch daily transit history since 2025-02-28 (upstream goes back to 2019), the series the prediction-market reopening contracts resolve on (7-day average vs 60).
Hormuz Index CSVCrisis Pressure + Escalation Forecast history at 5-minute cadence, last 7 days, with band labels. CC0.
Oil prices CSVBrent + WTI history, suitable for spreadsheet ingest.
Events CSVIndexed war and diplomacy events with sourceUrl per row. One row per headline, so one incident can fill several rows.
Events RSSIndexed strikes, ship incidents, closures, and negotiations as RSS 2.0.
Status flips RSSOne item per change in the operational verdict (open ↔ restricted ↔ closed). Designed for press-monitor ingestion.
Sanctioned vessels RSSAIS-observed vessels currently matched against the OFAC SDN list, newest match first.
Daily briefs RSSDated daily briefs on the Strait of Hormuz crisis. Each brief is rewritten as events move, settles at the end of the UTC day, then stays online and citable by date.
Embed widgetCopy-paste iframe with live status badge for journalists and bloggers.
Conventions.
Every JSON endpoint returns a top-level schema URL (the canonical address of the response shape) and an asOf timestamp, the time of the data in the response (null when the feed has none). The v1 endpoints also return generatedAt, the time the response was built, which is later than asOf whenever the data is cached or the feed is slow. On the curated routes (pipelines, carriers, trade-impact) asOf is the date of the newest row and oldestAuthoredAt the date of the oldest. Time-series payloads use unix-millisecond keys for chart libraries and a parallel iso string for human inspection. Empty results return a valid envelope with an empty array, never a 404.
When an upstream feed is unreachable, the affected endpoint returns the most recent successful payload with its existing asOf. The /status response surfaces a per-section dataHealth chip so consumers can detect stale-but-served values. The staleness threshold is per feed, matched to that feed’s own publishing cadence, not a single 24-hour rule: an intraday price is downgraded to source: "stale" within the hour, while a weekly curated indicator stays "curated" for days. Read each section’s verifiedAt for the actual age rather than inferring one from the chip.
Attribution is appreciated but not required. If you cite a value, link to the originating source on /methodology; Straits is an aggregator, not the system of record.
Reader-funded
The summary tier in this catalogue is free to query, with no key and no rate card; the only limit is 60 requests a minute per IP. If it just saved you a scraping afternoon, the servers that answer it run on about $83 a month from readers. One-time, by card or in XRP; no account, no recurring charge.
October running costs: about $83. No ad networks; readers are the only funding