API Documentation

Programmatic access to 307 sensors, regime intelligence, and stress index. REST API, JSON responses.

Quick Start

Get the EHIQ Stress Index (0-100) in one call. No auth required.

curl
bash
curl https://eventhorizoniq.com/api/stress-index
Python
python
import requests

r = requests.get("https://eventhorizoniq.com/api/stress-index")
data = r.json()

print(f"Stress Index: {data['stress_index']}/100")
print(f"Regime: {data['regime']}")
print(f"Breakdown: {data['breakdown']}")
JavaScript
javascript
const res = await fetch("https://eventhorizoniq.com/api/stress-index");
const data = await res.json();

console.log(`Stress: ${data.stress_index}/100 — ${data.regime}`);
json
// Response
{
  "stress_index": 22.4,
  "regime": "NEUTRAL",
  "sensor_count": 55,
  "breakdown": { "severe": 0, "elevated": 2, "rising": 8, "neutral": 12, "stable": 33 },
  "as_of": "2026-03-16T15:30:00Z",
  "methodology": "Weighted average of all active sensor states..."
}

Base URL & Authentication

https://eventhorizoniq.com/api

Free endpoints require no auth. Paid endpoints accept an API key via header or query param:

Header (recommended)
bash
curl -H "x-ehiq-key: ehiq_your_key_here" \
  https://eventhorizoniq.com/api/sensors
Query param
bash
curl "https://eventhorizoniq.com/api/sensors?key=ehiq_your_key_here"
Free
No key. Free sensors. 60 req/min.
Pro ($249/mo)
All 307 sensors + TIQ-ML + Signal Drop. 600 req/min.
Institutional
Full data + ML features. 6,000 req/min.

The Public Record (CALLS_API_v1)

Every call EHIQ has published, machine-consumable, no auth. Frozen fields are named frozen — ehiq_prob_at_open is the stamp; there is no “latest implied” figure, by design. Lineage: TAPE_v0 → GATE_QUERY_v1 (level d) → this API. Recompute any of it at /audit.

GET/api/callsNEW

Every non-backtest call: frozen stamp, live market number, basis status, instrument + version, resolution criterion, verdict. no-store.

curl — the record
bash
curl -s https://eventhorizoniq.com/api/calls | jq '.count, .calls[0]'
Python — biggest live divergences
python
import requests

calls = requests.get("https://eventhorizoniq.com/api/calls").json()["calls"]
live = [c for c in calls if c["status"] == "active" and c["market_prob"] is not None]
for c in sorted(live, key=lambda c: -abs(c["ehiq_prob"] - c["market_prob"]))[:5]:
    print(f'{c["slug"]:50s} EHIQ {c["ehiq_prob"]:.2f} vs mkt {c["market_prob"]:.2f} [{c["basis_status"]}]')
GET/api/calls/[slug]NEW

One call, WITH the basis body (prob_basis — the re-derivable reasoning is meant to be read by strangers) and the resolution receipt when graded. 404s cleanly on an unknown slug.

curl — one call, with its basis
bash
curl -s https://eventhorizoniq.com/api/calls/ohio-governor-republican-2026 | jq '.call.prob_basis'
GET/api/gateNEW

The November gate counter, computed live by GATE_QUERY_v1 (frozen, level d). Strict + official readings, the six named caveat rows (asserted, never re-derived), voids, pace. Fails closed: 503 and no number on any query failure.

curl — the counter
bash
curl -s https://eventhorizoniq.com/api/gate | jq '.strict, .official, .gate'
GET/api/tapeNEW

The tape version pointer (outside the tape file — never trust a file that says it's current). Latest tape URL, row counts both ways, sha-256 of the served bytes.

curl — the pointer, then the tape
bash
curl -s https://eventhorizoniq.com/api/tape | jq '.latest.url, .latest.served_file_sha256'
curl -s https://eventhorizoniq.com/tape/TAPE_v0_2026-09-10.json | sha256sum

Endpoints

GET/api/stress-indexNEW

EHIQ Stress Index: real-time 0-100 composite score derived from all active sensor states. Public, free, no auth.

Python — Alert on high stress
python
import requests

data = requests.get("https://eventhorizoniq.com/api/stress-index").json()

if data["stress_index"] >= 50:
    print(f"⚠️ EHIQ Stress Index at {data['stress_index']} — {data['regime']}")
    print(f"  {data['breakdown']['severe']} SEVERE, {data['breakdown']['elevated']} ELEVATED")
GET/api/sensors

List all 307 sensors. Free users see free-tier only. API key holders see all.

Auth: Optional — expands results with key
Python — Get all elevated sensors
python
import requests

headers = {"x-ehiq-key": "ehiq_your_key_here"}
data = requests.get("https://eventhorizoniq.com/api/sensors", headers=headers).json()

elevated = [s for s in data["sensors"] if s["currentState"] in ("ELEVATED", "SEVERE")]
for s in elevated:
    print(f"{s['name']}: {s['currentState']} (confidence: {s['confidence']})")
curl
bash
curl -H "x-ehiq-key: ehiq_your_key_here" \
  https://eventhorizoniq.com/api/sensors | jq '.sensors[] | select(.currentState == "ELEVATED")'
json
// Response
{
  "sensors": [
    {
      "sensorId": "vix-regime",
      "name": "VIX Regime Detector",
      "category": "macro",
      "currentState": "ELEVATED",
      "confidence": "HIGH",
      "updatedAt": "2026-03-16T12:00:00Z",
      "sparkline": [{ "state": "ELEVATED", "value": 28.5, "recorded_at": "..." }]
    }
  ],
  "count": 307
}
GET/api/sensors/:id

Single sensor detail: state, methodology, source links, and configuration.

Auth: Required for paid sensors
curl
bash
curl https://eventhorizoniq.com/api/sensors/vix-regime
GET/api/sensors/:id/history

Historical readings with pagination. Free: 200 max. Pro: 1,000. Institutional: 10,000+.

Auth: Optional — higher limits with key
Python — Plot sensor history
python
import requests
import pandas as pd

url = "https://eventhorizoniq.com/api/sensors/vix-regime/history?limit=500"
headers = {"x-ehiq-key": "ehiq_your_key_here"}
data = requests.get(url, headers=headers).json()

df = pd.DataFrame(data["readings"])
df["recordedAt"] = pd.to_datetime(df["recordedAt"])
print(df[["recordedAt", "state", "value"]].head(20))
GET/api/equity-regimeNEW

Live regime states for 15 high-beta stocks. BTC regime propagated to equities. Free tier: 3 stocks (regime only). Paid: all 15 with RSI + extension data.

Auth: Optional — expands results with key
Python — Monitor equity regime
python
import requests

headers = {"x-ehiq-key": "ehiq_your_key_here"}
data = requests.get("https://eventhorizoniq.com/api/equity-regime", headers=headers).json()

for stock in data["stocks"]:
    emoji = "🔴" if stock["regime"] == "STRESS" else "🟡" if stock["regime"] == "ESCALATING" else "⚪"
    print(f"{emoji} {stock['ticker']:6s} {stock['regime']:12s} RSI={stock['rsi']:.1f}")
GET/api/tiq-ml

ML-enhanced earnings analysis. Combines TIPS v2 qualitative scoring with macro-context ML model.

Auth: Optional — expands fields with key
Python — Screen for high-conviction picks
python
import requests

headers = {"x-ehiq-key": "ehiq_your_key_here"}
data = requests.get("https://eventhorizoniq.com/api/tiq-ml", headers=headers).json()

bullish = [s for s in data["scores"]
           if s["combined_direction"] == "BULLISH"
           and s["ml_confidence"] == "HIGH"
           and not s["macro_headwind"]]

for s in bullish:
    print(f"{s['ticker']}: score={s['combined_score']}, prob={s['direction_prob']:.0%}")
GET/api/signal-drops

Inflection signals from earnings transcripts. Detects trough recovery and peak exhaustion.

Auth: Optional — expands fields with key
curl
bash
curl -H "x-ehiq-key: ehiq_your_key_here" \
  "https://eventhorizoniq.com/api/signal-drops?ticker=OPEN"
GET/api/proposals

Sensor proposals from the EHIQ agent system. See blind spots the system has identified.

curl
bash
curl https://eventhorizoniq.com/api/proposals

TIQ API v2 (Institutional)

Programmatic access to Tonality IQ: 173K+ earnings transcripts scored across 20 linguistic patterns, 4,800 tickers, ML-enhanced signals, and authorship analysis. Designed for hedge funds, compliance teams, and media.

Standard ($99/mo)
100 calls/day. Score + Ticker + Triad.
Professional ($499/mo)
1,000 calls/day. All endpoints + Compare.
Enterprise ($2,499/mo)
Unlimited + custom models + SLA.

Auth: x-ehiq-key header required on all v2/tiq endpoints. Rate limit headers returned: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.

POST/api/v2/tiq/scoreNEW

Score arbitrary text for tonality signals. Supports earnings calls, authorship fingerprinting, legal escalation, and central bank communication.

Auth: x-ehiq-key header (required)
curl
bash
curl -X POST https://eventhorizoniq.com/api/v2/tiq/score \
  -H "x-ehiq-key: ehiq_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"text": "We remain confident in our ability to deliver...", "mode": "earnings"}'
Python
python
import requests

headers = {"x-ehiq-key": "ehiq_your_key_here", "Content-Type": "application/json"}
body = {
    "text": open("earnings_transcript.txt").read(),
    "mode": "earnings"  # earnings | authorship | escalation | central_bank
}

r = requests.post("https://eventhorizoniq.com/api/v2/tiq/score", json=body, headers=headers)
data = r.json()

print(f"Risk: {data['risk_label']} ({data['risk_score']}/100)")
print(f"Constraint: {data['features']['constraint']}")
print(f"Conviction: {data['features']['conviction']}")
print(f"Ratio: {data['features']['ratio']}")
if data['anomaly_flags']:
    print(f"Flags: {', '.join(data['anomaly_flags'])}")
json
// Response
{
  "api": "tiq/score",
  "version": "v2",
  "mode": "earnings",
  "risk_score": 34.5,
  "risk_label": "MODERATE",
  "features": {
    "constraint": 12.4,
    "conviction": 18.7,
    "ratio": 1.51,
    "hedge": 4.2,
    "caution": 3.1,
    "commitment": 6.8,
    "blame": 1.2,
    "vague": 2.9,
    "defensive": 0.8,
    "growth": 5.4,
    "forward": 3.2,
    "word_count": 8450
  },
  "anomaly_flags": [],
  "summary": "earnings analysis: constraint=12.4, conviction=18.7, ratio=1.51. Risk: MODERATE (34.5/100)."
}
GET/api/v2/tiq/ticker/:tickerNEW

Full TIQ profile for a public company: latest scores, arc trajectory, Invincibility Triad status, ML scores, active signals, and full quarterly history.

Auth: x-ehiq-key header (required)
curl
bash
curl -H "x-ehiq-key: ehiq_your_key_here" \
  https://eventhorizoniq.com/api/v2/tiq/ticker/AAPL
Python
python
import requests

headers = {"x-ehiq-key": "ehiq_your_key_here"}
r = requests.get("https://eventhorizoniq.com/api/v2/tiq/ticker/OPEN", headers=headers)
data = r.json()

print(f"Signal: {data['signal']}")
print(f"Arc: {data['arc_direction']}")
print(f"Triad: {data['triad']['status']} ({data['triad']['score']}/3)")
print(f"Latest ratio: {data['latest']['ratio']}")
if data['ml']:
    print(f"ML direction: {data['ml']['direction']} ({data['ml']['confidence']})")
json
// Response (abbreviated)
{
  "api": "tiq/ticker",
  "ticker": "OPEN",
  "signal": "ANOMALY",
  "arc_direction": "ACCELERATING",
  "triad": { "status": "WATCH", "score": 2, "constraint_elevated": true, "conviction_depressed": true, "ratio_inverted": false },
  "latest": { "quarter": "Q4_FY2025", "constraint": 8.2, "conviction": 5.1, "ratio": 0.62, "anomaly_flags": ["BLAME_SPIKE"] },
  "ml": { "combined_score": 72.4, "direction": "BULLISH", "confidence": "HIGH" },
  "active_signals": [{ "signal_type": "TROUGH_TRINITY", "direction": "BULLISH", "severity": "HIGH" }],
  "history": [...]
}
GET/api/v2/tiq/triadNEW

Invincibility Triad watchlist: all tickers scoring 2/3 or 3/3 where management language signals elevated constraint, depressed conviction, and inverted ratio vs. their own history.

Auth: x-ehiq-key header (required)
Python
python
import requests

headers = {"x-ehiq-key": "ehiq_your_key_here"}
r = requests.get("https://eventhorizoniq.com/api/v2/tiq/triad", headers=headers)
data = r.json()

print(f"Scanned {data['total_tickers_scanned']} tickers")
print(f"Invincible (3/3): {data['invincible_count']}")
print(f"Watch (2/3): {data['watch_count']}")

for t in data['tickers']:
    print(f"  {t['ticker']:6s} {t['triad_status']:10s} ratio={t['ratio']:.2f} constraint_z={t['constraint_z']}")
POST/api/v2/tiq/compareNEW

Compare two texts for authorship similarity. Returns distance score, per-feature comparison, and probability of same author. Used for ghostwriter detection, regulatory filing consistency, and earnings call authenticity.

Auth: x-ehiq-key header (required)
Python
python
import requests

headers = {"x-ehiq-key": "ehiq_your_key_here", "Content-Type": "application/json"}
body = {
    "text_a": open("ceo_letter_2024.txt").read(),
    "text_b": open("ceo_letter_2025.txt").read()
}

r = requests.post("https://eventhorizoniq.com/api/v2/tiq/compare", json=body, headers=headers)
data = r.json()

print(f"Verdict: {data['verdict']}")
print(f"Distance: {data['distance']}")
print(f"Same author probability: {data['probability_same_author']:.0%}")
json
// Response
{
  "api": "tiq/compare",
  "verdict": "LIKELY_DIFFERENT",
  "distance": 42.3,
  "probability_same_author": 0.29,
  "text_a_words": 3200,
  "text_b_words": 2800,
  "feature_comparison": {
    "constraint": { "text_a": 8.4, "text_b": 14.2, "delta": 5.8 },
    "conviction": { "text_a": 12.1, "text_b": 6.3, "delta": 5.8 },
    "hedge": { "text_a": 3.2, "text_b": 7.8, "delta": 4.6 }
  }
}

Use Cases

Portfolio risk overlay

Poll /api/stress-index every 5 min. When score crosses 50, flag your portfolio for review. When it crosses 70, activate hedges.

Earnings alpha

After each earnings season, query /api/tiq-ml for HIGH-confidence BULLISH scores where macro_headwind is false. Screen for structural trough recovery plays.

Crypto regime monitoring

Subscribe to /api/sensors and track btc-regime-detector + funding-rate-stress + panic-capitulation together. When 3+ fire simultaneously, that's a capitulation signal.

Equity regime alerts

Poll /api/equity-regime daily. When a stock you hold moves from NEUTRAL to ESCALATING, the BTC-derived stress signal is propagating to your position.

Earnings tonality screening

After earnings, POST transcripts to /api/v2/tiq/score and screen for BLAME_SPIKE or CONSTRAINT_DOMINANCE flags. Cross-reference with /api/v2/tiq/triad for the Invincibility Triad watchlist.

Ghostwriter detection

Compare shareholder letters, SEC filings, or public statements using /api/v2/tiq/compare. Detect when a CEO's linguistic fingerprint shifts, suggesting a ghostwriter or strategic messaging change.

Update Frequency

Crypto Sensors
Every 10 minutes. Funding, fear/greed, TVL, stablecoins.
Macro Sensors
Daily or on data release. VIX, FRED, credit spreads.
Stress Index
Real-time (computed on request). Cached for 5 min.
Equity Regime
Every 5 minutes from VPS tracker. Cached for 5 min.

Rate Limits & Errors

Free: 60 req/min
Pro: 600 req/min
Institutional: 6,000 req/min
200Success
400Bad request — invalid parameters
401Unauthorized — invalid or expired API key
403Forbidden — paid sensor, free tier access
404Not found — sensor does not exist
429Rate limit exceeded — back off and retry
500Internal server error

OpenAPI Spec

Machine-readable spec available for code generation and integration testing:

bash
curl https://eventhorizoniq.com/api/openapi

Ready to integrate? Start with the free tier, upgrade when you need more.

API data is read-only intelligence. Sensor states are diagnostic observations, not predictions or trading recommendations. Use at your own risk.