Crypto Liquidation & Funding API
A professional-grade intelligence API that aggregates derivatives data, on-chain metrics, and whale wallet activity into a single confidence score for your trading bot.
https://api.smartmoneyapi.com/v1SMARTMONEY_API_KEY, sends it as X-API-Key, wraps the endpoints as methods. Read the source and see exactly what is sent.
GitHub · public · no key needed
smartmoneyapi-docs
A pinned, reviewable snapshot of the spec for the product surface — GET operations only — plus a written reference and worked examples. Check it out before you pay for anything.
Recipes
Cookbook
Copy-paste integrations: confirm before entry, gate a Freqtrade signal, size by multiplier, handle 402 and 429, wire it into a coding agent.
The live spec at api.smartmoneyapi.com/openapi.json is regenerated from the router and cannot fall behind the code without failing CI. The GitHub copy is a deliberate snapshot and can lag between updates — if the two disagree, the live document is the correct one.
Design principles
Four ideas shape every endpoint and every score this API returns. They are also the honest boundaries of what it does — and does not — promise.
Strategy-first, not signal-first. This is not a buy/sell signal feed. You bring the strategy and the entry; the API tells you whether the surrounding market structure — derivatives positioning, funding, open interest, liquidations, on-chain flow, and whale consensus — agrees with the trade you already want to take.
Confidence-scored, not binary prediction. Every answer carries a graded confidence (HIGH / MEDIUM / LOW) and a composite from -1.0 to +1.0. There are no guarantees and no oracle calls — you get a calibrated read on agreement, with the reasons behind it, so you can size proportionally to conviction.
Decision support, not execution advice. The API returns a CONFIRM / REDUCE / SKIP recommendation and a size multiplier for your logic to act on. It never places orders, and nothing here is financial advice. You remain responsible for risk, sizing, and execution.
Living metrics, not fixed guarantees. Win rates, regime statistics, and accuracy figures are computed from a rolling sample and move as markets move. We publish them honestly, including when they are mediocre. Treat every metric as a current observation, not a promise about the future.
Who this API is for
This API is built for crypto bot, algo, and AI-agent developers who already have a long/short signal — from a TA strategy, an ML model, a Freqtrade pipeline, a TradingView alert, or an LLM agent — and want a fast, pre-trade CONFIRM / REDUCE / SKIP decision before committing capital.
A typical loop: your strategy fires "go long BTC" → you call GET /v1/confirm?symbol=BTC&direction=long → you confirm, reduce, or skip the entry and scale size by size_mult. One call, single low-latency JSON response, no extra infrastructure.
It is not a standalone signal generator, a charting product, or an execution venue. If you have no signal of your own to gate, start with the performance page to see how the score has behaved before wiring it into a live bot.
Getting access
1 — Sign up. Create a free account at signup (email/password or Google). No credit card required for the free tier.
2 — Open your dashboard. Your dashboard shows your API key, current plan, and live usage against your daily quota.
3 — Copy your API key. Keys are prefixed sm_. Pass it as the X-API-Key header on every request (see Authentication). Upgrade any time on the pricing page to raise limits and unlock more symbols and endpoints.
Spec, SDK & Cookbook
Everything you need to integrate quickly, whether you write the code yourself or hand it to a coding agent.
| Resource | What it is |
|---|---|
| Cookbook | Copy-paste recipes for the most common integrations — confirm before entry, gate a Freqtrade signal, size by multiplier, handle 402/429, and wire it into a coding agent. |
| OpenAPI spec | Machine-readable OpenAPI 3.0.3 definition, generated from the gateway’s own router rather than hand-written, with x-auth and x-tier on every operation. It documents every endpoint an API user can call — the only omissions are inbound webhooks, admin routes and browser-session auth, each excluded by name with a stated reason. A routed path that is neither documented nor excluded fails CI, which is what keeps the document level with the code. Served live at api.smartmoneyapi.com/openapi.json — import into Postman/Insomnia, generate a client, or feed it to an LLM. A copy is also published on GitHub; see Public repositories for which one to trust. |
| Python client | Official Python client. Reads your key from SMARTMONEY_API_KEY, sends it as X-API-Key, and exposes the endpoints as methods. Source and install instructions in Public repositories. |
| /llms.txt | An LLM-friendly plain-text summary of the API. Point Claude, Codex, or Cursor at it (see Coding Agents). |
Public repositories
Two repositories are public on GitHub. Neither needs an account or a key to read. They exist so that you — or a coding agent working on your behalf — can point tooling at a machine-readable contract, generate a client in whatever language you actually write in, and see exactly what each endpoint returns before paying for a key.
| Repository | What it is |
|---|---|
| smartmoneyapi-docs | The OpenAPI document for the product surface — selected from the live spec by an executable rule: GET operations only, so a generated client cannot change anything in an account (the /rpc/v1/* JSON-RPC proxies are the one stated exception, because JSON-RPC is a POST protocol), excluding the namespaces that act on your own account — alerts, webhooks, referrals, portfolio, preferences, watchlist, usage and the like, each withheld by name with a reason — plus a written API reference and worked examples. Feed it to an OpenAPI generator, a Postman import, or an LLM. |
| smartmoneyapi-python | The official Python client: it reads your key from the environment, sets the X-API-Key header, and wraps the endpoints as methods, so a bot can call confirm() without hand-rolling HTTP. MIT-licensed, so you can read the source and see exactly what is sent and what comes back. |
Which copy is authoritative. The spec served at api.smartmoneyapi.com/openapi.json is regenerated from the router and is always current — it cannot fall behind the code without failing CI. The GitHub copy is a published snapshot: it is updated deliberately, so between updates it can lag. If the two ever disagree, the live document is the correct one. Build against the live URL when you can fetch it at build time, and use the repository when you want a pinned, reviewable file in version control.
Quickstart in 2 minutes
Step 0 — Call it right now, with no key. A large part of the API is public: derivatives, whales, on-chain, options, ETF flows, market indices and news all answer without authentication. Run one here before you decide whether any of this is worth a signup.
Or skip the hand-rolling. The OpenAPI spec generates a client in any language, and the official Python client and docs repository are public on GitHub — no account, no key needed to read either.
Step 1 — Base URL. Every endpoint lives under:
Step 2 — Get your API key. Sign up for free (no credit card required) and copy your key from the dashboard. Pass it as the X-API-Key header on every request.
Step 3 — Your first call. Paste this into your terminal and replace sm_your_key with the key from your dashboard:
Expected response:
"ts": 1710940821,
"symbol": "BTC",
"direction": "long",
"composite": 0.74,
"confidence": "HIGH",
"action": "CONFIRM",
"size_mult": 1.5,
"deriv_score": 0.81,
"onchain_score": 0.68,
"whale_score": 0.73,
"reasons": ["Funding rate positive across all venues", "Whales: 67% long consensus"]
}
When confidence is HIGH or MEDIUM and action is CONFIRM, scale your position size by size_mult. That is the entire integration loop. See Response Fields for the full field reference.
Authentication
Not every request needs a key. The public data endpoints — derivatives screener, whale crowding and events, on-chain metrics, options, ETF flows, market indices, DEX and news — answer anonymously. Keyless traffic is rate-limited per client IP and per route; the threshold is not published and may change without notice, so treat the 429 as the signal rather than planning against a number. Everything else (confirmation, exports, alerts, websockets, per-account state) requires an API key passed as the X-API-Key HTTP header. Which of the two paths you want, and what each one actually gets you, is set out in Keyless access vs a free key.
Your API key is available from the dashboard after signing up. Keep your key secret — do not expose it in client-side code or public repositories.
/v1/ws/ticket with the X-API-Key header, then connect with the returned ticket. See WebSocket authentication (tickets).Keyless access vs a free key
A large part of this API answers with no key at all. That path is real and supported, and it is documented here rather than left implicit — an undocumented free path is one nobody can plan against, and it is how “just scrape it anonymously” quietly became a reasonable-looking strategy.
What works with no key
The public market-data families: the derivatives screener, funding heatmap and OI rankings; options chain, PCR and GEX; ETF flows; market indices and dominance; on-chain metrics, TVL, stablecoins and gas; DEX screener; whale events, summary, crowding and consensus; the liquidation heatmap, symbol inventory, simulator and aftermath study; COT, seasonality, technicals, mood, rankings and the news feeds. Where a paid view of the same path exists, the keyless response is the truncated one — /v1/derivatives/screener returns the top 10 rows, not the full table.
What does not work with no key
/v1/confirm, the shadow-gate decision ledger, whale alerts, usage, exports, every WebSocket and every per-account endpoint return 401 without a key. There is no keyless route to any of them. That now includes the last stream that used to answer without one: /v1/stream/public-swaps requires a credential like everything else — see below. A free key is enough; there is no paid tier gate on it.
How keyless is limited
Keyless calls are throttled per client IP and per route, and the limit is enforced independently of any plan. The exact threshold is not published and is subject to change without notice. Build for the rejection, not for a number: back off on 429 on a schedule of your own. Keyless traffic is also not attributed to any account — it does not appear in /v1/usage, on a dashboard, or in anything support can look up on your behalf.
What a free key adds
| Keyless (no key) | Free key — $0, no card | |
|---|---|---|
| Public market data | Yes — anonymous view, truncated where a paid view exists | Yes |
| Named-symbol access on authenticated endpoints | Not available | BTC, ETH, SOL, XAU, XAG |
/v1/confirm | 401 | Yes — signal and confidence; evidence fields stripped |
/v1/shadow-gate/decisions, /v1/whale-alerts/*, /v1/usage | 401 | Yes |
| A daily quota you can read and plan against | None — per-IP throttle only, threshold unpublished | 200 calls/day, live in X-RateLimit-* |
| Per-minute allowance | Per IP, per route, unpublished, may change | 4/min — one budget for the whole key |
| Streaming | Swaps only, over SSE — metered and deprecated, thresholds unpublished | The multiplexed WebSocket: , on a small daily allowance you can read off your own ticket. Details |
| Usage attribution, dashboard, support history | None | Full |
Every figure in the Free column is read at page load from plans.json via plans.js, the same manifest the server enforces. If a cell renders blank, the manifest could not be read — that is a failure, not an offer.
What Trader adds over a free key
All tracked symbols instead of five; 3,000 calls/day at 30/min; the unstripped /v1/confirm evidence block (reasons, details, deriv_score, onchain_score, whale_score); and the Trader endpoint set — snapshot, whales and whale events, liquidations, smart-stop, funding-arb, the full derivatives screener beyond the public top 10, the DeFiLlama suite, exports, the research capture and the symbol-universe coverage views. See pricing for the full comparison.
On streaming, Trader is not “WebSocket instead of no WebSocket” — Free has a socket too. What Trader adds is more channels and a larger allowance; the exact figures are in Per-plan allowance, read from the manifest.
Google Sign-In (Firebase Auth)
Users can authenticate using their Google account via Firebase Authentication. After a successful Google sign-in on the client, exchange the Firebase ID token for a linked API session. The system automatically syncs your Google identity with the API key system.
Request Body
| Field | Type | Description |
|---|---|---|
| id_tokenrequired | string | Firebase ID token obtained after Google sign-in on the client |
This section previously carried a hand-written example response naming a synced field the endpoint does not return. It was removed rather than corrected, because the docs build cannot call this endpoint to capture a real one. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
Rate Limits
| Plan | Calls/Day | Burst Limit | Symbols | Data Delay |
|---|---|---|---|---|
| No key (anonymous) | Not published | Per-IP, per-route — not published | Public endpoints only | Real-time |
| Free | 200 | 4/min | BTC, ETH, SOL, XAU, XAG | Real-time |
| Trader | 3,000 | 30/min | All symbols | Real-time |
| Pro | 15,000 | 60/min | All symbols | Real-time |
| Enterprise | 250,000 | 500/min | All symbols | Real-time |
Every plan number above is read at page load from plans.json — the same manifest the gateway enforces — through the generated plans.js. The anonymous row is deliberately unquantified: keyless throttling exists to stop sustained scraping, and a published budget is a scraping target. It is limited, and the limit may change without notice.
Rate limit headers are included in every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. The daily cap resets at 00:00 UTC.
Base URL
All endpoints below are relative to this base URL. All responses are JSON with Content-Type: application/json.
Errors
Errors use standard HTTP status codes and a consistent JSON body. Always branch on the status code, not on response text. The three you will hit most often:
| Status | Code | Meaning & what to do |
|---|---|---|
| 401 | unauthorized | Missing or invalid API key. Check the X-API-Key header is present and correct. |
| 402 | payment_required | The endpoint or symbol needs a higher plan than your key has (e.g. a free key calling the WebSocket firehose). Upgrade or fall back to a public endpoint. |
| 429 | rate_limit_exceeded | Keyed call. Daily or burst limit reached. The body carries reason, daily_used/daily_limit, minute_used/minute_limit and retry_after, and a Retry-After header is set. Back off and retry after it; do not hammer. |
| 429 | rate_limited | Keyless call. The per-IP, per-route throttle on the public endpoints. Measured 2026-08-29: this shape carries no Retry-After header and no retry_after field, so back off on a fixed schedule of your own, or take a free key and read your quota off X-RateLimit-* instead of guessing. |
Every error returns the same shape:
"error": "rate_limit_exceeded",
"message": "Daily limit of 200 calls reached. Resets at 00:00 UTC.",
"status": 429
}
For the complete list of status codes (400 / 403 / 500 / 503 and more), see Error Codes. A robust integration treats 5xx and 429 as transient (retry with backoff) and 401/402/403 as terminal (fix the key or plan).
Security best practices
Send the key in the header, never the URL. Always pass X-API-Key as an HTTP header. Keys in query strings (?key=) get logged by proxies, load balancers, and browser history — the legacy ?key= auth is no longer accepted on WebSocket endpoints for exactly this reason.
Keep keys server-side. Never embed an API key in client-side JavaScript, a mobile app bundle, or a public repository. Load it from an environment variable or secret manager. If a key leaks, rotate it.
Rotate keys periodically. Regenerate your key from the dashboard on a schedule and immediately if you suspect exposure. The old key stops working the moment a new one is issued.
Use tickets for browser sockets. For real-time streams from the browser, exchange your key for a single-use ticket rather than connecting with the raw key — see WebSocket authentication (tickets).
Using with coding agents / LLMs
Building with Claude Code, Codex, Cursor, or any LLM coding agent? You can hand the agent everything it needs to wire up this API correctly in one shot. Two machine-readable references are published:
| Resource | URL |
|---|---|
| LLM summary | https://smartmoneyapi.com/llms.txt |
| OpenAPI spec | api.smartmoneyapi.com/openapi.json (live; a snapshot is also on GitHub) |
Point your agent at the /llms.txt file (the llms.txt convention) for a concise overview, then the OpenAPI spec for exact request/response shapes. A one-line prompt that works well:
Read https://smartmoneyapi.com/llms.txt and the OpenAPI spec at
https://api.smartmoneyapi.com/openapi.json, then add a pre-trade
check to my bot that calls GET /v1/confirm and skips entries
unless action is CONFIRM.
See the Cookbook for a worked coding-agent recipe.
Endpoints
GET /confirm
The core endpoint. Returns a composite confidence score and action recommendation for a given trade direction. Call this before entering any position.
Coverage, in plain terms. /confirm currently scores BTC, ETH and SOL — the symbols with enough resolved history to confirm honestly. The derivatives screener separately monitors — derivatives markets for funding, OI and liquidation data, and whale tracking covers — wallets. Pro unlocks the full screener, exports and broader market coverage; /confirm symbol support is expanded as each market accumulates a reliable track record.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symbolrequired | string | Asset symbol. One of: BTC, ETH, SOL (Trader+) |
| directionrequired | string | Trade direction: long or short |
| sourceoptional | string | Label for your signal source (logged for analytics). Max 32 chars. |
Example Request
"https://api.smartmoneyapi.com/v1/confirm?symbol=BTC&direction=long"
Example Response
"ts": 1710940821,
"symbol": "BTC",
"direction": "long",
"composite": 0.74,
"confidence": "HIGH",
"action": "CONFIRM_FULL",
"size_mult": 1.5,
"deriv_score": 0.81,
"onchain_score": 0.68,
"whale_score": 0.73,
"x_score": 0.0,
"factors": {
"derivatives": { "score": 0.81, "weight": 0.40, "weighted": 0.324 },
"onchain": { "score": 0.68, "weight": 0.35, "weighted": 0.238, "source": "coinmetrics", "available": true },
"whale": { "score": 0.73, "weight": 0.25, "staleness_factor": 1.0, "weighted": 0.183 }
},
"adjustments": { "agreement": 0.0, "trend": 0.0, "news_macro": 0.0 },
"weights": { "derivatives": 0.40, "onchain": 0.35, "whale_intel": 0.25 },
"coverage": { "derivatives": true, "whale": true, "onchain": true },
"reasons": [
"Funding rate positive across all venues",
"LSR favors longs: 1.42",
"Whales: 67% long consensus",
"MVRV above 1.0 — on-chain bullish"
]
}
Transparent by design. Every response carries a factors object showing each leg's score × weight = weighted contribution, an adjustments object for post-filter tweaks, the weights used, and a coverage map. The on-chain leg uses real free Coin Metrics data (MVRV / exchange-flow / active-address) when no Glassnode key is set. This is a multi-factor confluence score — decision support, not a guaranteed win-rate.
Untracked symbols are honest. A symbol outside the tracked derivatives/whale universe returns an explicit "confidence":"NO_DATA" / "action":"NO_DATA_SKIP" with "unsupported":true — never a fabricated LOW.
Delta Ingestion
If you are polling on a schedule, do not re-download data you already have. Two mechanisms cover the two kinds of endpoint, and both are available on every tier including free.
1. Cursors — for append-only feeds
Feeds return a max_id alongside the data. Pass it back as since_id on the next request and you receive only what has been recorded since. Ids are monotonic, so nothing is skipped or repeated.
| Endpoint | Cursor field |
|---|---|
GET /v1/whales/events | since_id → max_id |
GET /v1/signals/recent | since_id → max_id |
curl "https://api.smartmoneyapi.com/v1/whales/events?limit=50"
# Every call after that — only what is new
curl "https://api.smartmoneyapi.com/v1/whales/events?limit=50&since_id=83470268"
2. ETags — for snapshots
Snapshot endpoints replace their whole payload each refresh, so a cursor makes no sense. They carry an ETag instead. Send it back as If-None-Match and you get 304 Not Modified with an empty body while the data is unchanged.
The derivatives screener refreshes about every two minutes and advertises this in an X-Refresh-After header. A client polling it every ten seconds transfers a body once per cycle instead of twelve times.
curl -D - -o /dev/null "https://api.smartmoneyapi.com/v1/derivatives/screener"
# ETag: "7a5c5a3f176fec01f399ead98a09edd9"
# X-Refresh-After: 120
# Subsequent polls — 304, no body, until the data actually changes
curl -H 'If-None-Match: "7a5c5a3f176fec01f399ead98a09edd9"' \
"https://api.smartmoneyapi.com/v1/derivatives/screener"
Response Fields
| Field | Type | Description |
|---|---|---|
| ts | integer | Unix timestamp of the calculation |
| symbol | string | Asset symbol. Free keys may name BTC, ETH, SOL, XAU, XAG; Trader and above, any tracked symbol. |
| direction | string | Requested direction (long/short) |
| composite | float | Composite confluence score from -1.0 (extreme contra) to +1.0 (strong confirm). Not a win-rate. |
| base_composite | float | Composite before post-filter adjustments were applied |
| confidence | string | HIGH / MEDIUM / LOW / VETO / NO_DATA |
| action | string | CONFIRM_FULL / CONFIRM_REDUCED / CONFIRM_MINIMAL / VETO_SKIP / NO_DATA_SKIP |
| size_mult | float | Suggested position size multiplier (e.g. 0.0 – 1.5) |
| unsupported | bool | true when the symbol is outside coverage (paired with NO_DATA) |
| deriv_score | float | Derivatives sub-score (-1 to 1) |
| onchain_score | float | On-chain sub-score (-1 to 1) |
| whale_score | float | Whale consensus sub-score (-1 to 1) |
| x_score | float | X/social-sentiment sub-score (-1 to 1); 0 when unused |
| factors | object | Per-leg breakdown: score × weight = weighted for derivatives / onchain / whale / x_sentiment (onchain includes source) |
| adjustments | object | Signed post-filter tweaks (agreement, trend, rsi_1h, news_macro, momentum, time_of_day, streak_decay) |
| weights | object | Weight set actually used for this evaluation |
| coverage | object | {derivatives, whale, onchain} — which legs had real data |
| reasons | array | Human-readable explanation strings for the score |
GET /snapshot
Returns a full market snapshot including all sub-scores, raw metrics, and indicator values for a given symbol. Useful for dashboards and logging.
GET /onchain
Returns raw on-chain metrics: MVRV, SOPR, exchange net flow, realized cap ratio, and cycle position classification.
GET /v1/derivatives/*
Cross-exchange derivatives screener across 500+ symbols: funding-rate heatmap, open-interest rankings, and long/short-ratio signal detection. Top 10 rows are public; the full screener requires Trader or Pro. Endpoints: /v1/derivatives/screener, /v1/derivatives/funding, /v1/derivatives/oi, /v1/derivatives/signals.
GET /v1/options/*
Deribit-sourced BTC & ETH options analytics (public, no auth): put/call ratio, max pain, and open interest by strike. Endpoints: /v1/options/summary, /v1/options/pcr, /v1/options/oi.
GET /v1/etf/*
Spot BTC & ETH ETF daily net flows and per-fund breakdown (public). Endpoints: /v1/etf/flows, /v1/etf/funds.
GET /v1/historical/*
Historical funding, open interest, long/short ratio (Binance), and price/market-cap/volume (CoinGecko) for backtesting. Endpoints: /v1/historical/funding, /v1/historical/open-interest, /v1/historical/long-short, /v1/historical/market. Symbols for the first three are Binance pair ids (e.g. BTCUSDT), case-sensitive — a plain BTC or lowercase pair answers count: 0 with HTTP 200, not an error.
/v1/historical/funding?symbol=XAU answers count: 0 even though XAU is live on the screener and roughly thirty days of it exist in storage. See Metals — history and provenance. A count: 0 here means “this pipeline has no rows for that symbol”, which is not the same claim as “the market was quiet”.GET /v1/dex/*
DexScreener-powered trending pairs, token search, and pair details (public, no auth). Endpoints: /v1/dex/trending, /v1/dex/search, /v1/dex/token, /v1/dex/pair.
GET /v1/news/*
News intelligence: policy/geopolitical/crypto news classified into impact categories, plus Fear & Greed (public, no auth). Endpoints: /v1/news/trump, /v1/news/general, /v1/news/impact, /v1/news/fear-greed.
GET /whales
Returns whale wallet consensus data: long/short split, total notional exposure, top 10 positions (Pro only), and wallet count.
GET /signals
Returns a stream of the most recent HIGH/MEDIUM signals across all monitored assets. Useful for opportunity scanning.
GET /v1/strategies/*
Transparent, read-only track record for the automated trading strategies that execute on top of Smart Money signals — including the deriv40 SmartMoney Copytrade strategy (account=9). All endpoints take a ?account=<id> query parameter and return JSON. No authentication required (public track record).
Endpoints
GET /v1/strategies/stats?account=9— headline metrics:total_trades,win_rate,profit_factor,total_pnl_usdt,account_growth_percent,initial_equity,current_equity,max_drawdown_portfolio,max_drawdown_trade.GET /v1/strategies/equity?account=9— equity curve for charting:{ initial_equity, curve: [{ time, equity }] }.GET /v1/strategies/trades?account=9&limit=500— closed-trade ledger: array (or{trades:[…]}) ofsymbol,direction,entry_price,exit_price,pnl_usdt,pnl_percent,pnl_percent_net.GET /v1/strategies/active?account=9— currently open positions: array (or{positions:[…]}) ofsymbol,side/direction,entry_price,unrealized_pnl.GET /v1/strategies/signals— signal-type breakdown feeding the strategies (count / wins / win_rate / avg_pnl per signal type).
Past performance is not indicative of future results. Figures are backfilled over a single ~3-month regime plus live trades and are shown pre-fee where noted.
GET /export
Download historical signal data as CSV for backtesting. Parameters: symbol, from (unix ts), to (unix ts).
GET /health
System health check. Returns data freshness for each source and overall API status. No authentication required.
"status": "ok",
"uptime_s": 1209600,
"sources": {
"bybit": { "lag_s": 42, "ok": true },
"binance": { "lag_s": 38, "ok": true },
"hyperliquid": { "lag_s": 61, "ok": true },
"onchain": { "lag_s": 290, "ok": true }
}
}
GET /usage
Returns your current API usage statistics: calls today, monthly totals, quota limits, and reset times.
POST /webhooks
Register an HTTPS URL to receive real-time signed event pushes when a signal fires across your monitored assets. Deliveries carry an X-SmartMoney-Event header and an HMAC-SHA256 signature in X-SmartMoney-Signature, and retry up to 3× with backoff.
Request Body
| Field | Type | Description |
|---|---|---|
| urlrequired | string | HTTPS endpoint to POST events to (must start with https://) |
| eventsrequired | array | Event names, e.g. ["HIGH","MEDIUM","VETO"] or ["*"] |
| symbolsrequired | array | Symbols to filter, e.g. ["BTC","ETH"] or ["*"] |
| secretrequired | string | Your signing secret, ≥ 16 chars (stored hashed) |
Verifying the signature
The HMAC key is the SHA-256 hex digest of your registered secret. Compute the HMAC-SHA256 of the raw request body with that key and compare (constant-time) against X-SmartMoney-Signature. See the Webhook Implementation guide.
Intelligence
GET /analysis
Returns AI-powered market regime classification with signal conflict detection. Analyzes cross-signal agreement, identifies divergences between derivatives, on-chain, and whale data, and produces a natural-language summary with forward-looking risk factors and a time-horizoned recommendation.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symbolrequired | string | Asset symbol: BTC, ETH, or SOL |
This section previously carried a hand-written example response containing an LLM narrative that was never generated, plus a ts field this endpoint never emits. It was removed. The model fills regime, regime_label, summary, signal_conflicts, risk_factors, recommendation and time_horizon; the server then adds symbol, generated_at, generated_at_unix, generation_time_ms and ai_backend. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
GET /liquidations
Two different things in one payload. (1) A modelled ladder of where leveraged positions would liquidate — longs and shorts — built from measured open interest, an average leverage inferred from funding, and the liquidation prices of tracked Hyperliquid wallets. (2) realized_heatmap — what actually liquidated, aggregated live from public exchange WebSocket feeds: Binance, OKX, Bybit, Bitget, BitMEX (absent in a very calm market or just after startup).
nearest_long_liq_pct and nearest_short_liq_pct are equal by construction — one number restated, not two independent readings that agree. nearest_symmetric: true is the field that says so. This endpoint locates nothing: it projects a ladder, it does not observe where liquidation orders sit. For what actually executed, read realized_heatmap or /liquidations/heatmap.total_long_oi and total_short_oi are null unless a venue actually reported a breakdown, and oi_split_source says which case you are in. For a perpetual, long and short notional are equal by identity — a 50/50 bar is not an unmeasured quantity, it is one that cannot differ. Directional skew is measurable and is carried by positioning, which names the population behind every reading.Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Asset symbol (default BTC). The realized heatmap covers actively-traded perp symbols. |
Response fields
The Plans column is the whole tier boundary for this endpoint. It is checked against api_gateway._handle_liquidations on every build — if the reshape changes and this table does not, the build fails rather than this page going quietly false.
| Field | Plans | What it means |
|---|---|---|
symbol | Trader + Pro | Base symbol this payload describes. |
current_price | Trader + Pro | The mark every distance below is measured from. null when no usable price was readable — never 0. |
price_source | Trader + Pro | Where current_price came from, in falling recency: binance_ticker (live), last_known (our own last good live read, bounded at 600 s), derivatives_snapshot (median venue price from our newest collection cycle, bounded at 2,700 s — derived from that feed’s measured p99 of 28.8 min), or none when nothing answered and current_price is null. A live quote and a 45-minute-old fallback are both legitimate here, so the response says which one you got. |
price_age_s | Trader + Pro | Seconds between that price being observed and this payload being built. 0 for a live read; null when no price was readable — never 0, which would report an absent datum as a fresh one. |
longs | Trader + Pro | Modelled long-liquidation ladder, nearest first. Each level carries liq_price, entry_px, leverage, dist_pct, source (whale_position, oi_band) and size_measured. |
shorts | Trader + Pro | Short-side ladder, same shape and same truncation rule as longs. |
cascade_risk | Trader + Pro | Bucket of the nearest reportable distance: extreme, high, low, moderate, unknown. unknown means no distance was reportable at all — an absence, not a calm market. |
nearest_long_liq_pct | Trader + Pro | Absolute % distance from current_price to the nearest long level eligible to set a headline. null when none was. |
nearest_short_liq_pct | Trader + Pro | Same on the short side. Read nearest_symmetric before comparing the two. |
nearest_symmetric | Trader + Pro | The field that stops a misreading. true means both nearest distances came from the open-interest band ladder, which places each side at maintenance-margin / leverage from the same entry — so the two percentages are one number restated, equal by construction, not two located clusters that happen to agree. |
nearest_basis | Trader + Pro | Where the headline distances came from: none, oi_band, whale. |
bands_status | Trader + Pro | no_funding_measurement, no_levels, ok. Answers “did the band model run?” — no_funding_measurement means funding was never read, so nothing was modelled. |
funding_rate | Trader + Pro | The only input to the crowd leverage the bands are built from. null means never read, not zero. |
total_oi | Trader + Pro | Measured aggregate open interest (USD). The only open-interest number here that anything observed. |
oi_scope | Trader + Pro | What total_oi is a sum over (sum_of_binance_bybit_hyperliquid). null whenever total_oi is null. |
total_long_oi | Trader + Pro | null unless a venue actually reported a per-side breakdown. The aggregate is never halved into a 50/50 split: for a perpetual, long and short notional are equal by identity, so a dollar split is not an unmeasured quantity — it is one that cannot differ. |
total_short_oi | Trader + Pro | Short side, under the same rule as total_long_oi. |
oi_split_source | Trader + Pro | Which case the two fields above are in: aggregate_only, measured, unavailable. |
positioning | Trader + Pro | Directional skew, which — unlike a dollar split — is measurable. Carries top_trader_long_share/top_trader_lsr with top_trader_scope, the account-headcount pair with its own scope, and status (ok, unavailable, unmeasured_default). unmeasured_default means the upstream ratio was a default rather than a reading, and both shares are then null. |
whale_book | Trader + Pro | Summary of the tracked Hyperliquid book: status, scope, long_share, wallet counts, liq_price_source, as_of/age_s. No wallet identity. Trader's copy omits whale_book.long_notional_usd, whale_book.short_notional_usd. |
realized_totals | Trader only | Trader's view of realized_heatmap.totals — notional and count of what actually liquidated. |
realized_by_side | Trader only | Trader's view of realized_heatmap.by_side. |
withheld | Trader only | Array naming what this response had removed by plan. Vocabulary: level_detail_beyond_5, realized_heatmap.matrices, whale_book.long_notional_usd, whale_book.short_notional_usd. Computed per response, so a symbol whose ladder was already short does not report a boundary that removed nothing. |
withheld_reason | Trader only | trader_plan. This is how you tell “not in your plan” apart from “the server had nothing” — a missing key cannot express both. |
level_depth | Trader only | Levels per side in this response. |
ts | Trader + Pro | Unix timestamp the payload was built. |
nearest_status | Pro only | no_exchange_reported_levels, no_levels, ok. Answers a different question from bands_status: “is there a distance we are entitled to report?”. no_exchange_reported_levels means levels exist and are drawn, but every candidate was a modelled liquidation price and so was refused as a headline. |
nearest_excluded_modelled | Pro only | How many drawn levels were refused as headline candidates on those grounds. Non-zero alongside ok is the ordinary case. |
nearest_exclusion_reason | Pro only | The caveat those refused levels carried. null when none were refused. |
realized_heatmap | Pro only | The full realized tape for the window: price × time matrices, per-price clusters, per-venue counts, totals and by_side. Present only when the stream has data for the symbol. |
What each plan receives
nearest_status, nearest_excluded_modelled, nearest_exclusion_reason, realized_heatmap. Every other field above is identical on both plans — the boundary is depth, not a different kind of answer.One gap, stated plainly:
nearest_status, nearest_excluded_modelled and nearest_exclusion_reason qualify the two nearest distances that Trader does receive, and they are currently Pro-only. A Trader can still separate the two empty states from the payload in hand — both distances null with a non-empty ladder means levels exist but none was eligible to set a headline; empty ladders mean there was nothing on that side — but the count and the stated reason for refused levels are not on the Trader plan.Whatever a plan did remove is named in
withheld with withheld_reason: "trader_plan". The list is computed per response, so a symbol whose full ladder was already 5 levels long reports no truncation. Possible entries: level_detail_beyond_5, realized_heatmap.matrices, whale_book.long_notional_usd, whale_book.short_notional_usd.Example Response
Not an illustration — this is the response this endpoint actually returned for ?symbol=BTC on a Trader key, captured 2026-08-28, with the two ladders at their real length of 5 and 5. Only the nearest level of each is printed here (the … stands for the other 4 and 4) — every other value is verbatim. A Pro response is the same document with the full ladders, the three nearest_* qualifier fields, the whole realized_heatmap in place of realized_totals/realized_by_side, and no withheld block.
"symbol": "BTC",
"current_price": 79832.37,
"longs": [ { "liq_price": 79056.0945, "entry_px": 80875.8, "leverage": 40.0, "size_usd": 66902.87, "size_measured": true, "dist_pct": 0.9723818796811229, "source": "whale_position", "liq_price_source": "modelled", "liq_price_caveat": "isolated_margin_assumed", "nearest_eligible": false }, … ],
"shorts": [ { "liq_price": 79944.06025, "entry_px": 78184.9, "leverage": 40.0, "size_usd": 9957125.0, "size_measured": true, "dist_pct": 0.13990596796762975, "source": "whale_position", "liq_price_source": "modelled", "liq_price_caveat": "isolated_margin_assumed", "nearest_eligible": false }, … ],
"cascade_risk": "low",
"nearest_long_liq_pct": 14.6212,
"nearest_short_liq_pct": 14.6212,
// the two above are ONE number restated — not two clusters
"nearest_symmetric": true,
"nearest_basis": "oi_band",
"bands_status": "ok",
"funding_rate": 5.5496666666666673e-05,
"total_oi": 15474166673.87,
"oi_scope": "sum_of_binance_bybit_hyperliquid",
// no venue reported a per-side split, so none is invented
"total_long_oi": null,
"total_short_oi": null,
"oi_split_source": "aggregate_only",
"positioning": { "top_trader_long_share": 0.677003, "top_trader_lsr": 2.096, "top_trader_scope": "binance_top20pct_by_margin_position_weighted", "account_long_share": 0.480897, "account_lsr": 0.9264, "account_scope": "binance_all_accounts_headcount", "status": "ok" },
"whale_book": { "status": "ok", "scope": "hyperliquid_tracked_whales", "long_share": 0.517778, "n_wallets": 214, "n_long_wallets": 141, "n_short_wallets": 73, "liq_price_source": "modelled", "liq_price_caveat": "isolated_margin_assumed", "n_levels_exchange": 0, "n_levels_modelled": 178, "nearest_long_liq_pct": null, "nearest_short_liq_pct": null, "nearest_source": null, "nearest_status": "no_exchange_reported_levels", "modelled_inconsistent": 36, "as_of": 1787896550, "age_s": 577 },
"realized_totals": { "long_liq_notional": 2692137.59, "short_liq_notional": 514902.87, "total_notional": 3207040.47, "count": 383 },
"realized_by_side": { "long": 2692137.59, "short": 514902.87 },
// what THIS response had removed by plan — computed, not a fixed list
"withheld": [ "level_detail_beyond_5", "whale_book.long_notional_usd", "whale_book.short_notional_usd", "realized_heatmap.matrices" ],
"withheld_reason": "trader_plan",
"level_depth": 5,
"ts": 1787897127
}
GET /liquidations/heatmap
Public price-level liquidation heatmap. Returns a Coinglass-style price × time matrix of REAL executed forced liquidations, bucketed by the price at which each liquidation printed — aggregated live from public exchange WebSocket feeds: Binance, OKX, Bybit, Bitget, BitMEX. The clusters array is the practical output: price buckets ranked by liquidated notional, each tagged with its dominant side. Data depends on the live stream — a very quiet symbol or a just-restarted gateway returns the well-formed empty structure plus an honest note. Levels shown are only ever real liquidations, never estimated.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Asset symbol (default BTC). |
| window_minutesoptional | int | Look-back window in minutes (default 240, clamped to 5–129600 = 90 days). Windows up to 240 come from the live in-process buffer; anything longer is read from the persisted liquidation archive. Out-of-range or unparseable values fall back to the default instead of erroring. |
| price_bucketsoptional | int | Number of price buckets (default 50, clamped to 5–100). |
Response fields you must read before drawing a conclusion
| Field | Values | What it means |
|---|---|---|
| source | memory | Served from the live 4h in-process buffer. Recording is current by definition. |
| source | archive | Read from the persisted liquidation history (any window longer than the buffer). A coverage block is included. |
| source | unavailable | The read failed. The archive is not present in this process, or the query errored. The payload is still a well-formed empty structure, and error says what broke. An empty chart here means “we could not look”, not “nothing liquidated”. |
| coverage.first_event_ts coverage.last_event_ts | epoch ms or null | Oldest and newest liquidation in the archive. If your window starts before first_event_ts, the part before it was never recorded. |
| coverage.gaps | array of {from_ts, to_ts} | Runs of whole hours inside your window with zero liquidations across every symbol and every venue. That is the signature of ingest being down (box off, feed dead) — markets do not go a full hour globally without a single forced liquidation. Treat these ranges as absent data. |
| coverage.error | string | The coverage probe itself failed, so coverage is unknown. Do not read its absence as full coverage. |
| coverage_note | string | Prose summary of the gaps (count and total hours), present only when there are any. |
| note | string | Present only when totals.count is 0, and it says which zero this is: a genuinely quiet window, or a failed read. |
| exchanges | object | Event count per venue backing this response. A venue absent here contributed nothing to this window — read it rather than assuming all five tapes were up. |
coverage.gaps exists to make those two states impossible to confuse. Always intersect your window with coverage before computing a rate, an average, or a “quietest period”.Example Response
"symbol": "BTC", "window_minutes": 240, "price_buckets": 50,
"price_min": 91000.0, "price_max": 99000.0, "price_bucket_size": 160.0,
"price_levels": [ 91080.0, 91240.0, … ], "time_buckets": [ … ],
"matrix": [ [ … ] ], "long_matrix": [ [ … ] ], "short_matrix": [ [ … ] ],
"clusters": [
{ "price": 93250.0, "notional": 4820000.0, "long_notional": 4100000.0,
"short_notional": 720000.0, "count": 37, "dominant_side": "long" }
],
"by_side": { "long": 6100000.0, "short": 2400000.0 },
"totals": { "long_liq_notional": 6100000.0, "short_liq_notional": 2400000.0, "total_notional": 8500000.0, "count": 214 },
"exchanges": { "binance": 120, "okx": 40, "bybit": 34, "bitget": 12, "bitmex": 8 },
"generated_at": 1710940200,
"source": "archive",
"coverage": { "first_event_ts": 1786516082998, "last_event_ts": 1787747385429,
"gaps": [ { "from_ts": 1787209200000, "to_ts": 1787551200000 } ] },
"coverage_note": "1 gap(s) totalling 95.0h in this window had NO liquidation recording at all (ingest was down). Those periods are absent data, not zero liquidations.",
"public": true
}
totals.count is 0, clusters is empty, and a note field explains why. It is a record of executed liquidations — not a prediction. For the modelled “where would liquidations sit” view, use /liquidations/simulate (public) or the authenticated /liquidations endpoint (whose realized view covers the last 4h only and carries no source/coverage block — Pro gets the full realized_heatmap, Trader gets its realized_totals and realized_by_side).GET /liquidations/symbols
Which symbols the liquidation archive actually holds — per-symbol event count, first and last timestamp, total liquidated notional, plus the venue list. Call this before trusting an empty heatmap. /liquidations/heatmap answers for any symbol string you hand it, so a symbol we have never recorded returns exactly the same well-formed empty grid as a symbol that was merely quiet. This endpoint is how you tell those apart.
Parameters
| Parameter | Type | Description |
|---|---|---|
| limitoptional | int | Max symbols returned, busiest first. Clamped to 1–2000. |
Example Response
"symbols": [
{ "symbol": "BTC", "count": 27643, "first_event_ts": 1786516210245,
"last_event_ts": 1787747905421, "total_notional": 742766037.17 }
],
"returned": 500, "total_symbols": 866,
"venues": [ "binance", "bitget", "bitmex", "bybit", "okx" ],
"generated_at": 1787747905, "source": "archive"
}
source: "unavailable" means the archive could not be read. An empty symbols list alongside it means “we could not look”, not “we hold nothing”.GET /liquidations/onchain
Executed on-chain DeFi lending liquidations captured directly from our own local BSC + Avalanche full nodes — independent of any trading bot. Covers Venus/Cream and Moolah on BSC, and AAVE V3/V2, Benqi, BankerJoe, Granary and Vinium on Avalanche. Pro tier additionally returns at_risk positions (bot-dependent, may be absent).
Parameters
| Parameter | Type | Description |
|---|---|---|
| chainoptional | string | bsc or avax. Omit for all chains. |
| limitoptional | integer | Max rows (default 100, max 500). Newest-first. |
Example Response
"chain": "bsc", "count": 2,
"liquidations": [
{ "chain": "bsc", "protocol": "Venus", "borrower": "0x2be6…8dfa",
"debt_symbol": "DAI", "repay_usd": 426.15,
"collateral_symbol": "WBNB", "tx_hash": "0x718c…7c0e", "block": 89170816, "ts": 1710940200 }
],
"summary": {
"window_hours": 24, "enabled": true,
"by_protocol": { "bsc:Venus": { "count": 61, "repay_usd_known": 148230.55 } },
"nodes": { "bsc": { "reachable": true, "head_block": 89173010, "events_total": 61 } }
}
}
GET /smart-stop
Returns a stop price together with the basis it was derived from. stop_basis records whether the recommendation came from a modelled liquidation cluster or from nothing but your own risk_pct with no cluster read at all — two stops that look identical on the wire and mean completely different things. The clusters it may use are the modelled ladder from /liquidations, not an observed order book, and they carry that endpoint’s caveats.
entry_price. This endpoint reads its market price from the daemon snapshot, and that snapshot carries no price field (measured 2026-08-28). A call that omits entry_price therefore returns stop_basis.status: "unavailable" with unavailable_reason: "no_entry_price", null stops and liq_cascade_risk: "unknown" — which is the endpoint refusing to invent a stop, not a quiet market. current_price is null for the same reason even when you do supply an entry, and price_reference_source then reads caller_entry_price so you can see the distance was measured against your number, not the market’s.Parameters
| Parameter | Type | Description |
|---|---|---|
| symbolrequired | string | Asset symbol: BTC, ETH, or SOL |
| directionrequired | string | Position direction: long or short |
| entry_priceoptional | float | Your entry price. Optional in the schema only: the market-price fallback reads the daemon snapshot, which carries no price field, so omitting this currently yields stop_basis.status: "unavailable" rather than a stop. Send it. |
| risk_pctoptional | float | Maximum acceptable risk as % of account. Default: 2.0 |
Example Response
Not an illustration — this is the response this endpoint actually returned for ?symbol=BTC&direction=long&entry_price=79832.36&risk_pct=2.0 on a Trader key, captured 2026-08-28. Prices move; the shape and the vocabulary do not.
"symbol": "BTC",
"direction": "long",
"entry_price": 79832.36,
"entry_price_source": "caller",
"current_price": null,
"price_reference": 79832.36,
"price_reference_source": "caller_entry_price",
"recommended_stop": 79444.22725,
"recommended_stop_detail": {
"price": 79444.22725,
"risk_pct": 0.4862,
"derived_from": "liquidation_cluster",
"placement": "between entry and the nearest cluster below it",
"reference_cluster": { "center_price": 78801.879333, "low_price": 78673.501, "high_price": 79056.0945, "total_size_usd": 13248705.57, "size_usd_subtotal": 13248705.57, "member_count": 3, "sized_member_count": 3, "unsized_member_count": 0, "size_basis": "all_members_measured" },
"reference_cluster_side": "below",
"reference_cluster_distance_pct_from_stop": 0.4886,
"reference_cluster_distance_pct_from_entry": 1.2908,
"gap": { "low": 79056.0945, "high": 79832.36, "width_pct": 0.9724, "unbounded": false }
},
"stop_basis": {
"status": "liquidation_cluster",
"explanation": "Stops placed against measured liquidation clusters. The recommended stop is between entry and the nearest cluster below it, 0.4886% below the cluster spanning 78673.501\u201379056.0945 ($13,248,706 across 3 level(s)).",
"unavailable_reason": null,
"liquidation_data": "read",
"liquidation_source": "estimator",
"liquidation_error": null,
"bands_status": "ok",
"levels_seen": 10,
"levels_priced": 10,
"clusters_found": 3,
"usable_gap_count": 3,
"risk_pct_requested": 2.0
},
"risk_pct_reference": null,
"risk_pct_requested": 2.0,
"liq_cascade_risk": "low",
"withheld": [
"stops.tight_and_wide",
"avoid_zones",
"take_profit_suggestions"
],
"withheld_reason": "trader_plan",
"ts": 1787897143
}
symbol, direction, entry_price, entry_price_source, current_price, price_reference, price_reference_source, recommended_stop, recommended_stop_detail, stop_basis, risk_pct_reference, risk_pct_requested, liq_cascade_risk, withheld, withheld_reason, ts — the recommended stop and every qualifier that makes it readable. A plan boundary may remove a figure; it never removes the provenance of a figure it keeps. Pro plan adds avoid_zones, stops.tight_and_wide, take_profit_suggestions. Whatever your plan removed is named per response in withheld with withheld_reason: "trader_plan", so “not in your plan” is never confusable with “the server had nothing”. The example above is a Trader response; a Pro response drops the withheld pair and carries stops, the full stop_detail, avoid_zones, take_profit_suggestions and take_profit_basis instead.GET /funding-arb
Identifies cross-exchange funding rate arbitrage opportunities in real time. Returns ranked opportunities with estimated annualized yield, optimal exchange pair, and the required hedge action to capture the spread.
Parameters
| Parameter | Type | Description |
|---|---|---|
| min_spreadoptional | float | Minimum funding rate spread to include (as decimal). Default: 0.01 |
| symboloptional | string | Filter to a specific asset. Omit to scan all supported assets. |
This section previously carried a hand-written example response naming spread, apr and estimated_profit_8h_usd — none of which appears anywhere in the server source. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
Free public variant No auth
A no-key public endpoint returns the top 10 opportunities with a live cross-exchange screener, ideal for embedding or quick checks. It drops per-symbol spread history and heavy fields and is served from a 120-second cache. When no cross-exchange funding spreads exist in the freshness window it returns an empty opportunities array with a note — never fabricated data.
"opportunities": [
{
"symbol": "OGN",
"spread_pct": 0.297667,
"annualized_apr": 325.95,
"long_exchange": "bybit",
"short_exchange": "hyperliquid",
"estimated_profit_per_10k_per_8h": 29.77,
"profit_horizon_hours": 8,
"risk_notes": "Low spread — ensure fees do not consume the arbitrage margin."
}
],
"scanned_symbols": 222,
"ts": 1783268753,
"public": true,
"limited": true
}
GET /smart-money/flow
A quality-weighted whale directional index per symbol, scored -100 (whale money leaning short) to +100 (leaning long). Built from thousands of tracked Hyperliquid whale wallets — each weighted by its own historical win-rate and PnL and decayed by recency. This is a positioning index, not a buy/sell signal or price prediction. Symbols with few contributing wallets are labelled thin and scored honestly. Live page: smart-money-flow.html.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Single symbol (e.g. BTC). Omit to get all tracked symbols ranked by |score|. |
| window_hoursoptional | int | Scoring window, clamped to 1..168. Default 24. |
Example Response
"symbols": [
{
"symbol": "SPX",
"score": -90.93,
"direction": "strong_short",
"n_wallets": 26,
"long_usd": 184200.0, "short_usd": 2410000.0,
"quality_weighted": true,
"sample_quality": "rich",
"top_contributors": [ { "wallet": "0x31ca…974b", "direction": "short", "value_usd": 5338.25, "weight": 0.4948 } ]
}
],
"window_hours": 24,
"quality_weighted": true,
"ts": 1783270000,
"note": "Quality-weighted whale directional positioning index (-100..+100). Not a price prediction or buy/sell signal."
}
top_contributors. Wallet weights are bounded to [0.25,1.0]; PnL is an unrealised proxy from the latest position snapshots.GET /v1/whales/crowding
Combined whale positioning & crowding context per symbol, merged across Hyperliquid + GMX v2 + Jupiter Perps. Returns gross/net notional, directional skew, wallet & venue counts, position concentration (top-3 share + HHI), a weighted-average leverage, and liquidation-proximity buckets ($ notional sitting within 5% and 10% of its estimated liquidation price, split long/short). This is context, not a directional signal. Fields that are not derivable are null and render as — — e.g. lev_wavg/crowding_index when no position carries leverage. Liquidation distances are an isolated-margin estimate (pct_to_liq ≈ 1/lev + upnl/notional − mmr, mmr = 0.01), not exchange-reported liquidation prices.
Parameters
| Parameter | Type | Description |
|---|---|---|
| min_notionaloptional | float | Minimum combined gross notional (USD) for a symbol to be included. Default: 1000000. |
Example Request
Example Response
"ok": true, "ts": 1783423500, "min_notional": 1000000, "n_symbols": 92,
"symbols": [
{
"symbol": "BTC",
"gross_usd": 2447900000.0, "net_usd": -51000000.0, "skew": -0.021,
"n_whales": 414, "n_venues": 3,
"venues": {
"hl": { "gross": 1900000000.0, "net": -40000000.0, "n_whales": 272 },
"gmx": { "gross": 320000000.0, "net": -6000000.0, "n_whales": 59 },
"jupiter": { "gross": 227900000.0, "net": -5000000.0, "n_whales": 83 }
},
"conc_top3": 0.159, "hhi": 0.011, "lev_wavg": 19.1,
"liq_within_5pct": { "long": 621700000.0, "short": 665600000.0 },
"liq_within_10pct": { "long": 840000000.0, "short": 910000000.0 },
"crowding_index": 0.003
}
],
"caveats": [ "Liquidation distances are isolated-margin estimates, not exchange-reported." ]
}
skew is net/gross ∈ [-1,1]; crowding_index = |skew|·conc_top3·min(lev/20,1). Only venues actually present appear in venues. Positions with no leverage are excluded from the liq buckets rather than assumed. Anonymous callers receive the top 10 symbols by gross (with gated: true); Trader+ receive the full list.GET /v1/options/gex
Dealer gamma exposure (GEX) analytics for BTC & ETH, computed live from the public Deribit options chain (no auth). Returns net dealer GEX per strike (SpotGamma dealer-short convention), the gamma-flip level (strike where cumulative net GEX crosses zero), the IV term structure (ATM implied vol by days-to-expiry), and a front-expiry IV skew (25Δ-proxy risk reversal). GEX regime is positive (dealers long gamma → vol-suppressing) or negative (vol-amplifying). Fully self-contained — recomputed on every call, no stored-DB dependency.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | BTC or ETH only. Default: BTC. |
Example Request
Example Response
Captured from the running API on 2026-08-28 (GET /v1/options/gex?symbol=BTC). profile carries one row per strike; 74 of the 76 rows are elided behind the …. Values move; the field names and the nesting are what this documents.
"symbol": "BTC",
"available": true,
"spot_price": 79866.57,
"net_gex": 0.3893,
"net_gex_raw": 389325.29,
"call_gex_total": 0.5551,
"put_gex_total": 0.1657,
"gamma_flip": 75948.54,
"gex_regime": "positive",
"regime_note": "Dealers net LONG gamma above the flip \u2014 they fade moves (vol-suppressing).",
"profile": [ { "strike": 40000.0, "call_gex": 45.97, "put_gex": 1117.54, "net_gex": -1071.57, "call_oi": 407.5, "put_oi": 10943.6 }, { "strike": 45000.0, "call_gex": 25.98, "put_gex": 784.29, "net_gex": -758.31, "call_oi": 283.1, "put_oi": 5556.4 }, … ],
"profile_strikes": 76,
"term_structure": [
{ "expiry": "28AUG26", "days_to_expiry": 0.08, "atm_iv": 49.08, "atm_strike": 80000.0 },
{ "expiry": "29AUG26", "days_to_expiry": 1.08, "atm_iv": 52.24, "atm_strike": 80000.0 },
{ "expiry": "30AUG26", "days_to_expiry": 2.08, "atm_iv": 41.36, "atm_strike": 80000.0 },
{ "expiry": "31AUG26", "days_to_expiry": 3.08, "atm_iv": 39.9, "atm_strike": 80000.0 },
{ "expiry": "4SEP26", "days_to_expiry": 7.08, "atm_iv": 40.67, "atm_strike": 80000.0 },
{ "expiry": "11SEP26", "days_to_expiry": 14.08, "atm_iv": 38.97, "atm_strike": 80000.0 },
{ "expiry": "18SEP26", "days_to_expiry": 21.08, "atm_iv": 39.23, "atm_strike": 80000.0 },
{ "expiry": "25SEP26", "days_to_expiry": 28.08, "atm_iv": 39.02, "atm_strike": 80000.0 },
{ "expiry": "30OCT26", "days_to_expiry": 63.08, "atm_iv": 38.85, "atm_strike": 80000.0 },
{ "expiry": "27NOV26", "days_to_expiry": 91.08, "atm_iv": 40.2, "atm_strike": 80000.0 },
{ "expiry": "25DEC26", "days_to_expiry": 119.08, "atm_iv": 41.01, "atm_strike": 80000.0 },
{ "expiry": "26MAR27", "days_to_expiry": 210.08, "atm_iv": 42.02, "atm_strike": 80000.0 },
{ "expiry": "25JUN27", "days_to_expiry": 301.08, "atm_iv": 42.93, "atm_strike": 80000.0 }
],
"skew": {
"expiry": "28AUG26",
"days_to_expiry": 0.08,
"put_iv": 105.52,
"call_iv": 80.32,
"put_strike": 72000.0,
"call_strike": 88000.0,
"atm_iv": 49.08,
"risk_reversal": 25.2,
"bias": "downside_fear"
},
"convention": "net_gex = sum(call_gamma_dollars - put_gamma_dollars) per strike; gamma_dollars = BS_gamma * OI * spot (Deribit contract multiplier=1); dealers assumed short calls / long puts; gamma_flip = cumulative-zero crossing. Units: $ per 1-unit spot move; net_gex field scaled to $millions.",
"scale": "millions_usd",
"source": "deribit_public",
"updated": 1787897111
}
available: false with empty panels — never fabricated GEX. IV skew uses a fixed ±10% strike proxy for 25Δ (true 25-delta requires solving delta per strike); adequate for display, documented as an approximation.GET /v1/liquidations/simulate
Interactive liquidation cascade stress-test. Given a hypothetical price move, returns the estimated leveraged positions that would get liquidated, forced volume by price level / side / exchange, and a cascade-depth readout. A downward move liquidates longs whose liq-price sits at/above the target; an upward move liquidates shorts whose liq-price sits at/below it. Two independent methods are merged: exact liquidation prices from tracked Hyperliquid whales' real leverage/entry, plus statistical OI-band clusters per exchange (crowd leverage inferred from funding). Everything is clearly labelled estimated: true — it cannot know per-account margin, cross vs isolated, added margin, or ADL.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Asset symbol. Default: BTC. |
| move_pctoptional | float | Hypothetical price move as a percent (negative = down, positive = up). Default: -5. |
Example Request
Example Response
"ok": true, "estimated": true, "symbol": "BTC",
"current_price": 63000.0, "move_pct": -5.0, "target_price": 59850.0,
"triggered_notional_usd": 380000000.0,
"cascade_depth": 0.029, "cascade_risk": "low",
"by_exchange": { "hyperliquid": { "long_usd": 260000000.0, "short_usd": 0.0, "total_usd": 260000000.0 } },
"nearest_long_wall": { "liq_price": 60100.0, "dist_pct": 4.6, "source": "whale_position" },
"clusters": [
{ "price": 60100.0, "side": "long", "notional_usd": 42000000.0, "whale_usd": 18000000.0, "oi_usd": 24000000.0 }
],
"whale_positions_used": 272, "exchanges": [ "binance", "bybit", "hyperliquid" ],
"realized_context": { "available": true, "coverage_hours": 342.0, "venues": [ "binance", "okx", "bybit", "bitget", "bitmex" ], "last_24h_by_side": { "long": 6100000.0, "short": 2400000.0 } },
"methodology": { "disclaimer": "Estimated — cannot know per-account margin, cross vs isolated, add-margin, or ADL." }
}
ok: true, empty: true with a plain-English message, not fake bars. realized_context is a young, growing sample from the live forced-liquidation stream, surfaced only as context — it never makes the projection "realized."GET /v1/liquidations/aftermath
What price actually did after big liquidation minutes, measured on the retained live tape. An “event” is a 1-minute liquidation-notional bin above that symbol’s 90th percentile and at least $25,000; the side is the dominant liq_side in the bin. Each horizon reports n, mean, median, positive fraction, standard deviation, a 95% confidence interval, a permutation p-value and a plain-language verdict. This is descriptive, not a signal — data_posture says so in every response, and horizons that are indistinguishable from baseline return exactly that verdict rather than being dressed up as an edge.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Asset symbol. Default: BTC. |
Example Response
"symbol": "BTC", "generated_at": 1787747364,
"data_posture": "DESCRIPTIVE conditional statistics — NOT a directional signal.",
"coverage": { "start_utc": "2026-08-12 06:28 UTC", "end_utc": "2026-08-26 12:29 UTC", "hours": 342.0 },
"price_source": "derivatives.price (…)", "event_definition": "…",
"n_events": 260, "n_long_liq_events": 152, "n_short_liq_events": 108,
"horizons": {
"+5m": { "long_liq": { "n": 116, "mean_pct": 0.1206, "median_pct": 0.0,
"pos_frac": 0.112, "ci95_low_pct": -0.0159, "ci95_high_pct": 0.2571,
"perm_p": 0.0507, "verdict": "not_distinguishable_from_baseline" } }
}
}
coverage.hours is the whole sample this was computed on. It is weeks, not years, and it is one market regime — read n and perm_p before treating any horizon as real.GET /v1/liquidations/aftermath/historical
The same question asked over two years of 4h open-interest and price history, because the live tape is only weeks deep. Takes no parameters — it serves one precomputed study covering every symbol in the dataset, keyed under per_symbol.
posture field.Example Response
"kind": "liq_aftermath_historical", "generated_at": 1783465806,
"posture": "OI-CASCADE PROXY — cascade events are INFERRED from sharp Open-Interest drops … NOT realized liquidation events.",
"dataset": { "symbols": 14, "oi_source": "bybit (base units)", "grid": "4h", "span": "2024-03-19 -> 2026-03-19" },
"horizons": [ "+4h", "+12h", "+24h", "+48h" ],
"n_events": { "long": 236, "short": 122, "total": 358 },
"per_symbol": { "ATOMUSDT": { "n_long_liq": 6, "n_short_liq": 7, … } }
}
GET /v1/wallet/{addr}/profile
A cross-venue wallet profile built entirely from the live tracked-whale position snapshots. For a tracked Hyperliquid whale, returns current open positions, an unrealized-PnL / exposure / position-count time series, an OPEN/CLOSE/FLIP activity timeline (reconstructed by diffing consecutive snapshots), the decoded HL-leaderboard label, and an open-book summary. Live page: wallet-profiler.html.
Parameters
| Parameter | Type | Description |
|---|---|---|
| addrrequired | string | Wallet address (path segment), e.g. /v1/wallet/0x3bcae23e…/profile. |
| daysoptional | integer | Look-back window for the series & timeline. Default: 30. |
Example Request
Example Response
"ok": true, "wallet": "0x3bcae23e…", "tracked": true,
"first_seen_ts": 1782827733, "latest_snapshot_ts": 1783418468, "as_of": 1783418468,
"hyperliquid": {
"label": { "name": "Andre is back", "score": 74,
"window_pnl_usd": 1307000, "win_rate_pct": 71, "trades": 42 },
"positions": [
{ "venue": "hyperliquid", "symbol": "ETH", "direction": "short",
"size": 1200.0, "entry_px": 1800.0, "unrealized_pnl": 34800.0,
"leverage": 20.0, "value_usd": 2160000.0 }
],
"series": [ { "ts": 1783330000, "unrealized_pnl": 42000.0, "exposure_usd": 18400000.0, "positions": 5 } ],
"timeline": [ { "ts": 1783400000, "event": "flip", "symbol": "ETH",
"direction": "short", "from_direction": "long", "value_usd": 2160000.0 } ],
"summary": {
"open_positions": 5, "in_profit": 3, "in_loss": 2, "longs": 0, "shorts": 5,
"total_unrealized_pnl": -12000.0, "total_exposure_usd": 21000000.0, "blended_leverage": 19.9,
"window_days": 30, "snapshots_in_window": 474,
"realized_pnl": null, "realized_pnl_note": "Not derivable — only open snapshots are seen, never closing fills."
}
}
}
pnl is HL's own unrealized mark-to-market, value_usd is open notional. Realized P&L per round-trip is unavailable (we only see open snapshots, never closing fills) and is shown as null / —; timeline CLOSE events carry no P&L claim. A valid but untracked address returns tracked: false with a note; an invalid address returns ok: false, error: "invalid_address" (HTTP 400). The HL-leaderboard label is HL's own window standing at discovery, not computed by us.GET /v1/l2/trades
Raw trade prints for one venue over a bounded UTC hour window, read directly from our L2 collector's store. Only venue=hyperliquid returns rows today. We collect a real-time trade tape from 11 exchanges for internal research, but a licence review completed 2026-09-04 found that nine of the ten centralised venues' API terms forbid redistribution or resale of their market data, with no carve-out for derived or aggregated data — see /v1/l2/venues for the full table and the reason per venue. Hyperliquid is the one exception, cleared by an explicit operator decision (it publishes no such restriction in any governing document).
Parameters
| Parameter | Type | Description |
|---|---|---|
| venuerequired | string | Venue id, e.g. hyperliquid. See /v1/l2/venues for the full list. |
| symboloptional | string | Restrict to one symbol, e.g. BTC. Omit to include every symbol collected in the window. |
| startoptional | string | Window start, ISO-8601 UTC (e.g. 2026-09-01T15:00:00Z). Defaults to one hour before end. |
| endoptional | string | Window end, ISO-8601 UTC, exclusive. Defaults to the current UTC hour. |
| limitoptional | integer | Max rows returned. Default 5000, capped at 20000. |
Example Request
The exact response shape (row fields, coverage, source_terms) is defined by /openapi.json, generated from the server source on every build.
limit (default 5,000, max 20,000) — a cut past either is reported explicitly as truncated: true alongside row_count and rows_available, never a silent cut. Every response also carries the dataset's own honesty fields — complete, hours_refused, window_covered_ms, dataset_version — so the limits of the extract travel with the data. A venue other than hyperliquid is refused with HTTP 403 naming the venue and the exact licence reason, even when the store holds zero matching rows for that request — an empty result and a licence refusal are different facts and never share a status code. An unreadable or unavailable store is HTTP 503, never 502/504.GET /v1/l2/venues
Every venue the L2 collector knows, whether it is cleared to reach a paying subscriber, and the reason for the ones that are not — read directly from the collector's own licence table, never a hand-maintained list. Use this to check a venue's status before calling /v1/l2/trades.
GET /flows
Returns cross-asset capital flow data showing rotation patterns between BTC, ETH, and SOL across multiple time windows. Useful for identifying which asset is accumulating capital and which is being distributed at any given moment.
This section previously carried a hand-written example response naming a rotations_detected field that appears nowhere in the server source. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
GET /whale-events
Returns significant whale position changes — opens, closes, and direction flips — detected across tracked wallets and on-chain addresses within the specified look-back window.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Filter by asset. Omit for all monitored assets. |
| significanceoptional | string | Filter by event significance: high, medium, or all. Default: all |
| hoursoptional | integer | Look-back window in hours. Default: 24 |
This section previously carried a hand-written example response whose summary fields (new_opens, closes, flips_to_long, flips_to_short) appear nowhere in the server source. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
summary object only. Pro plan: Full events feed with wallet identifiers, sizes, and timestamps.GET /regimes/history
Returns historical regime classification data for a given asset. Use this to backtest how specific regime types have performed historically, how long each regime type typically lasts, and how regime transitions unfold over time.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Asset symbol. Default: BTC |
| regimeoptional | string | Filter to a specific regime type, e.g. late_cycle_divergence. Omit for all regimes. |
| daysoptional | integer | Look-back window in days. Default: 30. Maximum: 365 |
This section previously carried a hand-written example response naming current_regime, regime_summary, avg_duration_h and avg_return_pct — none of which appears anywhere in the server source. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
/analysis to validate strategy assumptions against historical regime performance data.GET /exchange-health
Returns real-time health status for all monitored exchanges including per-exchange latency, error rates, and data staleness indicators. No authentication required — publicly accessible endpoint.
Example Response
Captured from the running API on 2026-08-28 (GET /v1/exchange-health). Values move; the field names and the nesting are what this documents.
"exchanges": {
"bybit": { "status": "healthy", "avg_latency_ms": 315.8, "error_rate_pct": 0.0, "probe_count": 20, "last_success_ts": 1787896929, "last_error_ts": 1787872536, "last_error_msg": null },
"binance": { "status": "healthy", "avg_latency_ms": 1400.3, "error_rate_pct": 0.0, "probe_count": 20, "last_success_ts": 1787896931, "last_error_ts": 1787872645, "last_error_msg": null },
"hyperliquid": { "status": "slow", "avg_latency_ms": 2764.6, "error_rate_pct": 5.0, "probe_count": 20, "last_success_ts": 1787896393, "last_error_ts": 1787896369, "last_error_msg": null }
},
"overall": "degraded",
"ts": 1787897111
}
GET /sentiment
Returns a real-time Fear & Greed index (0-100) computed from derivatives sentiment, whale activity, volatility, and social signals. Includes component breakdown and 24-hour history for trend analysis.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Asset symbol. Default: BTC |
Example Response
"symbol": "BTC",
"score": 72,
"label": "Greed",
"components": {
"volatility": 65,
"momentum": 78,
"derivatives": 70,
"whale_activity": 75,
"social": 68
},
"history_24h": [
{ "ts": 1710940800, "score": 68, "label": "Greed" },
{ "ts": 1710937200, "score": 65, "label": "Greed" }
],
"ts": 1710940821
}
Integrations
GET /tradingview/setup
Returns your personalized TradingView integration setup: webhook URL, secret for validation, and ready-to-use Pine Script indicators that connect directly to the Smart Money API. Copy-paste the Pine Script into TradingView to overlay our signals on any chart.
Example Response
Abridged: the response also carries secret_returned_once, rotated and created. The Pine source is truncated here; the real payload contains all three scripts in full.
"webhook_url": "https://api.smartmoneyapi.com/v1/tradingview/webhook",
"webhook_secret": "tvs_a1b2c3...",
"pine_scripts": {
"composite_indicator": "// Smart Money Composite v1\n//@version=5\nindicator(...)...",
"whale_activity": "// Whale Activity Overlay v1\n...",
"funding_dashboard": "// Funding Rate + LSR Dashboard v1\n..."
}
}
POST /tradingview/webhook
Receives a TradingView alert, runs it through /confirm, and returns the confirmation. TradingView cannot send custom headers, so authenticate by including your webhook secret in the JSON body (this endpoint does not use X-API-Key). The response wraps the confirmation and adds a top-level action of CONFIRMED (daemon confidence HIGH/MEDIUM) or VETOED.
Request Body
"secret": "your_webhook_secret",
"symbol": "BTC",
"direction": "long",
"timeframe": "1h",
"strategy": "EMA crossover",
"price": 67500.0
}
Required: secret, symbol, direction (long|short). Optional: source, timeframe, strategy, price.
Personalization
GET /preferences
Returns your current personalization settings including default trade parameters, risk profile, watchlist, and notification preferences.
Update preferences by sending a JSON body with any subset of the fields below. Omitted fields retain their current values.
Preference Fields
| Field | Type | Description |
|---|---|---|
| default_trade_size_usd | float | Default position size in USD for Kelly and smart-stop calculations |
| risk_tolerance | string | conservative, moderate, or aggressive |
| default_risk_pct | float | Default risk per trade as % of account. Used by /smart-stop when risk_pct is omitted |
| watchlist | array | Ordered list of asset symbols, e.g. ["BTC","ETH","SOL"] |
| notification_email | string | Email address for alert delivery |
| timezone | string | IANA timezone string, e.g. America/New_York |
"default_trade_size_usd": 5000,
"risk_tolerance": "moderate",
"default_risk_pct": 1.5,
"watchlist": ["BTC", "ETH", "SOL"]
}
GET /watchlist
Returns a confirmation status snapshot and key risk metrics for all symbols in your configured watchlist. Provides a multi-asset overview without calling /confirm separately for each symbol.
This section previously carried a hand-written example response in which watchlist was an array of objects with confidence, action and cascade_risk fields. watchlist is an array of symbol strings; the per-symbol data sits under symbols, keyed by symbol, and each entry carries long_signal, short_signal, long_score, short_score, regime and suggested_long_size_usd. The top level also returns user_id and risk_tolerance. The old example was removed rather than corrected, because the docs build cannot call this endpoint to capture a real one. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
Real-time streaming
Streaming is on every plan, including Free, with a per-plan allowance read from the same manifest the gateway enforces. Up to seven channels — swaps, liquidations, funding, whales, signals, orderbook and fills — are multiplexed onto one WebSocket, and every frame carries the channel it came from and the unit of its principal number.
This is a correction of something that was genuinely wrong. Before it shipped, the paid plans carried a websocket flag while the only handler gated on a hard-coded tier list, so a paying Trader was refused in practice; and /v1/stream/public-swaps served the same events keyless, unmetered and uncapped. The anonymous visitor had the better deal than the customer. Both halves are fixed below.
/ws endpoint — there never has been, on either process. If you are getting a 404, that is why. The paths that exist are below.| Transport | Path | Notes |
|---|---|---|
| WebSocket | wss://api.smartmoneyapi.com/v1/ws/stream | Use this. Multiplexed — every channel your plan includes, on one socket. |
| WebSocket | wss://api.smartmoneyapi.com/v1/ws/live-swaps | Legacy, swaps only. Still works; new clients should use /v1/ws/stream. |
| SSE | https://api.smartmoneyapi.com/v1/stream/public-swaps | Swaps only. Metered, and deprecated — see below. |
Connecting — mint a ticket, then open the socket
An API key is never accepted in a WebSocket URL. ?key= and ?api_key= are rejected, and a test enforces that they stay rejected — query strings are logged by proxies and load balancers and saved in browser history. Exchange your key for a short-lived, single-use ticket over a normal authenticated POST, then connect with the ticket. Server-side clients that can set request headers may send X-API-Key on the handshake instead.
"https://api.smartmoneyapi.com/v1/ws/ticket"
Response
"ticket": "wst_9f3c1a8e4b2d…",
"expires_in": 60,
"ws_url": "/v1/ws/stream",
"channels": ["swaps", "liquidations"],
"entitlement": { /* channels, daily_seconds, max_connections, messages_per_day, tickets_per_day */ },
"usage": { /* what you have spent today, and what is left */ }
}
| Field | Type | Description |
|---|---|---|
| ticket | string | Single-use token to append as ?ticket=. Redeemed once, then invalidated. |
| expires_in | number | Seconds until it expires. Mint a fresh ticket per connection attempt. |
| ws_url | string | The path to open. Returned so a client never has to hardcode it. |
| channels | string[] | The channels this plan may actually open — the intersection of what the plan sells and what the bus publishes. |
| entitlement | object | Your plan’s streaming allowance, from the manifest. Read it rather than hardcoding a limit. |
| usage | object | What you have spent today and what remains, per allowance. |
Minting a ticket spends one from your daily ticket allowance. That is deliberate: a ticket is the only way a browser opens a socket, so metering the mint is what stops a stream of short-lived sockets from dodging the concurrent-connection cap.
const r = await fetch("https://api.smartmoneyapi.com/v1/ws/ticket", {
method: "POST", headers: { "X-API-Key": "sm_xxx" }
});
const { ticket, ws_url, channels } = await r.json();
// 2. Open the socket. Ask only for channels your plan returned.
const ws = new WebSocket(
`wss://api.smartmoneyapi.com${ws_url}?ticket=${ticket}&channels=${channels.join(",")}`
);
ws.onmessage = e => {
const f = JSON.parse(e.data);
if (f.type === "hello") return console.log(f.entitlement, f.channel_state);
if (f.type === "quota_exhausted") return console.warn(f.reason);
console.log(f.channel, f);
};
GET /v1/ws/channels
Public on purpose: you can read what streaming exists, which plan carries it, and whether a channel currently has a producer, before paying for it. It publishes the catalogue and channel state — never market data.
Every frame carries its channel and the unit of its principal number. Nothing on the bus is re-normalised: venue_registry is the only normaliser in this system, and these producers publish values it has already normalised.
| Channel | Unit | Venue push? | Published | What it is |
|---|---|---|---|---|
| swaps | usd_notional | no | per decoded block | DEX swaps ≥ $500 decoded from our own BSC and Avalanche nodes. |
| liquidations | usd_notional | yes | ~2 s sweep | Forced liquidations exactly as five CEX venues pushed them. |
| funding | rate per venue interval and 8h-normalised | no | 60 s, change-only | Per-instrument funding, whenever the rate actually moved. |
| whales | usd_notional | no | 5 s, cursor-based | Large multi-chain wallet events. |
| signals | dimensionless_confidence | no | 10 s | Rows appended to our own signal log. |
| orderbook | usd_notional_depth | no | 30 s, rotating symbol | Cross-venue book depth for a small rotating symbol set. |
| fills | base_size + usd | no | 10 s | Tracked-wallet fills from the Hyperliquid research capture. |
What each channel does not include
A stream is as much defined by its gaps as by its contents, and a gap you were not told about is one you will average over and publish as market data. So:
| Channel | Not in it |
|---|---|
| swaps | No CEX trades, and no chain other than BSC and Avalanche — nothing from Ethereum, Solana, Base, Arbitrum, Optimism or Polygon reaches this channel. It is decoded from our own node logs, so is_venue_push is false; it is not an exchange push socket. Swaps under $500 never enter the bus, so their absence is a filter, not a quiet market. |
| liquidations | The five CEX force-order sockets only. Hyperliquid is not in it — its liquidations are served separately from /v1/hl/liquidations* — and neither are on-chain DeFi liquidations (/v1/liquidations/onchain). The price is not one basis across venues: only Binance publishes an execution price; the others publish a bankruptcy or liquidation-order price, and a large share of those fall outside their own minute’s traded range. Treat the five as five measurements, not one tape. The first sweep after the producer starts is dropped, so a warm buffer is never replayed to you as fresh liquidations. |
| funding | No heartbeat — an unchanged rate is not re-emitted, because a channel that re-sends the same number every tick is a clock, not a signal, and it would spend your frame allowance for nothing. And nothing here guesses an interval: an instrument whose settlement interval cannot be read carries interval_hours: "MISSING" and funding_8h: null, never a defaulted 8h. |
| whales | Poll-derived from chain indexers, not a venue push. The first pass is not replayed, so the last hour does not arrive as though it just happened. |
| signals | A claim about our own engine’s state, never a venue observation, and never a claim of predictive power. Read the pre-registered studies on the performance page before treating one as an entry. |
| orderbook | Not a full L2 book and not a venue push — REST snapshots aggregated across venues, for a rotating symbol set only. A venue whose book does not span the requested band is reported MISSING and is never counted as zero depth. |
| fills | Hyperliquid only, and every frame carries is_live_production_feed: false. It is a research capture, not a production venue feed, and its rows are not the same rows as /v1/whales/events. |
Channel state is three-way
An unwired channel is never rendered as “0 events”. /v1/ws/channels and the socket’s hello frame report each channel as one of:
| state | Meaning |
|---|---|
| no_producer | This process publishes nothing on that channel. Not a claim that nothing is happening. |
| idle | A producer is wired and running; nothing has been published recently. |
| live | A producer is wired and publishing. |
Per-plan allowance
| Plan | Channels | Concurrent sockets | Connection time / day | Frames / day | Tickets / day |
|---|---|---|---|---|---|
| Free | |||||
| Trader | |||||
| Pro | |||||
| Enterprise |
Every figure in this table is read at page load from plans.json — the same manifest the gateway enforces at request time — through the generated plans.js. Nothing here is typed into the page. If a cell renders blank, the manifest could not be read: that is a failure, not an offer. The live values are also on /v1/plans and /v1/ws/channels, and they arrive on your own ticket and hello frame — prefer those to any table.
These are derived, not picked. Frames/day is the plan’s daily REST call budget × 100 — a streamed frame costs roughly a hundredth of a REST call, because there is no per-call key validation and no per-call rate-limit round trip, and one socket is amortised over many frames. Concurrent sockets is the plan’s per-minute burst ÷ 10, floored at one. Connection time per day is concurrent sockets × 24 h on the paid plans: you may hold every socket you are entitled to open for the whole day. Free is the deliberate exception — its connection-time figure is a test allowance, enough to point a client at the socket and watch it work, not enough to run a bot off it. The derivation itself is test-enforced.
Refusals
The socket closes itself with a JSON reason rather than going silent, because a silent socket is indistinguishable from a dead feed.
| Status / frame | reason | Meaning |
|---|---|---|
| 402 | websocket_not_on_plan | The plan carries no WebSocket at all. |
| 402 | channel_not_on_plan | The channel exists; your plan does not include it. available lists what you may open. |
| 409 | channel_has_no_producer | On your plan, but this process is not publishing it. Stated as our gap, not as an empty market. |
| 429 | max_connections | You already hold the maximum concurrent sockets for the plan. |
| 429 | daily_seconds | Daily connection time spent. |
| 429 | messages_per_day | Daily frame allowance spent. An open socket gets a quota_exhausted frame first, then closes. |
| 429 | tickets_per_day | Daily ticket allowance spent, charged at mint. |
GET /v1/stream/public-swaps — requires a free key
This SSE stream used to answer any caller successfully — keyless, unmetered and uncapped — carrying the same swap events as the paid socket. It now requires a credential. A free account key is enough, so nothing here is behind a paywall; what changed is that the anonymous visitor no longer gets a better deal than the customer.
With a credential — a ?ticket=, an X-API-Key header or a bearer token — it is charged against your plan’s streaming allowance exactly like a socket: admission, per-frame, connection seconds, release. Streaming does not become free because the transport is SSE.
Without a credential it now returns 401. Create a free account, generate a key, and use it as an X-API-Key header, a bearer token, or a ?ticket=. The free tier covers this stream.
429s, usage attributed to your account, and a path that is not on a deprecation clock.es.addEventListener("swap", e => {
const swap = JSON.parse(e.data);
console.log(swap.chain, swap.pair, swap.amount_usd);
});
REST snapshot
Returns the last N broadcast swaps from the rolling buffer. Useful for first paint on a dashboard before the stream connection opens. Also available: /v1/live-swaps/status for broadcaster stats.
Swap event schema
| Field | Type | Description |
|---|---|---|
| chain | string | bsc or avalanche — those two and no others |
| dex | string | Router name (e.g. pancakeswap_v2, traderjoe) or unknown_dex |
| swapper | string | Full 0x address of the wallet that executed the swap |
| swapper_short | string | Abbreviated form for display (e.g. 0xb300…028d) |
| swapper_url | string | Direct link to the swapper on the chain's block explorer |
| tx_hash | string | Transaction hash |
| explorer_url | string | Direct link to the transaction on BscScan / Snowtrace |
| token_in | string | Symbol of the token sold (e.g. USDT) |
| token_out | string | Symbol of the token bought |
| amount_usd | number | USD value of the swap (minimum: $500 — below that it never enters the bus) |
| pair | string | Formatted pair label (e.g. USDT → USDC) |
| block | number | Block number where the swap was mined |
| timestamp | number | Unix epoch seconds |
| significance | string | low / medium / high / critical based on USD size |
| seq | number | Monotonic broadcast sequence number — use for gap detection |
Venue coverage — eleven instrument tables, and what is not in them
There is exactly one unit-normalisation layer in this system. Every contract multiplier it applies is sourced from the venue’s own instruments endpoint and is carried on the result together with the exact field it came from, so any normalised figure traces back to (raw value, multiplier, source).
Two production defects are why it exists. OKX sz is always contracts, never base coin — reading BTC-USDT-SWAP size as BTC overstated it 100×, and gold 1000×. A BitMEX inverse volume is contracts where one contract is one US dollar, which read as coin was roughly 78,000× off the venue’s own homeNotional. Neither venue did anything wrong: we read a documented field under an undocumented assumption.
Three rules follow, and they are what you are relying on whenever you read a cross-venue number from this API:
- A venue whose metadata cannot be read yields MISSING for that instrument — never a guessed multiplier, never a default, never zero. Missing is honest; a wrong multiplier is a fabricated measurement.
- An aggregate is the sum of normalised values only, and always states which venues contributed and which were missing. An aggregate that hides a missing venue is a lie about coverage, not a rounding error.
- Nothing guesses a funding interval. It is read per instrument or it is MISSING — a large share of Bybit and Bitget perpetuals settle every 4h, and assuming 8h publishes exactly half the true APR for those instruments.
Eleven requests are made, producing eleven tables (Binance is read twice, because USDⓒ-M and COIN-M are separate APIs), plus two further tables derived from Deribit’s single payload at no extra request.
| Table | Venue | What we request | What we deliberately do not request |
|---|---|---|---|
| binance | Binance USDⓈ-M | usdt-m/usdc-m futures (perpetual + dated) | options (eapi.binance.com is a separate API) |
| binance_coinm | Binance COIN-M | coin-m futures (perpetual + dated) | nothing — this table is exhaustive |
| bybit | Bybit | linear perpetual/futures; inverse perpetual/futures | options (category=option not requested); spot (category=spot not requested) |
| hyperliquid | Hyperliquid | perp universe (info type=meta) | spot (info type=spotMeta not requested; HL spot lists tokenised gold XAUT0/XAUM) |
| okx | OKX | swaps (instType=SWAP) | dated futures (instType=FUTURES not requested); options (instType=OPTION not requested); spot (instType=SPOT not requested) |
| bitget | Bitget | USDT-FUTURES; COIN-FUTURES; USDC-FUTURES | spot (spot API not requested) |
| bitmex | BitMEX | all active instruments | nothing — this table is exhaustive |
| kucoin | KuCoin | all active futures contracts | nothing — this table is exhaustive |
| mexc | MEXC | all futures contract details | nothing — this table is exhaustive |
| kraken | Kraken | all derivatives instruments | nothing — this table is exhaustive |
| deribit | Deribit | perpetual futures (all 50 currencies) | nothing — this table is exhaustive |
| deribit_dated | Deribit — dated futures | expiring futures day/week/month | derived from the same deribit payload — no extra request |
| deribit_option | Deribit — options | all option series (all currencies) | derived from the same deribit payload — no extra request |
Declared and excluded, so their absence is never mistaken for a venue that lists nothing:
| Venue | Why it is out | Detail |
|---|---|---|
| gate | read failed | api.gateio.ws unreachable from this host: TLS chain verification failed (python ssl and curl both). No sampled payload, so no fixture and no verified multiplier. |
| pionex | read fine — nothing to aggregate | No public derivatives API. /api/v1/common/symbols returned 407 instruments, ALL type=SPOT, zero perpetual/futures (sampled 2026-08-29). Excluded because it has nothing to aggregate, not because it could not be read. |
The “what we do not request” column is the important one. absence_is_conclusive on /v1/symbols/universe/coverage is false for exactly those product lines: a symbol missing there is our fetch gap, not the venue’s answer. Before this distinction existed, every Deribit option and every Bitget COIN-M symbol was reported as “not listed” by a venue that lists it.
/v1/symbols/universe/coverage for the count as of now — and note that an unreadable universe answers total_live: null, never 0.Symbol universe
The listing lifecycle across every venue we read. Its whole purpose is to separate “this venue does not list that symbol” from “we never asked that venue for that product line” — different facts, and only the first one is about the venue.
| Endpoint | Plan | What it returns |
|---|---|---|
| GET /v1/symbols/universe | Free sample Paid full | Live symbols. Optional ?venue=, ?limit=. |
| GET /v1/symbols/universe/asset | Free sample Paid full | One asset across every venue — live and delisted — with its scale variants. ?asset=BTC. |
| GET /v1/symbols/universe/coverage | Trader+ | Per venue: what we requested, what we did not, and whether absence is conclusive. |
| GET /v1/symbols/universe/venue | Trader+ | One venue’s table. Add ?symbol= for the three-way why_absent. |
Three properties worth knowing before you build on it:
An empty universe explains itself. If no venue table could be read, total_live is null and universe_state.meaning says the count is unknown. It is never rendered as 0. A genuine zero — every venue readable, none listing a match — says so in the same field, and that zero is a measurement.
Scaled tickers are linked, never merged. 1000PEPE and KPEPE are connected to PEPE as scale_variants with the multiplier stated. No venue publishes that multiplier as a field, so the link is derived — and is labelled as derived. Merging them would silently add two different instruments together.
Delisted symbols are kept in history and are never returned by /v1/symbols/universe. Query /v1/symbols/universe/asset for them.
Free responses are a sample, and say so: the payload carries what was returned, what the total was, and why it was truncated. It is never presented as the whole set.
Metals — gold and silver
Gold and silver are carried as first-class symbols, XAU and XAG, and both are reachable by name on a free key — the free symbol list is BTC, ETH, SOL, XAU, XAG. They flow through the same derivatives path as every crypto symbol: screener, confirm, heatmap, snapshot.
XAU here is not spot XAU/USD and it is not an FX pair. It is a USDT-margined perpetual listed on crypto venues whose index tracks spot gold. It pays funding, it trades a basis to the metal, and it can hold a persistent premium or discount. The same applies to XAG. Every non-crypto underlying carries an instrument block in the screener row saying exactly this; the block’s absence means “an ordinary crypto perp”, not “unlabelled”.Two further names exist and are deliberately kept apart from these. XAUT and PAXG are perpetuals on tokenised gold — they carry issuer and redemption risk on top of the metal, and they are labelled asset_class: "tokenised_metal" rather than "metal". The symbol-universe layer will never alias PAXG, XAUT or XAUM onto XAU: tokenised gold is not the gold index, and merging them would silently blend two different risks into one series.
Funding on the real settlement clock
Gold and silver settle funding every four hours on both venues that carry them — not eight. This used to matter a great deal and be invisible: annualised funding was computed as rate × 3 × 365, i.e. “8-hourly, always”, which published half the true APR for every 4h instrument. It was not a metals-only defect — measured on 2026-08-29, 424 of 703 Binance USDT perpetuals settle on a 4h clock, so the majority of the table was wrong, gold and silver included.
The settlement interval is a property of the instrument, not the venue, and both venues publish it per instrument. Every row that carries an annualised funding figure now also carries the interval that produced it, so you can check the arithmetic rather than trust it:
| Field | Meaning |
|---|---|
funding_rate | The rate as the venue publishes it, for its own interval. Never rescaled. |
funding_interval_hours | The instrument’s real settlement interval, read from the venue. 4 for XAU and XAG. |
funding_interval_basis | Where that interval came from — or, when the figure is null, why it is null. |
funding_annualized | Annualised on the interval above. Nullable. |
asset_class | metal for XAU/XAG, tokenised_metal for XAUT/PAXG, and so on. |
funding_annualized is an average across venues. When the venues carrying a symbol settle on different clocks, that average is on no period at all and cannot honestly be annualised — so the field is null and funding_interval_basis says why. It is never 0% and never a defaulted 8h. Do not write ?? 0 or || 8 over these fields; you would be inventing the number the whole mechanism exists to avoid.History depth, and what a historical row does not yet tell you
Metals history was extended from under a day to roughly thirty days by replaying funding, open interest, long/short, taker flow and price from the venues’ own REST endpoints. Thirty days is a venue ceiling, not a setting on our side — Binance does not serve its /futures/data/* series further back than that, so no amount of re-running deepens it. From here the span grows by observation, one day per day.
Those replayed rows are stored separately from observed ones and are labelled backfilled against observed, with a database constraint that makes it structurally impossible to write a replayed row under the “observed” label. Where both exist for one timestamp, the observed row wins. Two columns are deliberately empty on the Bybit side of the backfill rather than filled: that venue’s account-ratio is a headcount across all accounts, and pouring it into a position-weighted top-trader column would be a different statistic wearing the column’s name.
/v1/historical/* family does not serve the metals backfill at all: /v1/historical/funding?symbol=XAU answers count: 0 (checked against the running API on 2026-08-30), because that family is fed by a separate crypto-only upstream. So today: live gold and silver are available from the derivatives endpoints, and the thirty-day series is not. The wiring that will expose it targets /v1/data/history and is designed to refuse rather than serve an unlabelled row — depth without the label is a regression, not a feature, because a CSV already on someone’s disk cannot be corrected later. It is not deployed at the time of writing, so do not build against it yet; this note gets replaced by the field when it ships, not quietly deleted. Until then, treat any metals history you assemble yourself as unlabelled.GET /v1/cot/*
CFTC Commitment of Traders positioning — the regulator’s own weekly census of who holds the futures, which is the one positioning series in this API that does not come from an exchange API at all. Four public endpoints:
| Endpoint | Returns |
|---|---|
GET /v1/cot/summary | Latest report for one market: open interest, net long, week-on-week change, and every trader bucket. ?symbol= |
GET /v1/cot/history | The weekly series. ?symbol=, ?weeks= |
GET /v1/cot/trend | Direction of the speculative bucket over recent reports. ?symbol= |
GET /v1/cot/comparison | All covered markets side by side. No parameters. |
The bucket names depend on the symbol, and you must not hardcode them. The CFTC publishes different market families in different reports, and this API does not flatten that difference away, because flattening it would mean relabelling one category as another:
| Symbols | report_family | Buckets in categories |
|---|---|---|
XAU (Gold, COMEX, 100 troy oz)XAG (Silver, COMEX, 5,000 troy oz) | disaggregatedDisaggregated Commitments of Traders | producer_merchant, swap_dealers, managed_money, other_reportables, nonreportable |
BTC, ETH (CME) | tffTraders in Financial Futures | The TFF buckets — a different set. Read report_family and speculator_category from the response rather than assuming. |
For the metals, the speculative bucket is managed_money, and the response says so in speculator_category rather than leaving you to infer it. Each bucket carries long, short, net, a human label, and — except for the nonreportable bucket, where the CFTC does not publish it — spreading. Spreading is a real component of open interest and is reported separately rather than being folded into either side.
as_of block: the snapshot date, a human label for it, the release date, is_live and is_stale. Points inside trend_4w carry their own. Do not render a COT figure beside a live price without also rendering its as-of date — it is the one number on the page that is deliberately days old.Research capture
is_live_production_feed: false. A wallet fill here is not a /v1/whales/events row and does not have the same coverage. It is collected research data from one venue — Hyperliquid.| Endpoint | Plan | What it returns |
|---|---|---|
| GET /v1/research/coverage | Trader+ | Which tables exist and their status per shard. ?counts=1 for row counts. |
| GET /v1/research/symbols | Free sample Paid full | Symbols present in a table. ?table=. |
| GET /v1/research/query | Free, small cap Paid, larger cap | Rows. Filters: coin, wallet, interval, order, start_ms, end_ms, limit. |
| GET /v1/research/disk | Trader+ | Storage report. Paid only. |
Timestamps are epoch milliseconds, everywhere, verified against every shard. A table reported empty exists in the schema and has no rows in any shard — that is not the same as a table we could not read: a shard that cannot be opened is reported in unreadable_shards with its reason, and its rows are never counted as zero.
Reads run on the research store’s own worker pool rather than the shared executor, so a slow shard scan cannot starve the rest of the gateway. A read that is refused or fails answers 503, never 502 or 504.
POST /alerts/conditions
Create custom alert rules that trigger when a specified metric crosses a threshold. Alerts are delivered via webhook, email, or the dashboard notification feed depending on your preferences.
Returns a list of all your configured alert conditions with their IDs, definitions, and current status.
Permanently removes an alert condition by its ID.
Returns recent alert trigger events with timestamps, matched conditions, and the metric value at the time of trigger.
Create Alert — Request Body
| Field | Type | Description |
|---|---|---|
| namerequired | string | Human-readable label for this alert (max 64 chars) |
| metricrequired | string | The metric to monitor. See available metrics table below. |
| symboloptional | string | Asset context. Required for symbol-scoped metrics such as funding_rate. |
| operatorrequired | string | Comparison operator: gt, lt, eq, crosses_above, crosses_below |
| thresholdrequired | float | Numeric value to compare the metric against |
| deliveryoptional | string | Delivery channel, e.g. telegram (default) or webhook |
| cooldown_minutesoptional | integer | Minimum minutes between re-triggers (default 60) |
The live list of valid metrics and operators is returned by GET /v1/alerts/conditions as available_metrics and available_operators.
Available Metrics
| Metric | Description |
|---|---|
| funding_rate | Current funding rate for symbol (as decimal) |
| global_lsr | Global long/short ratio for symbol |
| long_pct | Percentage of accounts net long for symbol |
| top_trader_lsr | Top-trader long/short ratio for symbol |
| taker_ratio | Taker buy/sell ratio for symbol |
| mvrv | Market Value to Realized Value ratio (BTC/ETH) |
| sopr | Spent Output Profit Ratio (BTC/ETH) |
| exchange_net_flow | On-chain exchange net-flow signal |
| accumulation | On-chain accumulation signal |
| whale_long_pct | Percentage of tracked whale wallets holding long positions for symbol |
| whale_n_wallets | Number of tracked whale wallets with a position in symbol |
| composite_long | Composite score for symbol queried in long direction |
| composite_short | Composite score for symbol queried in short direction |
| funding_spread | Cross-venue funding spread for symbol |
"name": "BTC funding rate spike",
"metric": "funding_rate",
"symbol": "BTC",
"operator": "gt",
"threshold": 0.05
}
GET /kelly
Returns Kelly Criterion position sizing recommendations calibrated to historical signal performance for the given symbol, confidence level, and direction. Grounds position size in empirical win rates to avoid over-leveraging.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symbolrequired | string | Asset symbol: BTC, ETH, or SOL |
| confidenceoptional | string | Signal confidence level to model: HIGH, MEDIUM, or LOW. Default: HIGH |
| directionoptional | string | Trade direction: long or short. Default: long |
| account_sizeoptional | float | Account size in USD for computing suggested_size_usd. Default: 10000 |
This section previously carried a hand-written example response printing half_kelly and avg_reward_risk_ratio, neither of which exists. The real payload is method, win_rate, avg_rr, kelly_fraction, half_kelly_fraction, suggested_size_usd, suggested_pct_of_account, samples — and nothing else: no symbol, no direction, no confidence echo. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
GET /performance
Returns historical accuracy statistics for signals issued by the API, broken down by confidence level. Useful for understanding signal reliability before committing capital.
Parameters
| Parameter | Type | Description |
|---|---|---|
| symboloptional | string | Filter by asset. Omit for aggregate statistics across all symbols. |
| daysoptional | integer | Look-back window in days. Default: 30 |
Example Response
Captured from the running API on 2026-08-28 (GET /v1/performance?symbol=BTC&days=30); 14 of the 16 symbols in by_symbol are elided. The buckets count correct / incorrect / neutral, not a win rate. Values move; the field names and the nesting are what this documents.
"period_days": 30,
"total_signals": 217,
"by_confidence": {
"MEDIUM": { "correct": 40, "incorrect": 36, "neutral": 94, "total": 172, "accuracy": 0.5263, "resolved": 76, "low_sample": false },
"HIGH": { "correct": 9, "incorrect": 16, "neutral": 20, "total": 45, "accuracy": 0.36, "resolved": 25, "low_sample": false }
},
"by_symbol": {
"STX": { "correct": 8, "incorrect": 13, "neutral": 4, "total": 27, "veto_count": 0, "total_all": 27, "accuracy": 0.381, "resolved": 21, "low_sample": false },
"WIF": { "correct": 4, "incorrect": 2, "neutral": 1, "total": 7, "veto_count": 0, "total_all": 7, "accuracy": 0.6667, "resolved": 6, "low_sample": true }
},
"veto_by_symbol": {},
"overall_accuracy": 0.4851,
"overall_resolved": 101,
"min_resolved_sample": 10,
"recent_signals": [ { "id": "st_8353", "ts": 1787894362, "symbol": "STX", "direction": "long", "type_label": "Confirmation (Type 1)", "context_only": false, "context_note": null, "confidence": "MEDIUM", "composite": 0.0, "price_at_signal": 0.2629, "price_after_1h": null, "price_after_4h": null, "price_after_12h": null, "price_after_24h": null, "outcome_1h": null, "outcome_4h": null, "outcome_12h": null, "outcome_24h": null, "signal_type": "smart_money_confirm" }, … ],
"signal_counts": {
"24h": 14,
"7d": 54,
"30d": 217,
"all": 1211
},
"windows": {
"1h": { "correct": 60, "incorrect": 52, "neutral": 104, "total": 216, "accuracy": 0.5357, "resolved": 112, "low_sample": false },
"4h": { "correct": 49, "incorrect": 52, "neutral": 114, "total": 215, "accuracy": 0.4851, "resolved": 101, "low_sample": false },
"12h": { "correct": 35, "incorrect": 43, "neutral": 122, "total": 200, "accuracy": 0.4487, "resolved": 78, "low_sample": false },
"24h": { "correct": 32, "incorrect": 49, "neutral": 99, "total": 180, "accuracy": 0.3951, "resolved": 81, "low_sample": false }
},
"symbol_timeseries": {
"1h": { "STX": [ { "date": "2026-08-25 09:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 04:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 11:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 14:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 17:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 18:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 19:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 20:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 21:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 22:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 23:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-27 04:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 09:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 10:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 11:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-27 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-27 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-27 18:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 19:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 23:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-28 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-28 02:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "WIF": [ { "date": "2026-08-24 08:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-24 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 20:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 22:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 23:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-27 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "ATOM": [ { "date": "2026-07-30 19:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-07-31 08:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-01 05:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-03 18:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-04 11:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-07 01:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 23:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 04:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 08:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 09:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 14:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 17:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 19:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 22:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 08:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 11:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 13:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 14:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 15:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 17:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-17 18:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 19:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-17 21:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 05:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 11:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 13:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 14:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 15:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 18:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 19:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 10:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-19 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 17:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 19:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-20 01:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-20 02:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-24 06:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-27 09:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "UNI": [ { "date": "2026-08-03 22:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-20 01:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-27 06:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "LINK": [ { "date": "2026-08-16 14:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 17:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 21:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 22:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 05:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 09:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 14:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-19 09:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-24 06:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 20:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 22:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 23:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "AAVE": [ { "date": "2026-08-24 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25 13:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25 14:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25 17:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 23:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "SEI": [ { "date": "2026-08-26 23:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "BTC": [ { "date": "2026-08-18 19:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 13:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-19 19:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 22:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 22:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "TIA": [ { "date": "2026-08-15 23:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 15:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 17:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 10:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 22:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 05:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 13:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 19:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-24 06:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "OP": [ { "date": "2026-08-15 23:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 01:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 03:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 07:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 14:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 17:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 10:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 21:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-24 06:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "INJ": [ { "date": "2026-08-01 08:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-02 09:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03 14:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03 17:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-06 07:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-06 08:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-06 09:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-06 23:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-11 18:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-14 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 23:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 01:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 02:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 03:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 04:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 05:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 06:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 07:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 08:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 09:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 10:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 11:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 13:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 14:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 15:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 08:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 11:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 09:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 18:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 01:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 18:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 19:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 21:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-20 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-20 01:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "NEAR": [ { "date": "2026-08-20 01:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "ADA": [ { "date": "2026-08-11 23:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-12 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-12 03:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-13 00:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-15 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 21:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 07:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 09:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 17:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 19:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-17 17:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-17 18:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 04:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 07:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 11:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 14:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "ARB": [ { "date": "2026-08-17 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-17 05:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 06:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 18:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 19:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 14:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 01:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 07:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "RENDER": [ { "date": "2026-08-16 01:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 19:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "BNB": [ { "date": "2026-08-03 22:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ] },
"4h": { "STX": [ { "date": "2026-08-25 08:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 04:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 12:00", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 16:00", "correct": 1, "incorrect": 3, "neutral": 0, "accuracy": 0.25 }, { "date": "2026-08-26 20:00", "correct": 0, "incorrect": 3, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-27 00:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-27 08:00", "correct": 1, "incorrect": 1, "neutral": 1, "accuracy": 0.5 }, { "date": "2026-08-27 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-27 16:00", "correct": 0, "incorrect": 3, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 20:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-28 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "WIF": [ { "date": "2026-08-24 08:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-24 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 20:00", "correct": 3, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-27 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "ATOM": [ { "date": "2026-07-30 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-07-31 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-01 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03 16:00", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-04 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-07 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 08:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 16:00", "correct": 0, "incorrect": 2, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-16 20:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-17 08:00", "correct": 0, "incorrect": 2, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 2, "neutral": 2, "accuracy": 0.0 }, { "date": "2026-08-17 16:00", "correct": 1, "incorrect": 0, "neutral": 3, "accuracy": 1.0 }, { "date": "2026-08-17 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 04:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 08:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 12:00", "correct": 4, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 16:00", "correct": 1, "incorrect": 1, "neutral": 1, "accuracy": 0.5 }, { "date": "2026-08-19 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 16:00", "correct": 3, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-20 00:00", "correct": 0, "incorrect": 2, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-24 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-27 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "UNI": [ { "date": "2026-08-03 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-20 00:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 04:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "LINK": [ { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 16:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-16 20:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-17 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 04:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-18 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-24 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 20:00", "correct": 1, "incorrect": 0, "neutral": 2, "accuracy": 1.0 } ], "AAVE": [ { "date": "2026-08-24 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25 12:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-25 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 20:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 } ], "SEI": [ { "date": "2026-08-26 20:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "BTC": [ { "date": "2026-08-18 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 16:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-19 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "TIA": [ { "date": "2026-08-15 20:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 20:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-18 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 16:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-19 08:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-24 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "OP": [ { "date": "2026-08-15 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-16 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-16 16:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 08:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-24 04:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "INJ": [ { "date": "2026-08-01 08:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-02 08:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-06 04:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-06 08:00", "correct": 0, "incorrect": 2, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-06 20:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-11 16:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-14 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 1, "neutral": 3, "accuracy": 0.0 }, { "date": "2026-08-16 04:00", "correct": 0, "incorrect": 4, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 08:00", "correct": 0, "incorrect": 0, "neutral": 4, "accuracy": null }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 4, "accuracy": null }, { "date": "2026-08-17 08:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-17 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 04:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 08:00", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 16:00", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 20:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-20 00:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 } ], "NEAR": [ { "date": "2026-08-20 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "ADA": [ { "date": "2026-08-11 20:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-12 00:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-13 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 20:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-16 04:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-16 08:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-16 16:00", "correct": 1, "incorrect": 0, "neutral": 2, "accuracy": 1.0 }, { "date": "2026-08-17 16:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-18 04:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-18 08:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-18 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "ARB": [ { "date": "2026-08-17 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-17 04:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-17 16:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 04:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "RENDER": [ { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 16:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "BNB": [ { "date": "2026-08-03 20:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ] },
"12h": { "STX": [ { "date": "2026-08-25 00:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26 00:00", "correct": 1, "incorrect": 1, "neutral": 1, "accuracy": 0.5 }, { "date": "2026-08-26 12:00", "correct": 0, "incorrect": 9, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-27 00:00", "correct": 0, "incorrect": 2, "neutral": 3, "accuracy": 0.0 }, { "date": "2026-08-27 12:00", "correct": 1, "incorrect": 0, "neutral": 2, "accuracy": 1.0 } ], "WIF": [ { "date": "2026-08-24 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-24 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-26 12:00", "correct": 2, "incorrect": 0, "neutral": 2, "accuracy": 1.0 }, { "date": "2026-08-27 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "ATOM": [ { "date": "2026-07-30 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-07-31 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-01 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03 12:00", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-04 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-07 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 1, "neutral": 3, "accuracy": 0.0 }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 1, "neutral": 5, "accuracy": 0.0 }, { "date": "2026-08-17 00:00", "correct": 0, "incorrect": 2, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 2, "neutral": 7, "accuracy": 0.0 }, { "date": "2026-08-18 00:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 2, "incorrect": 1, "neutral": 4, "accuracy": 0.6667 }, { "date": "2026-08-19 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 12:00", "correct": 3, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-24 00:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "UNI": [ { "date": "2026-08-03 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-27 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "LINK": [ { "date": "2026-08-16 12:00", "correct": 2, "incorrect": 0, "neutral": 3, "accuracy": 1.0 }, { "date": "2026-08-17 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18 00:00", "correct": 0, "incorrect": 0, "neutral": 3, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-19 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-24 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 12:00", "correct": 3, "incorrect": 0, "neutral": 1, "accuracy": 1.0 } ], "AAVE": [ { "date": "2026-08-24 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-25 12:00", "correct": 0, "incorrect": 0, "neutral": 3, "accuracy": null }, { "date": "2026-08-26 12:00", "correct": 1, "incorrect": 0, "neutral": 2, "accuracy": 1.0 } ], "SEI": [ { "date": "2026-08-26 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "BTC": [ { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 12:00", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-26 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "TIA": [ { "date": "2026-08-15 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 2, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-17 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 1, "neutral": 2, "accuracy": 0.0 }, { "date": "2026-08-18 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 3, "accuracy": null }, { "date": "2026-08-19 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-24 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-26 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "OP": [ { "date": "2026-08-15 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 0, "neutral": 3, "accuracy": null }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 1, "neutral": 2, "accuracy": 0.0 }, { "date": "2026-08-17 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-18 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-24 00:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "INJ": [ { "date": "2026-08-01 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-02 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-03 12:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-06 00:00", "correct": 0, "incorrect": 3, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-06 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-11 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-14 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 12:00", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 4, "neutral": 8, "accuracy": 0.0 }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 4, "accuracy": null }, { "date": "2026-08-17 00:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-18 00:00", "correct": 0, "incorrect": 0, "neutral": 3, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 00:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-19 12:00", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "ADA": [ { "date": "2026-08-11 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-12 00:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-13 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15 12:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 0, "neutral": 4, "accuracy": null }, { "date": "2026-08-16 12:00", "correct": 0, "incorrect": 0, "neutral": 3, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-18 00:00", "correct": 0, "incorrect": 0, "neutral": 4, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-19 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "ARB": [ { "date": "2026-08-17 00:00", "correct": 1, "incorrect": 0, "neutral": 2, "accuracy": 1.0 }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-18 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19 00:00", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "RENDER": [ { "date": "2026-08-16 00:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "BNB": [ { "date": "2026-08-03 12:00", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ] },
"daily": { "STX": [ { "date": "2026-08-25", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-26", "correct": 4, "incorrect": 7, "neutral": 2, "accuracy": 0.3636 }, { "date": "2026-08-27", "correct": 3, "incorrect": 5, "neutral": 2, "accuracy": 0.375 }, { "date": "2026-08-28", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 } ], "WIF": [ { "date": "2026-08-24", "correct": 1, "incorrect": 1, "neutral": 0, "accuracy": 0.5 }, { "date": "2026-08-25", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-26", "correct": 3, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-27", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "ATOM": [ { "date": "2026-07-30", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-07-31", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-01", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-02", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-03", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-04", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-05", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-06", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-07", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-08", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-09", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-10", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-11", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-12", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-13", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-14", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-15", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16", "correct": 0, "incorrect": 3, "neutral": 7, "accuracy": 0.0 }, { "date": "2026-08-17", "correct": 1, "incorrect": 4, "neutral": 6, "accuracy": 0.2 }, { "date": "2026-08-18", "correct": 6, "incorrect": 2, "neutral": 1, "accuracy": 0.75 }, { "date": "2026-08-19", "correct": 4, "incorrect": 0, "neutral": 1, "accuracy": 1.0 }, { "date": "2026-08-20", "correct": 0, "incorrect": 2, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-21", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-22", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-23", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-24", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-26", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-27", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "UNI": [ { "date": "2026-08-03", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-04", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-05", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-06", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-07", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-08", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-09", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-10", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-11", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-12", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-13", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-14", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-15", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-16", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-17", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-18", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-19", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-20", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-21", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-22", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-23", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-24", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-25", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-26", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-27", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "LINK": [ { "date": "2026-08-16", "correct": 2, "incorrect": 0, "neutral": 3, "accuracy": 1.0 }, { "date": "2026-08-17", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-18", "correct": 0, "incorrect": 0, "neutral": 5, "accuracy": null }, { "date": "2026-08-19", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-20", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-21", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-22", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-23", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-24", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-26", "correct": 1, "incorrect": 0, "neutral": 3, "accuracy": 1.0 } ], "AAVE": [ { "date": "2026-08-24", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25", "correct": 0, "incorrect": 2, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-26", "correct": 1, "incorrect": 0, "neutral": 2, "accuracy": 1.0 } ], "SEI": [ { "date": "2026-08-26", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "BTC": [ { "date": "2026-08-18", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19", "correct": 2, "incorrect": 0, "neutral": 2, "accuracy": 1.0 }, { "date": "2026-08-20", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-21", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-22", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-23", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-24", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-25", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-26", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "TIA": [ { "date": "2026-08-15", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-16", "correct": 0, "incorrect": 1, "neutral": 2, "accuracy": 0.0 }, { "date": "2026-08-17", "correct": 0, "incorrect": 1, "neutral": 3, "accuracy": 0.0 }, { "date": "2026-08-18", "correct": 0, "incorrect": 1, "neutral": 3, "accuracy": 0.0 }, { "date": "2026-08-19", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-20", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-21", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-22", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-23", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-24", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-25", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-26", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "OP": [ { "date": "2026-08-15", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16", "correct": 0, "incorrect": 2, "neutral": 4, "accuracy": 0.0 }, { "date": "2026-08-17", "correct": 0, "incorrect": 1, "neutral": 2, "accuracy": 0.0 }, { "date": "2026-08-18", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-20", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-21", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-22", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-23", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-24", "correct": 0, "incorrect": 1, "neutral": 0, "accuracy": 0.0 } ], "INJ": [ { "date": "2026-08-01", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-02", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-03", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-04", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-05", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-06", "correct": 0, "incorrect": 4, "neutral": 0, "accuracy": 0.0 }, { "date": "2026-08-07", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-08", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-09", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-10", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-11", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-12", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-13", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-14", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-15", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-16", "correct": 0, "incorrect": 5, "neutral": 11, "accuracy": 0.0 }, { "date": "2026-08-17", "correct": 1, "incorrect": 1, "neutral": 1, "accuracy": 0.5 }, { "date": "2026-08-18", "correct": 2, "incorrect": 0, "neutral": 2, "accuracy": 1.0 }, { "date": "2026-08-19", "correct": 3, "incorrect": 0, "neutral": 2, "accuracy": 1.0 }, { "date": "2026-08-20", "correct": 1, "incorrect": 0, "neutral": 1, "accuracy": 1.0 } ], "NEAR": [ { "date": "2026-08-20", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "ADA": [ { "date": "2026-08-11", "correct": 1, "incorrect": 0, "neutral": 0, "accuracy": 1.0 }, { "date": "2026-08-12", "correct": 0, "incorrect": 1, "neutral": 1, "accuracy": 0.0 }, { "date": "2026-08-13", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-14", "correct": 0, "incorrect": 0, "neutral": 0, "accuracy": null }, { "date": "2026-08-15", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-16", "correct": 1, "incorrect": 0, "neutral": 6, "accuracy": 1.0 }, { "date": "2026-08-17", "correct": 0, "incorrect": 0, "neutral": 2, "accuracy": null }, { "date": "2026-08-18", "correct": 1, "incorrect": 1, "neutral": 4, "accuracy": 0.5 }, { "date": "2026-08-19", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "ARB": [ { "date": "2026-08-17", "correct": 1, "incorrect": 1, "neutral": 3, "accuracy": 0.5 }, { "date": "2026-08-18", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-19", "correct": 2, "incorrect": 0, "neutral": 0, "accuracy": 1.0 } ], "RENDER": [ { "date": "2026-08-16", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null }, { "date": "2026-08-17", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ], "BNB": [ { "date": "2026-08-03", "correct": 0, "incorrect": 0, "neutral": 1, "accuracy": null } ] }
},
"whale_signals": {
"signal_type": null,
"symbol": null,
"days": 30,
"total_signals": 2970,
"horizons": { "4h": { "resolved": 2871, "hits": 1469, "hit_rate": 0.5117, "avg_move_pct": 0.0835, "avg_up_move_pct": 1.3248, "avg_down_move_pct": -1.1676 }, "12h": { "resolved": 2639, "hits": 1170, "hit_rate": 0.4433, "avg_move_pct": 0.0195, "avg_up_move_pct": 2.5902, "avg_down_move_pct": -1.8469 }, "24h": { "resolved": 2403, "hits": 1140, "hit_rate": 0.4744, "avg_move_pct": -0.1406, "avg_up_move_pct": 3.5671, "avg_down_move_pct": -2.9657 }, "48h": { "resolved": 1743, "hits": 645, "hit_rate": 0.3701, "avg_move_pct": -0.4441, "avg_up_move_pct": 4.9825, "avg_down_move_pct": -3.4558 }, "72h": { "resolved": 1189, "hits": 556, "hit_rate": 0.4676, "avg_move_pct": -0.2513, "avg_up_move_pct": 4.3481, "avg_down_move_pct": -4.7454 }, "7d": { "resolved": 1469, "hits": 1212, "hit_rate": 0.8251, "avg_move_pct": 15.7268, "avg_up_move_pct": 19.0881, "avg_down_move_pct": -9.3872 } },
"type_breakdown": [ { "signal_type": "smart_money_confirm", "count": 2468 }, { "signal_type": "regime_flip", "count": 502 } ]
}
}
Stats & Signals
GET /v1/stats
Site-wide honest performance statistics sourced from smart_money_confirm distinct-call outcomes. Returns win rates at HIGH and MEDIUM confidence tiers, overall accuracy, profit factor, and a per-symbol breakdown. All figures are in-sample over the scoring window; consult calibration.html for context and forward-holdout methodology.
Example Response
Captured from the running API on 2026-08-30 (GET /v1/stats). Values move; the field names and the nesting are what this documents. A field that could not be measured is absent from the response — it is never sent as 0, because “not measured” and “measured, and it was zero” are different claims.
"exchanges": 3,
"exchange_names": ["binance", "bybit", "hyperliquid"],
"venues_total": 6,
"venue_names_all": ["binance", "bitget", "bitmex", "bybit", "hyperliquid", "okx"],
"derivatives_symbols": 520,
"tracked_symbols": 16,
"whale_count": 959,
"winrate_horizon": "24h",
"winrate_basis": "smart_money_confirm distinct calls, fixed horizons",
"high_winrate": 0.6667,
"high_winrate_n": 18,
"medium_winrate": 0.6,
"medium_winrate_n": 90,
"overall_accuracy": 0.6111,
"overall_accuracy_n": 108,
"profit_factor": 1.26,
"expectancy_pct": 0.257,
"forward_holdout": {
"status": "live",
"horizon": "24h",
"win_rate": 0.5833,
"n": 240,
"high_win_rate": 0.5778,
"high_n": 45,
"since": 1782777600,
"is_distinct_from_insample": true
},
"signal_count": 220,
"stats_source": "live",
"last_updated": "2026-08-30T07:42:10.120571+00:00",
"basis": { … } // per-field provenance; see below
}
Two venue counts, and they are not interchangeable
This response carries two different venue numbers, and mistaking one for the other is the single easiest way to publish something false about this API. They differ because the venues behind derivatives and the venues behind the liquidation tape are not the same set.
| Field | Counts | Companion name list |
|---|---|---|
exchanges | Venues behind the derivatives data — funding, open interest, long/short, taker flow. This is the number the phrase “derivatives across N exchanges” may use, and the only one it may use. | exchange_names |
venues_total | The union, including venues we read for liquidations only. Bitget, BitMEX and OKX stream forced liquidations to us but appear nowhere in the derivatives table, so they raise this count and not the one above. | venue_names_all |
Both are measured per request, not configured: each is the set of distinct venues that actually wrote a row inside its own stream’s recency window. A venue that goes dark drops out of the count on its own, which is the point — a hardcoded list would keep counting a venue that stopped answering weeks ago. The basis object states the window used for each stream and why: derivatives is polled, so silence means broken and the window is short; liquidations are event-driven and the sparsest venue produces only a handful of events a day, so its window is a week and the count does not flicker.
venues_total of them contribute live rows to some stream, and exchanges of them contribute derivatives. None of the three is wrong; they answer different questions, and each one names its members so you never have to guess which set a count refers to.forward_holdout object is the only number accrued on data the scorer has never seen — watch it grow over time. See calibration.html for the full methodology and the in-sample / forward-test boundary.GET /v1/signals/performance
Signal outcome tracking across multiple resolution horizons (4h, 12h, 24h, 72h). Returns hit rates per horizon, total signal counts, and a breakdown by signal type.
Parameters
| Parameter | Type | Description |
|---|---|---|
| daysoptional | integer | Look-back window in days. Default: 30 |
| signal_typeoptional | string | Filter by type, e.g. smart_money_confirm or regime_flip. Omit for all types. |
| symboloptional | string | Filter by asset symbol, e.g. BTC. Omit for aggregate across all symbols. |
Example Response
Captured from the running API on 2026-08-28 (GET /v1/signals/performance, no filters). type_breakdown is an array of {signal_type, count}, not a map, and carries no hit-rate. Values move; the field names and the nesting are what this documents.
"signal_type": null,
"symbol": null,
"days": 30,
"total_signals": 2970,
"horizons": {
"4h": { "resolved": 2871, "hits": 1469, "hit_rate": 0.5117, "avg_move_pct": 0.0835, "avg_up_move_pct": 1.3248, "avg_down_move_pct": -1.1676 },
"12h": { "resolved": 2639, "hits": 1170, "hit_rate": 0.4433, "avg_move_pct": 0.0195, "avg_up_move_pct": 2.5902, "avg_down_move_pct": -1.8469 },
"24h": { "resolved": 2403, "hits": 1140, "hit_rate": 0.4744, "avg_move_pct": -0.1406, "avg_up_move_pct": 3.5671, "avg_down_move_pct": -2.9657 },
"48h": { "resolved": 1743, "hits": 645, "hit_rate": 0.3701, "avg_move_pct": -0.4441, "avg_up_move_pct": 4.9825, "avg_down_move_pct": -3.4558 },
"72h": { "resolved": 1189, "hits": 556, "hit_rate": 0.4676, "avg_move_pct": -0.2513, "avg_up_move_pct": 4.3481, "avg_down_move_pct": -4.7454 },
"7d": { "resolved": 1469, "hits": 1212, "hit_rate": 0.8251, "avg_move_pct": 15.7268, "avg_up_move_pct": 19.0881, "avg_down_move_pct": -9.3872 }
},
"type_breakdown": [
{ "signal_type": "smart_money_confirm", "count": 2468 },
{ "signal_type": "regime_flip", "count": 502 }
]
}
GET /v1/signals/recent
Feed of recently published HIGH and MEDIUM signals across all monitored symbols. Each entry includes the signal type, confidence tier, direction, and resolution status where available.
Example Response
Captured from the running API on 2026-08-28 (GET /v1/signals/recent?limit=2); the second signal is elided. Values move; the field names and the nesting are what this documents.
"signals": [ { "id": 8353, "ts": 1787894362, "signal_type": "smart_money_confirm", "type_label": "Confirmation (Type 1)", "context_only": false, "context_note": null, "symbol": "STX", "direction": "long", "price_at_signal": 0.2629, "source": "api_gateway._handle_confirm_proxy", "confidence": "MEDIUM", "metadata": { "composite": 0.3055, "confidence": "MEDIUM", "action": null, "deriv_score": 0.45, "onchain_score": 0.0, "whale_score": 0.4, "size_mult": 0.18 }, "resolved": false }, … ],
"max_id": 8353,
"next_url": "https://api.smartmoneyapi.com/v1/signals/recent?limit=2&since_id=8353",
"server_ts": 1787897111
}
GET /v1/signals/{id}/outcome
Resolved outcome for a single signal by its numeric ID. Returns hit/miss at each resolution horizon (4h, 12h, 24h, 72h) along with the price at signal time and at resolution.
Parameters
| Parameter | Type | Description |
|---|---|---|
| idrequired | integer | Signal ID (path segment), e.g. /v1/signals/1042/outcome |
Example Response
Captured from the running API on 2026-08-28 (GET /v1/signals/8331/outcome). A horizon that has not come due yet is simply absent from horizons — absence is not a zero. Values move; the field names and the nesting are what this documents.
"id": 8331,
"ts": 1787881003,
"signal_type": "smart_money_confirm",
"symbol": "STX",
"direction": "long",
"price_at_signal": 0.2661,
"source": "api_gateway._handle_confirm_proxy",
"metadata": {
"composite": 0.288,
"confidence": "MEDIUM",
"action": null,
"deriv_score": 0.2,
"onchain_score": 0.0,
"whale_score": 0.4,
"size_mult": 0.18
},
"resolved": false,
"horizons": {
"4h": { "ts": 1787895568, "price": 0.262, "move_pct": -1.5408, "hit": false }
}
}
GET /v1/confirm-winrate
Confirm-signal win-rate breakdown for the authenticated user's own API key. Returns distinct-call win rates at each confidence tier, profit factor, and per-symbol figures. Requires a valid X-API-Key header.
Example Request
"https://api.smartmoneyapi.com/v1/confirm-winrate"
Example Response
"high_winrate": 0.714,
"high_n": 14,
"medium_winrate": 0.530,
"medium_n": 34,
"overall_accuracy": 0.613,
"overall_n": 48,
"profit_factor": 1.77,
"winrate_horizon": "24h",
"by_symbol": {
"BTC": { "win_rate": 0.68, "n": 22 },
"ETH": { "win_rate": 0.55, "n": 18 }
}
}
Shadow Gate
An immutable, append-only personal decision ledger. Submit your trade decisions before or after executing them; the system computes a confirm score against the Smart Money engine and appends a permanent row. Use it to build an honest, timestamped track record of how well the API's signal aligned with your own entries — entirely independent of the global win-rate pool. Only the Free plan has evidence fields removed — the removed set is read from plans.json and is currently reasons, details, deriv_score, onchain_score, whale_score. Trader, Pro and Enterprise receive the evidence block whole. There is no data delay on any tier, including Free.
Submit a decision. Idempotent on the Idempotency-Key request header — re-submitting the same key returns the existing row without creating a duplicate. The system immediately calls the confirm engine and appends the result as an immutable ledger row.
Request Body
| Field | Type | Description |
|---|---|---|
| symbolrequired | string | Asset symbol, e.g. BTC |
| siderequired | string | Trade direction: long or short |
| strategy_idoptional | string | Caller-defined strategy label (max 64 chars). Stored as-is for grouping and filtering. |
Example Request
-H "X-API-Key: sm_your_key" \
-H "Idempotency-Key: my-signal-20260701-001" \
-H "Content-Type: application/json" \
-d '{"symbol":"BTC","side":"long","strategy_id":"ema_crossover"}' \
"https://api.smartmoneyapi.com/v1/shadow-gate/decisions"
This section previously carried a hand-written example response with an integer id, a ts field and a resolved boolean. The id is a hex string, there is no ts (the field is created_ts) and there is no top-level resolved (outcomes live in their own per-horizon block). It was removed. A decision row carries id, user_id, idempotency_key, created_ts, symbol, side, strategy_id, entry_price, decision, confidence, size_mult, composite, model_version. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
reasons, details, deriv_score, onchain_score, whale_score — taken from plans.json, which is the single source of truth the server reads at request time. Trader, Pro and Enterprise have an empty removal set: the evidence block arrives intact on all three. The evidence block is called evidence, not factors. There is no tier delay: the row is written immediately and the confirm score is computed from the same live snapshot on every tier.List your own shadow-gate decisions, newest first. Owner-scoped — only decisions submitted by your API key are returned.
Parameters
| Parameter | Type | Description |
|---|---|---|
| limitoptional | integer | Maximum rows to return. Default: 50, max: 200 |
| cursoroptional | string | Opaque pagination cursor from a previous response's next_cursor field. Omit for the first page. |
This section previously carried a hand-written example response with a count field the list endpoint does not return. The list returns decisions, next_cursor and limit. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
Single decision by ID, with its parsed evidence block and its per-horizon outcomes array, owner-scoped. Only the Free plan has evidence fields removed (reasons, details, deriv_score, onchain_score, whale_score, per plans.json); Trader, Pro and Enterprise receive it whole. Returns 403 if the decision belongs to a different API key.
This section previously carried a hand-written example response with a factors breakdown and an outcome field. The evidence block is called evidence, and per-horizon results arrive as an outcomes array of {horizon, target_ts, resolved_ts, price, move_pct, directional_hit, status}. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
Resolve every horizon of this decision that has already come due. This is not where you report a trade result: the server fetches the price itself, at the fixed 4h / 12h / 24h / 72h marks measured from created_ts, and computes move_pct and directional_hit against the recorded entry_price. A caller-supplied price is never accepted — that is what makes the ledger worth keeping. The call is idempotent: horizons already written are left alone, horizons still in the future are reported as pending, and a horizon whose window elapsed unobserved is written as status: "missed" with a null price rather than silently scored.
Request Body
None. This endpoint takes no body. It previously documented outcome, exit_price and pnl_pct as request fields; the handler reads none of them, so a caller who followed that table believed they had recorded a result that was never stored.
This section previously carried a hand-written example response reporting a caller-supplied outcome, exit_price and pnl_pct. The endpoint accepts none of those. It returns decision_id, resolved, missed and pending. It was removed. The response shape is defined by /openapi.json, which is generated from the server source on every build and therefore cannot drift.
Error Codes
| Status | Code | Description |
|---|---|---|
| 400 | invalid_params | Missing or invalid query parameters |
| 401 | unauthorized | Missing or invalid API key |
| 403 | plan_restriction | Endpoint not available on your current plan |
| 429 | rate_limit_exceeded | Daily or burst limit reached |
| 500 | internal_error | Server error — check /health for source status |
| 503 | data_stale | Data source unavailable; returned with last known data |
Code Examples
Python
The examples below use plain requests so they run anywhere. If you would rather not hand-roll the HTTP, the official client is public and MIT-licensed — github.com/tashiardit/smartmoneyapi-python. It reads your key from SMARTMONEY_API_KEY, sends it as X-API-Key, and exposes the endpoints as methods, so a bot can call confirm() directly. Install instructions are in the repository README.
r = requests.get(
"https://api.smartmoneyapi.com/v1/confirm",
params={"symbol": "BTC", "direction": "long"},
headers={"X-API-Key": "sm_your_key"}
)
data = r.json()
print(data["confidence"]) # HIGH / MEDIUM
print(data["size_mult"]) # 1.5 / 1.0
API_KEY = "sm_your_key"
BASE_URL = "https://api.smartmoneyapi.com/v1"
def confirm_trade(symbol, direction):
resp = requests.get(
f"{BASE_URL}/confirm",
params={"symbol": symbol, "direction": direction},
headers={"X-API-Key": API_KEY},
timeout=5
)
resp.raise_for_status()
return resp.json()
# In your trading loop:
signal = confirm_trade("BTC", "long")
if signal["confidence"] not in ["HIGH", "MEDIUM"]:
print("Skipping — insufficient confidence")
else:
size = base_size * signal["size_mult"]
place_order(symbol, direction, size)
JavaScript / Node.js
async function confirmTrade(symbol, direction) {
const params = new URLSearchParams({ symbol, direction });
const res = await fetch(
`https://api.smartmoneyapi.com/v1/confirm?${params}`,
{ headers: { 'X-API-Key': API_KEY } }
);
if (!res.ok) throw new Error(`API error: ${res.status}`);
return res.json();
}
// Usage
confirmTrade('BTC', 'long').then(data => {
console.log(data.confidence, data.size_mult);
});
cURL
curl -X GET \
-H "X-API-Key: sm_your_key" \
"https://api.smartmoneyapi.com/v1/confirm?symbol=BTC&direction=long"
# Get whale data
curl -X GET \
-H "X-API-Key: sm_your_key" \
"https://api.smartmoneyapi.com/v1/whales?symbol=BTC"
# Check usage
curl -X GET \
-H "X-API-Key: sm_your_key" \
"https://api.smartmoneyapi.com/v1/usage"
Freqtrade Integration
Add Smart Money confirmation to any Freqtrade strategy by overriding the confirm_trade_entry method.
from freqtrade.strategy import IStrategy
class SmartMoneyStrategy(IStrategy):
SM_API_KEY = "sm_your_key"
SM_BASE = "https://api.smartmoneyapi.com/v1"
def confirm_trade_entry(self, pair, order_type,
amount, rate, time_in_force,
current_time, entry_tag, **kwargs):
symbol = pair.split("/")[0]
if symbol not in ["BTC", "ETH", "SOL"]:
return True # Skip check for unsupported
try:
r = requests.get(
f"{self.SM_BASE}/confirm",
params={"symbol": symbol, "direction": "long"},
headers={"X-API-Key": self.SM_API_KEY},
timeout=3
).json()
return r.get("confidence") in ["HIGH", "MEDIUM"]
except:
return True # Fail open on API error
CCXT + Smart Money
exchange = ccxt.bybit({
"apiKey": "YOUR_BYBIT_KEY",
"secret": "YOUR_BYBIT_SECRET"
})
SM_KEY = "sm_your_key"
def smart_trade(symbol, side, amount):
# Check confirmation first
conf = requests.get(
"https://api.smartmoneyapi.com/v1/confirm",
params={"symbol": symbol, "direction": side},
headers={"X-API-Key": SM_KEY}
).json()
if conf["confidence"] not in ["HIGH", "MEDIUM"]:
print(f"Skipping {symbol} {side} — insufficient confidence.")
return None
adj_amount = amount * conf["size_mult"]
order = exchange.create_market_order(
f"{symbol}/USDT", side, adj_amount
)
print(f"Order placed: {adj_amount} {symbol} {side}")
return order
Check the API status page for real-time health info, or use our contact form.