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. marketTime: the trade time the upstream reported for the Brent quote; oilAsOf is when we last checked.
curl https://straits.live/status
{
"asOf": "2026-10-16T14:41:06Z",
"status": "closed",
"verdict": { "status": "closed", "short": "Effectively no", "long": "…", "basis": "insurance" },
"brent": 105.28, "wti": 97.32, "change24h": 0.27,
"transits": { "count": 2, "baseline": 85, "throughputPct": 2, "asOfDate": "2026-10-11", "asOfAgeDays": 5, "stale": false },
"insurance": { "multiple": 30, "vlccPremiumLow": 250000, "vlccPremiumHigh": 10000000 },
"hormuzIndex": { "crisisPressure": { "value": 87 }, "escalationProbability": { "value": 60 } },
"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 series, 10 minutes apart (5 before 2026-11-03)).
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; latest can lag up to 10 minutes and the points up to 35 minutes (server memo plus 5-minute edge cache)
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. latest.marketTime: the trade time the upstream reported for the Brent quote; asOf is when we last checked.
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,
"pointCount": 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. A keyword filter keeps out contracts that do not name Hormuz, Iran or oil; election-framed events that do name Hormuz can appear, and the Hormuz Index excludes them (see /methodology). Each row carries excludedFromIndex, true when the index drops it, and Kalshi KXHORMUZWEEKLY rows carry ladderComplete: false because only the top three rungs by volume are stored. liquidityUsd is null where a venue does not report it (Kalshi). Kalshi prices are the last trade, held inside the current bid and ask, when the rung traded in the last 24 hours, and otherwise the midpoint of a two-sided quote (priceSource: trade or mid); bid, ask and volume24h let you judge how thin a rung is, and are null on the other venues along with priceSource. 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,
"priceSource": null, "bid": null, "ask": null, "volume24h": null,
"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); checked every 20 minutes from 11:07 to 18:47 UTC and at 00, 03 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: the newest days only; /data/transits.csv has the full series from 2025-02-28)
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. count (also sent as pointCount) is the number of points in the series, not a vessel count; latestAt is when the underlying feed was last refreshed, while asOf is the start of the newest hour.
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. count (also sent as pointCount) is the number of points in the series, not a vessel count.
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.
Vessel manifest (counts)
Computed on a 30-minute AIS window; can lag up to 20 minutes (15-minute server memo plus 5-minute edge cache)
Free summary: how many vessels are on live AIS right now in the Persian Gulf window, broken down by corridor and ship type. Only the Gulf is measured: region=cape returns null counts with a note, and any other region value returns 400. 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 is accepted but not measured)
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 (ranked by the share of their crude imports that crosses the strait), 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 is when straits.live first saw a new circular, and circularDate is the date the committee published it.
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 where a carrier notice states one (indicative editorial reading, null otherwise; surchargeUnit says whether it is per container or 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": null, "surchargeUnit": null, "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, plus utilizationSource and utilizationAsOf, which say whose rate that is and the day the outlet reported it (null where no rate is stated).
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. oil.marketTime: the trade time the upstream reported for the Brent quote; oil.updatedAt is when we last checked.
"While you were away" deltas
Recomputed at most every 60s; cached at the edge for up to 60s
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 advisory dated after the anchor, |transit delta| ≥ 30 hulls, or |stranded delta| (the offshore-holding count) ≥ 30 hulls (smaller AIS deltas are returned as null). Events cover only rows still held in the rolling window of up to three days, so for an older anchor the count is partial; eventsFloor is true when the anchor is over 72 hours old and marks the count as a minimum. An anchor under 6 hours old or over 90 days old returns material: false with no deltas.
Queryat (required ISO timestamp)
Inventories & reserves
The slow-moving counter-pressure to a fast-moving disruption.
US Strategic Petroleum Reserve
Re-fetched daily at 11:00 and 15:00 ET; EIA publishes weekly
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. ais_dark_tankers is a floor on tankers we stopped receiving, not a count of evasions. ais_dark_vessels_tracked is a cumulative all-time, all-type total, not the population behind it, so do not divide one by the other. ais_dark_eligible_tankers (the screened tankers), ais_dark_ambient_rate (the share of eligible non-tankers that went dark on the same test), ais_dark_expected and ais_dark_significant (appended 16 October 2026) give the denominator and the control. insurance_multiple is a hand-authored quote: insurance_authored_at and insurance_figures_stale (appended 16 October 2026) date it, and it goes empty once stale (after 14 days). ships_stranded is the half-hourly rollup while ships_anchored and ships_stopped come from live positions, so anchored plus stopped need not equal stranded. 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 10-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.
API pass.
A key that lifts the free limits to 600 requests a minute and 100,000 a day, on the JSON routes (/status, /api/index and /api/v1/*). The CSV files and RSS feeds stay at 60 a minute with no daily cap, and a key does not raise them. It costs $29 a month by card, and you can cancel any time by email.
Send the key
Put it in an Authorization: Bearer header or an x-api-key header. A key in the query string is ignored, because URLs end up in logs.
curl -H "Authorization: Bearer stl_your_key" https://straits.live/statusGet a pass
You pay on Stripe’s hosted checkout, then land on a page that shows your key. Reload that page any time to see it again. To cancel, email hello@straits.live.
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; on the JSON routes (/status, /api/index and /api/v1/*) the limits are 60 requests a minute and 1,000 a day per IP (the day resets at 00:00 UTC); the CSV files and RSS feeds take 60 a minute per IP with no daily cap. 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.
Running costs: about $83 a month. No ad networks; readers are the only funding