API Reference

The RegimeRadar API lets you integrate live regime data into your own systems — trading bots, risk dashboards, algo strategies, or anything else. All endpoints return JSON. Authentication uses Bearer tokens.

Base URL https://api.rradar.io

Introduction

All requests must be made over HTTPS. The API is versioned — current version is v1 for radar endpoints. Auth and billing endpoints have no version prefix.

ℹ️
API access requires Pro + API plan The /v1/radar and /v1/radar_batch endpoints are available on the Pro + API plan ($20/mo). Auth and watchlist endpoints are available on all plans including Free.

Authentication

All protected endpoints require a Bearer token in the Authorization header. Get your token by calling POST /auth/login.

HTTP Header
Authorization: Bearer <your_token>
Python
import requests

headers = {"Authorization": f"Bearer {token}"}
resp = requests.get("https://api.rradar.io/v1/radar",
                    params={"symbol": "BTCUSD"},
                    headers=headers)
data = resp.json()
⚠️
Keep your token secret Tokens do not expire automatically. Never expose them in client-side code or public repositories. If compromised, log in again to get a fresh token.

Errors

All errors return a JSON body with a detail field.

HTTP StatusError codeMeaning
400BAD_REQUESTInvalid parameters or malformed request body
400EMAIL_ALREADY_REGISTEREDRegistration attempted with existing email
401BAD_CREDENTIALSWrong email or password
401NOT_AUTHENTICATEDMissing or invalid Bearer token
403PLAN_LIMITWatchlist or request exceeds plan limits
403TRIAL_EXPIRED14-day trial has ended, upgrade required
429RATE_LIMITEDToo many requests — slow down
503BILLING_NOT_CONFIGUREDStripe not set up (dev/staging only)

Rate Limits

PlanRadar endpointsOther endpoints
Free / ProDashboard only (no direct API)60 req/min
Pro + API120 req/min120 req/min

Rate limit headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Plans & Access

Planmax_symbolsAPI accessTrial
free3Dashboard only
trial10Dashboard only14 days full access
proUnlimitedDashboard only
pro_plusUnlimited✓ Full API
POST /auth/register

Register

🌐 Public

Create a new account. All new users start with a 14-day trial with full Pro access. Returns an access token immediately — no email verification step required to start.

Request body
FieldTypeRequiredDescription
emailstringrequiredValid email address. Used for login.
passwordstringrequiredMin 8, max 128 characters.
Request
POST /auth/register
Content-Type: application/json

{
  "email": "trader@example.com",
  "password": "your_password"
}
Response 200
JSON
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "user": {
    "id": "usr_abc123",
    "email": "trader@example.com",
    "plan": "trial",
    "max_symbols": 10,
    "trial_days_remaining": 14,
    "can_access": true
  }
}
POST /auth/login

Login

🌐 Public

Authenticate and get an access token. Use this token as a Bearer token in all subsequent requests.

Request
POST /auth/login
Content-Type: application/json

{
  "email": "trader@example.com",
  "password": "your_password"
}
Response 200
JSON
{
  "access_token": "eyJhbGci...",
  "user": { /* same as register response */ }
}
GET /auth/me

Get current user

🔒 Bearer token required

Returns the current authenticated user's profile including plan, trial status, and limits.

Response 200
JSON
{
  "id": "usr_abc123",
  "email": "trader@example.com",
  "plan": "pro_plus",
  "max_symbols": 999,
  "is_trial": false,
  "trial_days_remaining": 0,
  "is_trial_expired": false,
  "has_active_subscription": true,
  "can_access": true
}
GET /v1/watchlist

Get watchlist

🔒 Bearer token required
All plans

Returns the user's current watchlist with all symbols and plan information.

Response 200
JSON
{
  "name": "Main",
  "symbols": ["BTCUSD", "ETHUSD", "EURUSD"],
  "plan": {
    "name": "pro_plus",
    "max_symbols": 999,
    "trial_days_remaining": 0
  }
}
POST /v1/watchlist/items

Add symbol

🔒 Bearer token required
All plans

Add a symbol to the watchlist. Returns 403 if plan limit is reached.

FieldTypeRequiredDescription
symbolstringrequiredSymbol to add. A-Z, 0-9, dots, slashes. Max 32 chars. Example: BTCUSD, EURUSD, AAPL
Request
POST /v1/watchlist/items
Authorization: Bearer <token>
Content-Type: application/json

{"symbol": "SOLUSD"}
Response 200
JSON
{"ok": true, "symbol": "SOLUSD"}
Response 403 — plan limit
JSON
{
  "detail": {
    "error": "PLAN_LIMIT",
    "max_symbols": 3,
    "current": 3,
    "upgrade_url": "/billing/checkout"
  }
}
DELETE /v1/watchlist/items/{symbol}

Remove symbol

🔒 Bearer token required
All plans

Remove a symbol from the watchlist.

Request
DELETE /v1/watchlist/items/SOLUSD
Authorization: Bearer <token>
Response 200
JSON
{"ok": true, "symbol": "SOLUSD"}
GET /v1/radar

Single symbol analysis

🔒 Bearer token required
Pro + API

Returns the full regime analysis for a single symbol — the same data that powers the dashboard card. Includes regime state, volatility surface, tail risk, HMM forecast, and more.

Query parameters
ParameterTypeDefaultDescription
symbolstringrequiredSymbol to analyze. Examples: BTCUSD, EURUSD, AAPL
base_tfstringM1Timeframe for underlying bars. M1, M5, H1. For crypto, H1 is recommended.
allow_staleint0Set to 1 to return last known data if live feed is unavailable.
include_cryptoint0Set to 1 to include funding rate, OI, basis, and order book data (crypto symbols only).
Python
resp = requests.get(
    "https://api.rradar.io/v1/radar",
    params={
        "symbol": "BTCUSD",
        "base_tf": "H1",
        "include_crypto": 1,
    },
    headers={"Authorization": f"Bearer {token}"}
)
data = resp.json()

regime  = data["regime"]["label"]         # "RANGE"
sigma   = data["volatility"]["sigma_24h"]   # 0.0357
p_down  = data["tail_risk"]["p_down"]        # 0.168
attn    = data["attention"]["score"]         # 37
Response 200 — key fields
JSON (abbreviated)
{
  "symbol": "BTCUSD",
  "asof": "2025-02-27T15:30:00Z",
  "data_quality": "HIGH",

  "regime": {
    "label": "RANGE",
    "confidence": 0.92,
    "uncertainty": "LOW"
  },

  "attention": {
    "score": 37,
    "label": "MODERATE",
    "reasons": ["Regime shift detected", "High probability of regime change"]
  },

  "volatility": {
    "sigma_24h": 0.0357,
    "sigma_1h": 0.004,
    "sigma_7d": 0.0677,
    "vs_avg": 1.2,
    "term_structure": "NORMAL"
  },

  "tail_risk": [
    {
      "horizon": "24h",
      "threshold": 0.03,
      "p_down": 0.168,
      "p_up": 0.083
    }
  ],

  "hmm": {
    "current_state": "HIGH_VOL",
    "confidence": 0.46,
    "forecasts": [
      {"horizon": "1h",  "p_regime_change": 0.451},
      {"horizon": "4h",  "p_regime_change": 0.606},
      {"horizon": "24h", "p_regime_change": 0.615}
    ]
  },

  "levels": {
    "vwap_24h": 67401,
    "poc": 68529,
    "range_position": 0.26,
    "zone": "LVN",
    "liquidity_score": 94.1
  },

  "risk_score": 5,

  // crypto only (include_crypto=1)
  "crypto": {
    "funding_rate": -0.0001,
    "funding_z": -0.72,
    "oi_change_24h": -0.0232,
    "basis": -0.000367,
    "order_imbalance_top10": 0.913
  }
}
GET /v1/radar_batch

Batch analysis

🔒 Bearer token required
Pro + API

Returns analysis for multiple symbols in a single request. Processes symbols in parallel. If symbols is omitted, uses the user's watchlist. Also returns a risk map with cross-asset correlation data.

Query parameters
ParameterTypeDefaultDescription
symbolsstringoptionalComma-separated list of symbols. If omitted, uses your watchlist. Example: BTCUSD,ETHUSD,EURUSD
base_tfstringM1Timeframe for all symbols.
allow_staleint0Allow stale data if live feed unavailable.
cache_ttl_secfloat3.0Cache TTL in seconds. Range: 0–30.
risk_map_window_hoursfloat24.0Lookback for cross-asset correlation. Range: 1–168 hours.
include_cryptoint0Include crypto microstructure data for crypto symbols.
Python
resp = requests.get(
    "https://api.rradar.io/v1/radar_batch",
    params={
        "symbols": "BTCUSD,ETHUSD,SOLUSD",
        "base_tf": "H1",
        "include_crypto": 1,
    },
    headers={"Authorization": f"Bearer {token}"}
)
data = resp.json()

for sym, result in data["results"].items():
    if "error" not in result:
        regime = result["regime"]["label"]
        attn   = result["attention"]["score"]
        print(f"{sym}: {regime} | attention={attn}")
Response 200 — structure
JSON
{
  "meta": {
    "asof": "2025-02-27T15:30:00Z",
    "base_tf": "H1",
    "count_requested": 3,
    "count_ok": 3,
    "count_error": 0,
    "plan": "pro_plus",
    "max_symbols": 999,
    "trial_days_remaining": 0
  },
  "errors": [],
  "results": {
    "BTCUSD": { /* full radar response per symbol */ },
    "ETHUSD": { /* ... */ },
    "SOLUSD": { /* ... */ }
  },
  "risk_map": {
    "ok": true,
    "corr": {
      "BTCUSD": {"ETHUSD": 0.87, "SOLUSD": 0.79}
    },
    "clusters": [["BTCUSD", "ETHUSD", "SOLUSD"]],
    "per_asset": {
      "BTCUSD": {"avg_corr": 0.83, "concentration_risk": "HIGH"}
    }
  }
}
💡
Use risk_map for portfolio context The risk_map shows correlations between your symbols. High correlation = concentrated risk. If all your symbols cluster together, a regime shift in one likely affects all.
POST /billing/checkout

Create checkout session

🔒 Bearer token required

Creates a Stripe Checkout session. Redirect the user to the returned checkout_url to complete payment.

FieldTypeRequiredDescription
planstringrequired"pro" or "pro_plus"
JSON
{
  "checkout_url": "https://checkout.stripe.com/pay/cs_live_...",
  "session_id": "cs_live_..."
}
GET /billing/status

Billing status

🔒 Bearer token required

Returns the current subscription state for the authenticated user.

JSON
{
  "plan": "pro_plus",
  "max_symbols": 999,
  "is_trial": false,
  "trial_days_remaining": 0,
  "is_trial_expired": false,
  "has_active_subscription": true,
  "can_access": true
}
POST /billing/webhook

Stripe webhook

🌐 Stripe only

Receives Stripe webhook events. Do not call this endpoint directly — it is for Stripe's servers only. Verifies the stripe-signature header.

Full response schema

Every field returned by /v1/radar for a single symbol.

Field pathTypeDescription
symbolstringSymbol name
asofstringISO 8601 timestamp of the analysis
data_qualitystringHIGH / MEDIUM / LOW
regime.labelstringTREND / RANGE / TRANSITION / HIGH_VOL / UNKNOWN
regime.confidencefloat0–1 model confidence
regime.uncertaintystringLOW / MEDIUM / HIGH
attention.scoreint0–100
attention.labelstringLOW / MODERATE / ELEVATED / HIGH
attention.reasonsstring[]Top reasons driving the score
volatility.sigma_1hfloat1-hour volatility estimate
volatility.sigma_24hfloat24-hour volatility estimate (1 std dev)
volatility.sigma_7dfloat7-day volatility estimate
volatility.term_structurestringNORMAL / INVERTED / FLAT
tail_risk[].horizonstringe.g. "24h"
tail_risk[].thresholdfloatMove threshold, e.g. 0.03 = 3%
tail_risk[].p_downfloatProbability of −threshold move
tail_risk[].p_upfloatProbability of +threshold move
hmm.current_statestringLOW_VOL / MEDIUM_VOL / HIGH_VOL
hmm.confidencefloat0–1
hmm.forecasts[].p_regime_changefloatProbability of state change at horizon
levels.vwap_24hfloat24h VWAP price
levels.pocfloatPoint of Control price
levels.zonestringHVN / LVN / MID
levels.liquidity_scorefloat0–100
risk_scoreint1–10 composite risk score
crypto.*objectOnly present for crypto symbols when include_crypto=1

Supported symbols

Any symbol available through your connected data sources can be requested. Common examples:

CategoryExamplesNotes
CryptoBTCUSD, ETHUSD, SOLUSD, XRPUSDSupports include_crypto=1 for microstructure data
ForexEURUSD, GBPUSD, USDJPY, AUDUSDTail row hidden for low-volatility pairs
StocksAAPL, NVDA, AMD, MSFTData available during market hours; STALE outside
CommoditiesXAUUSD, XAGUSD, USOILTreated as forex-class instruments