← DASHBOARD

GOR SYSTEM — PUBLIC API

Real-time geopolitical oil risk data via REST and WebSocket.

Base URL: https://gorindex.site

No authentication required. No rate limits currently enforced.

WEBSOCKET — LIVE FEED

wss://gorindex.site/ws/live-feed

Connect to receive real-time push events. No polling needed.

Keepalive: send "ping" as plain text — server replies "pong".

EVENT TYPES

brief_ready
New intelligence brief generated
index_update
GOR index recomputed (every 5 min)
alert
New risk alert triggered
regime_change
Regime threshold crossed

BRIEF_READY PAYLOAD

{
  "type": "brief_ready",
  "payload": {
    "brief_title": "Trump's Hormuz Ultimatum Reaches Critical Phase",
    "gor_index": 6.80,
    "regime": "C_ELEVATED"
  }
}

After receiving brief_ready, fetch full content from: GET /api/v1/briefs/latest

JAVASCRIPT EXAMPLE

const ws = new WebSocket('wss://gorindex.site/ws/live-feed')

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data)

  if (msg.type === 'brief_ready') {
    console.log('New brief:', msg.payload.brief_title)
    // Fetch full content:
    fetch('https://gorindex.site/api/v1/briefs/latest')
      .then(r => r.json())
      .then(brief => console.log(brief.brief_body))
  }
}

// Keepalive every 30s
setInterval(() => ws.send('ping'), 30000)

PYTHON EXAMPLE

import asyncio, json
import websockets

async def listen():
    async with websockets.connect('wss://gorindex.site/ws/live-feed') as ws:
        async def keepalive():
            while True:
                await asyncio.sleep(30)
                await ws.send('ping')
        asyncio.create_task(keepalive())

        while True:
            msg = json.loads(await ws.recv())
            if msg['type'] == 'brief_ready':
                print(f"New brief: {msg['payload']['brief_title']}")
                print(f"GOR: {msg['payload']['gor_index']}")

asyncio.run(listen())

REST API

All responses are JSON. All timestamps are ISO 8601 UTC.

GET/api/v1/gor/current

Returns the current GOR index, regime, and all sub-index scores.

// GET /api/v1/gor/current
{
  "gor_index": 6.80,
  "regime": "C_ELEVATED",
  "nlp_score": 4.95,
  "maritime_score": 8.00,
  "market_score": 6.09,
  "satellite_score": 9.00,
  "momentum_score": 0.92,
  "infrastructure_score": 10.00,
  "computed_at": "2026-03-23T11:37:52Z"
}
GET/api/v1/briefs/latest

Returns the most recent non-skipped hourly brief.

Query params: type=hourly|daily (default: hourly)

// GET /api/v1/briefs/latest
{
  "brief_title": "Trump's Hormuz Ultimatum Reaches Critical Phase",
  "brief_body": "...",
  "gor_index": 6.80,
  "regime": "C_ELEVATED",
  "generated_at": "2026-03-23T11:00:00Z",
  "type": "hourly"
}
GET/api/v1/briefs

Returns list of briefs, newest first.

Query params: limit (default 20, max 100), offset, type=hourly|daily|all

GET/api/v1/disruption/summary

Returns global supply disruption by commodity and country.

GET/api/v1/damage/active

Returns all active facility damage records.

GET/api/v1/correlations/latest

Returns GOR-to-asset price correlations across 4 time windows.

Available once correlation matrix build is deployed

MARITIME DATA — METHODOLOGY

Hormuz VLCC tracking uses aisstream.io WebSocket streaming in the Strait of Hormuz bounding box (lat 25–27, lon 56–58).

VESSEL CLASSIFICATION

Ship type
IMO AIS codes 80–89 (crude and product tankers)
Size filter
Vessel length ≥ 280 metres (VLCC / large Suezmax)
24-hour count
Each unique MMSI tracked via Redis with 24h TTL

LADEN / BALLAST CLASSIFICATION

Source
AIS Type 5 (ShipStaticData) — MaximumStaticDraught field
Threshold
16.0 metres (loaded VLCC: ~20m draught · ballast: ~10m)
Barrel estimate
laden_count × 2,000,000 bbl (average VLCC cargo capacity)

LIMITATIONS

  • Vessels with AIS transponders disabled (shadow fleet) are not counted.
  • Draught data may be unavailable or stale for some vessels.
  • Coverage is Hormuz transit zone only — not the global VLCC fleet.
  • Currently uses ship type + length filter. A curated VLCC MMSI fleet list (~800 vessels) is planned as a future upgrade for exact coverage.

REGIME THRESHOLDS

A_NOISE
0.0 – 3.0
Baseline geopolitical noise
B_TENSION
3.1 – 5.5
Elevated tensions, monitoring required
C_ELEVATED
5.6 – 7.0
Active disruption risk
D_CRISIS
7.1 – 8.5
Supply crisis conditions
E_SUPPLY_SHOCK
8.6 – 10.0
Systemic supply shock

Questions or integration support? This API is provided as-is during the current conflict period. Endpoints and payload schemas may change — check this page for updates.