Strait of Hormuz Monitor

Offline

FAQ

How the Hormuz Monitor works, where its data comes from, and where it falls short. Items start collapsed — click a question to expand, or use search.

Data sources

How accurate is the vessel tracking?
Vessel positions come from AIS (the collision-avoidance system commercial vessels broadcast every few seconds). Terrestrial receivers have a practical range of roughly 30–50 nautical miles; anything in the middle of the strait falls outside that range and is covered by a satellite AIS feed (Data Docked) that polls every 2 hours during normal conditions, every 4 hours during crisis alerts. Coast positions are near real-time; mid-strait positions can be up to two hours behind.
Which ships are missing from the dashboard?
AIS is legally required only for commercial vessels over ~300 gross tonnes on international voyages, plus passenger ships. This dashboard therefore misses:
  • Military vessels. Navy, coast guard, and most government vessels routinely operate with AIS off under a security exemption.
  • Small craft. Dhows, fishing boats, and pleasure craft below the tonnage threshold generally aren't equipped with Class-A AIS.
  • Dark vessels. Transponders can be turned off, especially on sanction-evasion routes around Iran.
  • Jammed areas. AIS signals can be deliberately jammed or spoofed during military exercises or active conflict.
Read the counts as commercial AIS-visible traffic, not a complete census. The banner carries a caveat to this effect.
Where do oil prices come from?
Two sources, both plotted on the Oil Prices page. EIA (U.S. Energy Information Administration) is authoritative for daily settlement prices, stored under the _EIA suffix. Yahoo Finance provides minute-level intraday data via the same tickers; those drive the live ticker and the sparkline on the dashboard. The two usually agree to within a few cents at settlement.
How is news sourced and categorized?
RSS feeds from Google News, BBC, Al Jazeera, NYT, Reuters, and CNBC, plus NewsAPI keyword queries. Articles pass through a keyword relevance gate (must mention Hormuz, Iran, Tehran, Khamenei, IRGC, Persian Gulf, tanker, OPEC, sanctions, Fifth Fleet, CENTCOM, Houthi, Red Sea, or Bab el-Mandeb) — off-topic articles aren't stored. Categories: military / diplomatic / economic / general. Donald Trump's Truth Social posts are pulled separately and tagged as statements. Timestamps reflect source publish dates, not sync time.
How far back does position history go?
Vessel positions are stored with a 90-day TTL, so the time-range filter on the vessels page can show up to ~3 months back — but only for data we've collected since the dashboard went live. Older positions simply don't appear. We can backfill deeper history for a specific vessel via Data Docked's historical endpoint (up to 2 years). That costs credits per-vessel, so we don't auto-backfill the fleet.
How often does data refresh?
  • AIS positions (terrestrial): continuous stream
  • AIS positions (satellite): every 2–4 h
  • Oil prices (Yahoo): every minute
  • Oil prices (EIA): every 15 min
  • SPR reserves (EIA): daily (the source publishes weekly)
  • News + statements: every 30 min
  • Dashboard roll-ups: every 30 min
  • Strait-status snapshot: every 2 min
  • nginx cache (hormuz_live zone): 30 s with stale-while-revalidate
The header shows the "As of" timestamp of the page's newest datapoint so you can see freshness at a glance — green under 2 h, amber 2–6 h, deep amber > 6 h.
Why isn't pipeline utilization real-time?
Pipeline operators don't publish live utilization. The three bypass pipelines tracked (Saudi East–West, UAE ADCOP, Iraq–Turkey Kirkuk–Ceyhan) are initialized from seed data and updated manually when EIA or operator statements confirm a change. The historical series is a modeled approximation of crisis-period utilization based on published announcements, not a live measurement.

Caveats & trust

How seriously should I take AIS spoofing and dark ships?
Very seriously when your use case depends on precise counts. AIS is an unauthenticated broadcast — any transmitter can send any MMSI, name, or position. Known deception patterns on Iran-adjacent routes:
  • Identity spoofing. A vessel broadcasts the MMSI of a decommissioned ship. Iranian "ghost fleet" tankers have been seen using identities of vessels scrapped years earlier.
  • Position falsification. A tanker "broadcasts" laps off Africa while it's physically loading at Kharg Island.
  • Dark-period stitching. AIS goes off in one location, the vessel moves, AIS comes back on with a position that looks continuous.
  • Name/flag churn. The same hull appears under multiple identities within weeks.
This dashboard does NOT detect spoofing — it shows what vessels broadcast. Treat anomalies (duplicate MMSIs, impossible speeds, teleports) as suspect. For forensic work, corroborate with Sentinel/Planet imagery or analytics providers (Windward, Kpler, Lloyd's List).

How we compute it

What counts as a "crossing"?
A vessel counts as having crossed the strait only if its chained zone sequence has endpoints in opposite gulfs: Persian Gulf → … → Gulf of Oman (exit) or Gulf of Oman → … → Persian Gulf (entry). A vessel that dipped into the narrows from one side and returned to the same side is nota crossing. A vessel currently still in the narrows mid-transit isn't a completed crossing either. See Methodology for the full rule set.
What does "waiting to exit / enter" mean?
A vessel is classified as "waiting to exit" when its most-recent position puts it in the Persian Gulf (west of the narrows) and it hasn't transited eastward within the scan window. "Waiting to enter" is the mirror for Gulf of Oman anchorages (Fujairah, Khor Fakkan, Sohar). We also consult carrier statements (Maersk, MSC, CMA CGM, etc.) and take the max of the AIS-observed count and the carrier-reported trapped count to avoid under-counting when ships are in port without broadcasting.
Is the strait "open" or "closed" computed or announced?
Computed. We compare observed transits in the last 24 h to the UNCTAD/EIA baseline of ~60 large-vessel transits per day and produce a tier: OPEN ≥ 75%, RESTRICTED 25–75%, SEVERELY RESTRICTED < 25%, CLOSED when zero transits or crisis-oil and < 5%. This runs on raw AIS observations — independent of political announcements. When AIS ingestion is stale (>6h), the detail string acknowledges it rather than falsely reporting CLOSED.
How accurate are the average wait times?
They are a lower bound. The computation is (now − earliest observation in current zone within the position-scan window), which clips any vessel that was in the zone before our window opened. During a multi-week closure this under-reports by a large multiple. The Wait Times page also offers a per-vessel table sorted by longest wait descending, and a per-vessel "arrival" backfill for higher fidelity — see Methodology.
How is "restricted for X days" computed?
It's pinned to a known public disruption-start date (configured insettings.crisis_started_at_iso), not inferred from our own telemetry — our metrics only started after the crisis was already underway, so a derived value would undercount the duration significantly. The pinned date is updated manually as public reporting moves (definitive reopening announcement, new disruption episode, etc.).
How does the Ghost Ships page work?
A vessel is flagged as a "ghost" when its AIS broadcast went silent long enough that it must have moved. We bucket events three ways:
  • Crossed while dark — last seen on one side of the strait, reappeared on the opposite side. Canonical sanctions-evasion signal.
  • Still dark— silent LONGER than the overall feed's age (so if our AIS is 40h behind, a vessel must be silent > 48h to qualify — this prevents every vessel looking dark when the feed itself is lagging).
  • Resurfaced same side — long silence, came back on the same side. Weaker signal.
Detector runs on the rolling 14-day position window. See methodology.
Why do port counts "carry forward" during outages?
The hourly port-activity rollup used to write zero for every port when the AIS feed was unavailable, creating fake "drop" artifacts in the port timeseries. The current rollup detects a fully-empty feed and carries forward the most recent good row per port instead of writing zeros. Rows carried forward are marked withcarried_forward: true so the UI can style them differently.
How is the "queue size over time" estimated before telemetry?
Our telemetry only came online on 2026-04-14. For the period between the crisis start and our first observation, we estimate queue size as (a) a steady-state pre-crisis baseline that varies by side and ship type, (b) a 48-hour ramp as the crisis traps in-transit ships, (c) a flat plateau at the first observed value until real data takes over. Every estimated hour is flagged and labeled "estimated (pre-telemetry)" on hover.

Using the app

Can I export the data?
Yes — most pages have an Export button that downloads the currently-visible data as CSV. For programmatic access, the underlying REST API is documented at /api-docs and requires an API key. All read endpoints are public; write endpoints require admin credentials.
Is any of this financial advice?
No. This dashboard is for situational awareness and research. Don't trade on it.