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 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.
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"
}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"
}Returns list of briefs, newest first.
Query params: limit (default 20, max 100), offset, type=hourly|daily|all
Returns global supply disruption by commodity and country.
Returns all active facility damage records.
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
LADEN / BALLAST CLASSIFICATION
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
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.