API Reference

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.

Current API version: v1. Base URL: https://api.smartmoneyapi.com/v1

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.

ResourceWhat it is
CookbookCopy-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 specMachine-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 clientOfficial 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.txtAn 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.

RepositoryWhat it is
smartmoneyapi-docsThe 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-pythonThe 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:

Base URL
https://api.smartmoneyapi.com

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:

cURL
curl -H "X-API-Key: sm_your_key" "https://api.smartmoneyapi.com/v1/confirm?symbol=BTC&direction=long"

Expected response:

JSON
{
"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.

HTTP Header
X-API-Key: sm_your_api_key_here

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.

WebSocket auth is different. Never put your key in a WebSocket URL. Real-time streams use short-lived, single-use tickets: POST your key to /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 dataYes — anonymous view, truncated where a paid view existsYes
Named-symbol access on authenticated endpointsNot availableBTC, ETH, SOL, XAU, XAG
/v1/confirm401Yes — signal and confidence; evidence fields stripped
/v1/shadow-gate/decisions, /v1/whale-alerts/*, /v1/usage401Yes
A daily quota you can read and plan againstNone — per-IP throttle only, threshold unpublished200 calls/day, live in X-RateLimit-*
Per-minute allowancePer IP, per route, unpublished, may change4/min — one budget for the whole key
StreamingSwaps only, over SSE — metered and deprecated, thresholds unpublishedThe multiplexed WebSocket: , on a small daily allowance you can read off your own ticket. Details
Usage attribution, dashboard, support historyNoneFull

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.

Honest limitation: a free key is not a throughput upgrade today. What it buys is deterministic named-symbol access, a documented daily quota you can read off your own responses, and the authenticated endpoint set. It does not currently give you a higher per-minute ceiling on the public endpoints than calling them without a key does. If sustained polling rate on public market data is the only thing you need, plan capacity on that basis rather than assuming a key raised it.

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.

Available to: Free Trader Pro
POST /auth/google

Request Body

FieldTypeDescription
id_tokenrequiredstringFirebase 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.

User profile data — email, plan, usage history, preferences — is stored in Firestore and linked to your Google account. A full data export or account deletion can be requested at any time via the dashboard Privacy Settings.

Rate Limits

PlanCalls/DayBurst LimitSymbolsData Delay
No key (anonymous)Not publishedPer-IP, per-route — not publishedPublic endpoints onlyReal-time
Free2004/minBTC, ETH, SOL, XAU, XAGReal-time
Trader3,00030/minAll symbolsReal-time
Pro15,00060/minAll symbolsReal-time
Enterprise250,000500/minAll symbolsReal-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.

Streaming has its own allowance. A WebSocket frame is not charged as a REST call. Concurrent sockets, connection time per day, frames per day and tickets per day are separate per-plan numbers — all from the same manifest. See Per-plan allowance.
The burst limit is one budget per key, not per endpoint. Requests-per-minute is counted against the API key, globally, across every route that key touches. On Free, four calls to four different endpoints inside the same minute consume the whole per-minute allowance. Size a polling loop against the total, not per endpoint.

Base URL

https://api.smartmoneyapi.com/v1

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:

StatusCodeMeaning & what to do
401unauthorizedMissing or invalid API key. Check the X-API-Key header is present and correct.
402payment_requiredThe 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.
429rate_limit_exceededKeyed 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.
429rate_limitedKeyless 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:

JSON
{
"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:

ResourceURL
LLM summaryhttps://smartmoneyapi.com/llms.txt
OpenAPI specapi.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:

Prompt
# Paste into Claude Code / Cursor / Codex
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

ParameterTypeDescription
symbolrequiredstringAsset symbol. One of: BTC, ETH, SOL (Trader+)
directionrequiredstringTrade direction: long or short
sourceoptionalstringLabel for your signal source (logged for analytics). Max 32 chars.

Example Request

cURL
curl -H "X-API-Key: sm_your_key" \
"https://api.smartmoneyapi.com/v1/confirm?symbol=BTC&direction=long"

Example Response

JSON
{
"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.

EndpointCursor field
GET /v1/whales/eventssince_idmax_id
GET /v1/signals/recentsince_idmax_id
cURL
# First call — take max_id from the response
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
# Read the ETag from the response headers
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"
A 304 does not count against your daily quota differently from a 200 — it is still one request. What it saves is bandwidth and parse time on your side, and it is the difference between a well-behaved integration and one your own infrastructure team complains about.

Response Fields

FieldTypeDescription
tsintegerUnix timestamp of the calculation
symbolstringAsset symbol. Free keys may name BTC, ETH, SOL, XAU, XAG; Trader and above, any tracked symbol.
directionstringRequested direction (long/short)
compositefloatComposite confluence score from -1.0 (extreme contra) to +1.0 (strong confirm). Not a win-rate.
base_compositefloatComposite before post-filter adjustments were applied
confidencestringHIGH / MEDIUM / LOW / VETO / NO_DATA
actionstringCONFIRM_FULL / CONFIRM_REDUCED / CONFIRM_MINIMAL / VETO_SKIP / NO_DATA_SKIP
size_multfloatSuggested position size multiplier (e.g. 0.0 – 1.5)
unsupportedbooltrue when the symbol is outside coverage (paired with NO_DATA)
deriv_scorefloatDerivatives sub-score (-1 to 1)
onchain_scorefloatOn-chain sub-score (-1 to 1)
whale_scorefloatWhale consensus sub-score (-1 to 1)
x_scorefloatX/social-sentiment sub-score (-1 to 1); 0 when unused
factorsobjectPer-leg breakdown: score × weight = weighted for derivatives / onchain / whale / x_sentiment (onchain includes source)
adjustmentsobjectSigned post-filter tweaks (agreement, trend, rsi_1h, news_macro, momentum, time_of_day, streak_decay)
weightsobjectWeight set actually used for this evaluation
coverageobject{derivatives, whale, onchain} — which legs had real data
reasonsarrayHuman-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.

Requires: Trader Pro

GET  /onchain

Returns raw on-chain metrics: MVRV, SOPR, exchange net flow, realized cap ratio, and cycle position classification.

Requires: Trader Pro

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.

This family is crypto-only, and it is a different pipeline from the live tables. It is fed by Binance and CoinGecko directly, not by the aggregated derivatives store — so a symbol being live on /v1/derivatives/screener does not imply it has history here. Gold and silver are the current example: /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.

Requires: Trader Pro

GET  /signals

Returns a stream of the most recent HIGH/MEDIUM signals across all monitored assets. Useful for opportunity scanning.

Requires: Pro

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:[…]}) of symbol, direction, entry_price, exit_price, pnl_usdt, pnl_percent, pnl_percent_net.
  • GET /v1/strategies/active?account=9 — currently open positions: array (or {positions:[…]}) of symbol, 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).

Requires: Pro

GET  /health

System health check. Returns data freshness for each source and overall API status. No authentication required.

JSON Response
{
"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

Requires: Pro

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

FieldTypeDescription
urlrequiredstringHTTPS endpoint to POST events to (must start with https://)
eventsrequiredarrayEvent names, e.g. ["HIGH","MEDIUM","VETO"] or ["*"]
symbolsrequiredarraySymbols to filter, e.g. ["BTC","ETH"] or ["*"]
secretrequiredstringYour 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

Requires: Pro

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

ParameterTypeDescription
symbolrequiredstringAsset 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.

Pro plan required. This endpoint consumes 3 API calls per request due to AI processing overhead.

GET  /liquidations

Requires: Trader Pro

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).

The modelled ladder is not a set of observed clusters. The band model places both sides at maintenance-margin / leverage from the same entry, so whenever neither side has a tracked wallet level in front of the bands, 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.
No per-side dollar open-interest split is invented. 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

ParameterTypeDescription
symboloptionalstringAsset 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.

FieldPlansWhat it means
symbolTrader + ProBase symbol this payload describes.
current_priceTrader + ProThe mark every distance below is measured from. null when no usable price was readable — never 0.
price_sourceTrader + ProWhere 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_sTrader + ProSeconds 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.
longsTrader + ProModelled long-liquidation ladder, nearest first. Each level carries liq_price, entry_px, leverage, dist_pct, source (whale_position, oi_band) and size_measured.
shortsTrader + ProShort-side ladder, same shape and same truncation rule as longs.
cascade_riskTrader + ProBucket 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_pctTrader + ProAbsolute % distance from current_price to the nearest long level eligible to set a headline. null when none was.
nearest_short_liq_pctTrader + ProSame on the short side. Read nearest_symmetric before comparing the two.
nearest_symmetricTrader + ProThe 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_basisTrader + ProWhere the headline distances came from: none, oi_band, whale.
bands_statusTrader + Prono_funding_measurement, no_levels, ok. Answers “did the band model run?” — no_funding_measurement means funding was never read, so nothing was modelled.
funding_rateTrader + ProThe only input to the crowd leverage the bands are built from. null means never read, not zero.
total_oiTrader + ProMeasured aggregate open interest (USD). The only open-interest number here that anything observed.
oi_scopeTrader + ProWhat total_oi is a sum over (sum_of_binance_bybit_hyperliquid). null whenever total_oi is null.
total_long_oiTrader + Pronull 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_oiTrader + ProShort side, under the same rule as total_long_oi.
oi_split_sourceTrader + ProWhich case the two fields above are in: aggregate_only, measured, unavailable.
positioningTrader + ProDirectional 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_bookTrader + ProSummary 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_totalsTrader onlyTrader's view of realized_heatmap.totals — notional and count of what actually liquidated.
realized_by_sideTrader onlyTrader's view of realized_heatmap.by_side.
withheldTrader onlyArray 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_reasonTrader onlytrader_plan. This is how you tell “not in your plan” apart from “the server had nothing” — a missing key cannot express both.
level_depthTrader onlyLevels per side in this response.
tsTrader + ProUnix timestamp the payload was built.
nearest_statusPro onlyno_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_modelledPro onlyHow many drawn levels were refused as headline candidates on those grounds. Non-zero alongside ok is the ordinary case.
nearest_exclusion_reasonPro onlyThe caveat those refused levels carried. null when none were refused.
realized_heatmapPro onlyThe 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

Trader receives the ladders truncated to the 5 nearest levels per side, cut from the far end so the nearest level always matches the headline distance. Pro receives up to 10 per side, plus 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.

JSON
{
"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

Available to: Free No authentication required (per-IP throttled)

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

ParameterTypeDescription
symboloptionalstringAsset symbol (default BTC).
window_minutesoptionalintLook-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_bucketsoptionalintNumber of price buckets (default 50, clamped to 5–100).

Response fields you must read before drawing a conclusion

FieldValuesWhat it means
sourcememoryServed from the live 4h in-process buffer. Recording is current by definition.
sourcearchiveRead from the persisted liquidation history (any window longer than the buffer). A coverage block is included.
sourceunavailableThe 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 nullOldest and newest liquidation in the archive. If your window starts before first_event_ts, the part before it was never recorded.
coverage.gapsarray 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.errorstringThe coverage probe itself failed, so coverage is unknown. Do not read its absence as full coverage.
coverage_notestringProse summary of the gaps (count and total hours), present only when there are any.
notestringPresent only when totals.count is 0, and it says which zero this is: a genuinely quiet window, or a failed read.
exchangesobjectEvent 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.
Why this matters: a flat empty band in a historical window has two opposite meanings — the market was quiet, or we were not recording. A consumer that reads a recording gap as “zero liquidations” concludes the market was calm at exactly the moment we were blind to it. 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

JSON
{
"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
}
Honest note: this endpoint reflects only what the live stream has captured. When a symbol is quiet or the stream just started, 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

Available to: Free No authentication required (per-IP throttled)

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

ParameterTypeDescription
limitoptionalintMax symbols returned, busiest first. Clamped to 1–2000.

Example Response

JSON
{
"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"
}
Honest note: 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

Requires: Trader Pro

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

ParameterTypeDescription
chainoptionalstringbsc or avax. Omit for all chains.
limitoptionalintegerMax rows (default 100, max 500). Newest-first.

Example Response

JSON
{
"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

Requires: Trader Pro

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.

Send 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

ParameterTypeDescription
symbolrequiredstringAsset symbol: BTC, ETH, or SOL
directionrequiredstringPosition direction: long or short
entry_priceoptionalfloatYour 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_pctoptionalfloatMaximum 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.

JSON
{
"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
}
Trader plan receives 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

Requires: Trader Pro

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

ParameterTypeDescription
min_spreadoptionalfloatMinimum funding rate spread to include (as decimal). Default: 0.01
symboloptionalstringFilter 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.

Trader plan: Top 1 opportunity only, no historical spread data. Pro plan: All current opportunities with 24h spread history per exchange pair.

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.

GET (no auth)
GET /v1/derivatives/funding-arb
JSON
{
"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
}
Free, no API key. Top 10 opportunities only, capped and cached (120 s). Live screener page: funding-arb.html.

GET  /smart-money/flow

Requires: Trader Pro

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

ParameterTypeDescription
symboloptionalstringSingle symbol (e.g. BTC). Omit to get all tracked symbols ranked by |score|.
window_hoursoptionalintScoring window, clamped to 1..168. Default 24.

Example Response

JSON
{
"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."
}
Trader plan: Top 12 symbols, contributor detail withheld. Pro plan: All symbols with per-symbol 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

Available to: Free No authentication required — anonymous gets top 10 symbols, Trader+ gets the full list

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

ParameterTypeDescription
min_notionaloptionalfloatMinimum combined gross notional (USD) for a symbol to be included. Default: 1000000.

Example Request

GET (no auth)
curl "https://api.smartmoneyapi.com/v1/whales/crowding?min_notional=1000000"

Example Response

JSON
{
"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." ]
}
Honest note: 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

Available to: Free No authentication required (per-IP throttled)

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

ParameterTypeDescription
symboloptionalstringBTC or ETH only. Default: BTC.

Example Request

GET (no auth)
curl "https://api.smartmoneyapi.com/v1/options/gex?symbol=BTC"

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.

JSON
{
"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
}
Honest note: Deribit contract multiplier is 1 (coin-denominated OI). On any fetch failure the endpoint returns 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

Available to: Free No authentication required (per-IP throttled)

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

ParameterTypeDescription
symboloptionalstringAsset symbol. Default: BTC.
move_pctoptionalfloatHypothetical price move as a percent (negative = down, positive = up). Default: -5.

Example Request

GET (no auth)
curl "https://api.smartmoneyapi.com/v1/liquidations/simulate?symbol=BTC&move_pct=-5"

Example Response

JSON
{
"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." }
}
Honest note: Every projected number is derived from real DB reads; nothing is fabricated on failure. An untracked symbol, stale snapshot, or missing price returns 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

Available to: Free No authentication required (per-IP throttled)

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 signaldata_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

ParameterTypeDescription
symboloptionalstringAsset symbol. Default: BTC.

Example Response

JSON
{
"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" } }
}
}
Honest note: 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

Available to: Free No authentication required (per-IP throttled)

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.

Read this before comparing it to the live study: the events here are inferred, not observed. A “cascade” is a 4h bar where 24h open interest fell more than 10% while price moved more than 5% in the matching direction — an OI-cascade proxy for liquidations, at 4h granularity. They are not realized liquidation events and must not be pooled with /liquidations/aftermath. The payload states this in its own posture field.

Example Response

JSON
{
"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

Available to: Free No authentication required (per-IP throttled)

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

ParameterTypeDescription
addrrequiredstringWallet address (path segment), e.g. /v1/wallet/0x3bcae23e…/profile.
daysoptionalintegerLook-back window for the series & timeline. Default: 30.

Example Request

GET (no auth)
curl "https://api.smartmoneyapi.com/v1/wallet/0x3bcae23e8c380dab4732e9a159c0456f12d866f3/profile?days=30"

Example Response

JSON
{
"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."
}
}
}
Honest note: everything shown is real from the snapshot data — 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

Available to: Free No authentication required

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

ParameterTypeDescription
venuerequiredstringVenue id, e.g. hyperliquid. See /v1/l2/venues for the full list.
symboloptionalstringRestrict to one symbol, e.g. BTC. Omit to include every symbol collected in the window.
startoptionalstringWindow start, ISO-8601 UTC (e.g. 2026-09-01T15:00:00Z). Defaults to one hour before end.
endoptionalstringWindow end, ISO-8601 UTC, exclusive. Defaults to the current UTC hour.
limitoptionalintegerMax rows returned. Default 5000, capped at 20000.

Example Request

GET (no auth)
curl "https://api.smartmoneyapi.com/v1/l2/trades?venue=hyperliquid&symbol=BTC&start=2026-09-01T15:00:00Z&end=2026-09-01T17:00:00Z"

The exact response shape (row fields, coverage, source_terms) is defined by /openapi.json, generated from the server source on every build.

The window is a request the store may only partly satisfy, and that is reported, not hidden. The window is capped at 6 hours per request; the row window is separately capped by 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

Available to: Free No authentication required

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 (no auth)
curl "https://api.smartmoneyapi.com/v1/l2/venues"

GET  /flows

Requires: Pro

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.

Pro plan required. Flow values are USD net inflow (positive) or outflow (negative) per time window.

GET  /whale-events

Requires: Trader Pro

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

ParameterTypeDescription
symboloptionalstringFilter by asset. Omit for all monitored assets.
significanceoptionalstringFilter by event significance: high, medium, or all. Default: all
hoursoptionalintegerLook-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.

Trader plan: Returns the summary object only. Pro plan: Full events feed with wallet identifiers, sizes, and timestamps.

GET  /regimes/history

Requires: Pro

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

ParameterTypeDescription
symboloptionalstringAsset symbol. Default: BTC
regimeoptionalstringFilter to a specific regime type, e.g. late_cycle_divergence. Omit for all regimes.
daysoptionalintegerLook-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.

Pro plan required. Combine with /analysis to validate strategy assumptions against historical regime performance data.

GET  /exchange-health

Available to: Free Trader Pro

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.

JSON
{
"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

Requires: Trader Pro

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

ParameterTypeDescription
symboloptionalstringAsset symbol. Default: BTC

Example Response

JSON
{
"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
}
Competitor equivalent: Santiment Social Volume + Alternative.me Fear & Greed — combined into a single endpoint with component breakdown.

Integrations

GET  /tradingview/setup

Requires: Trader Pro

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.

JSON
{
"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

Available to: Trader Pro

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

JSON
{
"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

Requires: Trader Pro

Returns your current personalization settings including default trade parameters, risk profile, watchlist, and notification preferences.

PUT /v1/preferences

Update preferences by sending a JSON body with any subset of the fields below. Omitted fields retain their current values.

Preference Fields

FieldTypeDescription
default_trade_size_usdfloatDefault position size in USD for Kelly and smart-stop calculations
risk_tolerancestringconservative, moderate, or aggressive
default_risk_pctfloatDefault risk per trade as % of account. Used by /smart-stop when risk_pct is omitted
watchlistarrayOrdered list of asset symbols, e.g. ["BTC","ETH","SOL"]
notification_emailstringEmail address for alert delivery
timezonestringIANA timezone string, e.g. America/New_York
PUT — Example Body
{
"default_trade_size_usd": 5000,
"risk_tolerance": "moderate",
"default_risk_pct": 1.5,
"watchlist": ["BTC", "ETH", "SOL"]
}

GET  /watchlist

Requires: Trader Pro

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.

There is no /ws endpoint — there never has been, on either process. If you are getting a 404, that is why. The paths that exist are below.
TransportPathNotes
WebSocketwss://api.smartmoneyapi.com/v1/ws/streamUse this. Multiplexed — every channel your plan includes, on one socket.
WebSocketwss://api.smartmoneyapi.com/v1/ws/live-swapsLegacy, swaps only. Still works; new clients should use /v1/ws/stream.
SSEhttps://api.smartmoneyapi.com/v1/stream/public-swapsSwaps 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.

POST /v1/ws/ticket
Available to: Free Trader Pro
cURL
curl -X POST -H "X-API-Key: sm_your_key" \
"https://api.smartmoneyapi.com/v1/ws/ticket"

Response

JSON
{
"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 */ }
}
FieldTypeDescription
ticketstringSingle-use token to append as ?ticket=. Redeemed once, then invalidated.
expires_innumberSeconds until it expires. Mint a fresh ticket per connection attempt.
ws_urlstringThe path to open. Returned so a client never has to hardcode it.
channelsstring[]The channels this plan may actually open — the intersection of what the plan sells and what the bus publishes.
entitlementobjectYour plan’s streaming allowance, from the manifest. Read it rather than hardcoding a limit.
usageobjectWhat 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.

JavaScript (browser)
// 1. Exchange your key for a short-lived ticket (key stays in the header)
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

Available to: No key required

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.

ChannelUnitVenue push?PublishedWhat it is
swapsusd_notionalnoper decoded blockDEX swaps ≥ $500 decoded from our own BSC and Avalanche nodes.
liquidationsusd_notionalyes~2 s sweepForced liquidations exactly as five CEX venues pushed them.
fundingrate per venue interval and 8h-normalisedno60 s, change-onlyPer-instrument funding, whenever the rate actually moved.
whalesusd_notionalno5 s, cursor-basedLarge multi-chain wallet events.
signalsdimensionless_confidenceno10 sRows appended to our own signal log.
orderbookusd_notional_depthno30 s, rotating symbolCross-venue book depth for a small rotating symbol set.
fillsbase_size + usdno10 sTracked-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:

ChannelNot in it
swapsNo 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.
liquidationsThe 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.
fundingNo 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.
whalesPoll-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.
signalsA 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.
orderbookNot 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.
fillsHyperliquid 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:

stateMeaning
no_producerThis process publishes nothing on that channel. Not a claim that nothing is happening.
idleA producer is wired and running; nothing has been published recently.
liveA producer is wired and publishing.

Per-plan allowance

PlanChannelsConcurrent socketsConnection time / dayFrames / dayTickets / 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 / framereasonMeaning
402websocket_not_on_planThe plan carries no WebSocket at all.
402channel_not_on_planThe channel exists; your plan does not include it. available lists what you may open.
409channel_has_no_producerOn your plan, but this process is not publishing it. Stated as our gap, not as an empty market.
429max_connectionsYou already hold the maximum concurrent sockets for the plan.
429daily_secondsDaily connection time spent.
429messages_per_dayDaily frame allowance spent. An open socket gets a quota_exhausted frame first, then closes.
429tickets_per_dayDaily 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.

Honest limitation, unchanged for streaming. A free key is not a raw throughput upgrade over calling us anonymously today, and nothing on this page claims it is. What the credential buys is a different and larger surface: the multiplexed socket instead of a swaps-only SSE pipe, more than one channel, an allowance you can read off your own responses instead of inferring from 429s, usage attributed to your account, and a path that is not on a deprecation clock.
JavaScript (browser)
const es = new EventSource("https://api.smartmoneyapi.com/v1/stream/public-swaps");
es.addEventListener("swap", e => {
  const swap = JSON.parse(e.data);
  console.log(swap.chain, swap.pair, swap.amount_usd);
});

REST snapshot

GET /v1/live-swaps/recent?limit=20

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

FieldTypeDescription
chainstringbsc or avalanche — those two and no others
dexstringRouter name (e.g. pancakeswap_v2, traderjoe) or unknown_dex
swapperstringFull 0x address of the wallet that executed the swap
swapper_shortstringAbbreviated form for display (e.g. 0xb300…028d)
swapper_urlstringDirect link to the swapper on the chain's block explorer
tx_hashstringTransaction hash
explorer_urlstringDirect link to the transaction on BscScan / Snowtrace
token_instringSymbol of the token sold (e.g. USDT)
token_outstringSymbol of the token bought
amount_usdnumberUSD value of the swap (minimum: $500 — below that it never enters the bus)
pairstringFormatted pair label (e.g. USDT → USDC)
blocknumberBlock number where the swap was mined
timestampnumberUnix epoch seconds
significancestringlow / medium / high / critical based on USD size
seqnumberMonotonic 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:

  1. 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.
  2. 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.
  3. 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.

TableVenueWhat we requestWhat we deliberately do not request
binanceBinance USDⓈ-Musdt-m/usdc-m futures (perpetual + dated)options (eapi.binance.com is a separate API)
binance_coinmBinance COIN-Mcoin-m futures (perpetual + dated)nothing — this table is exhaustive
bybitBybitlinear perpetual/futures; inverse perpetual/futuresoptions (category=option not requested); spot (category=spot not requested)
hyperliquidHyperliquidperp universe (info type=meta)spot (info type=spotMeta not requested; HL spot lists tokenised gold XAUT0/XAUM)
okxOKXswaps (instType=SWAP)dated futures (instType=FUTURES not requested); options (instType=OPTION not requested); spot (instType=SPOT not requested)
bitgetBitgetUSDT-FUTURES; COIN-FUTURES; USDC-FUTURESspot (spot API not requested)
bitmexBitMEXall active instrumentsnothing — this table is exhaustive
kucoinKuCoinall active futures contractsnothing — this table is exhaustive
mexcMEXCall futures contract detailsnothing — this table is exhaustive
krakenKrakenall derivatives instrumentsnothing — this table is exhaustive
deribitDeribitperpetual futures (all 50 currencies)nothing — this table is exhaustive
deribit_datedDeribit — dated futuresexpiring futures day/week/monthderived from the same deribit payload — no extra request
deribit_optionDeribit — optionsall 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:

VenueWhy it is outDetail
gateread failedapi.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.
pionexread fine — nothing to aggregateNo 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.

Instrument counts move as venues list and delist, so this page does not print one. Ask /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.

EndpointPlanWhat it returns
GET /v1/symbols/universeFree sample Paid fullLive symbols. Optional ?venue=, ?limit=.
GET /v1/symbols/universe/assetFree sample Paid fullOne asset across every venue — live and delisted — with its scale variants. ?asset=BTC.
GET /v1/symbols/universe/coverageTrader+Per venue: what we requested, what we did not, and whether absence is conclusive.
GET /v1/symbols/universe/venueTrader+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.

Read this before you chart it against a gold price. 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:

FieldMeaning
funding_rateThe rate as the venue publishes it, for its own interval. Never rescaled.
funding_interval_hoursThe instrument’s real settlement interval, read from the venue. 4 for XAU and XAG.
funding_interval_basisWhere that interval came from — or, when the figure is null, why it is null.
funding_annualizedAnnualised on the interval above. Nullable.
asset_classmetal for XAU/XAG, tokenised_metal for XAUT/PAXG, and so on.
Null is a real answer here, and you must not coerce it. 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.

Not yet reachable through the API — stated rather than implied. The provenance label exists in storage today, but no deployed endpoint returns it yet, and the /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/*

Available to: Free Trader Pro No authentication required

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:

EndpointReturns
GET /v1/cot/summaryLatest report for one market: open interest, net long, week-on-week change, and every trader bucket. ?symbol=
GET /v1/cot/historyThe weekly series. ?symbol=, ?weeks=
GET /v1/cot/trendDirection of the speculative bucket over recent reports. ?symbol=
GET /v1/cot/comparisonAll 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:

Symbolsreport_familyBuckets in categories
XAU (Gold, COMEX, 100 troy oz)
XAG (Silver, COMEX, 5,000 troy oz)
disaggregated
Disaggregated Commitments of Traders
producer_merchant, swap_dealers, managed_money, other_reportables, nonreportable
BTC, ETH (CME)tff
Traders 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.

COT is weekly and it is always late — every payload says how late. The snapshot is taken on a Tuesday and published the following Friday, so the freshest possible reading already describes positions from several days ago. Rather than leave you to work that out, every COT payload carries an 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

This is not the live production feed, and every response says so. Each envelope carries a provenance block including 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.
EndpointPlanWhat it returns
GET /v1/research/coverageTrader+Which tables exist and their status per shard. ?counts=1 for row counts.
GET /v1/research/symbolsFree sample Paid fullSymbols present in a table. ?table=.
GET /v1/research/queryFree, small cap Paid, larger capRows. Filters: coin, wallet, interval, order, start_ms, end_ms, limit.
GET /v1/research/diskTrader+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

Requires: Pro

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.

GET /v1/alerts/conditions

Returns a list of all your configured alert conditions with their IDs, definitions, and current status.

DELETE /v1/alerts/conditions/{id}

Permanently removes an alert condition by its ID.

GET /v1/alerts/history

Returns recent alert trigger events with timestamps, matched conditions, and the metric value at the time of trigger.

Create Alert — Request Body

FieldTypeDescription
namerequiredstringHuman-readable label for this alert (max 64 chars)
metricrequiredstringThe metric to monitor. See available metrics table below.
symboloptionalstringAsset context. Required for symbol-scoped metrics such as funding_rate.
operatorrequiredstringComparison operator: gt, lt, eq, crosses_above, crosses_below
thresholdrequiredfloatNumeric value to compare the metric against
deliveryoptionalstringDelivery channel, e.g. telegram (default) or webhook
cooldown_minutesoptionalintegerMinimum 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

MetricDescription
funding_rateCurrent funding rate for symbol (as decimal)
global_lsrGlobal long/short ratio for symbol
long_pctPercentage of accounts net long for symbol
top_trader_lsrTop-trader long/short ratio for symbol
taker_ratioTaker buy/sell ratio for symbol
mvrvMarket Value to Realized Value ratio (BTC/ETH)
soprSpent Output Profit Ratio (BTC/ETH)
exchange_net_flowOn-chain exchange net-flow signal
accumulationOn-chain accumulation signal
whale_long_pctPercentage of tracked whale wallets holding long positions for symbol
whale_n_walletsNumber of tracked whale wallets with a position in symbol
composite_longComposite score for symbol queried in long direction
composite_shortComposite score for symbol queried in short direction
funding_spreadCross-venue funding spread for symbol
POST — Example Body
{
"name": "BTC funding rate spike",
"metric": "funding_rate",
"symbol": "BTC",
"operator": "gt",
"threshold": 0.05
}

GET  /kelly

Requires: Pro

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

ParameterTypeDescription
symbolrequiredstringAsset symbol: BTC, ETH, or SOL
confidenceoptionalstringSignal confidence level to model: HIGH, MEDIUM, or LOW. Default: HIGH
directionoptionalstringTrade direction: long or short. Default: long
account_sizeoptionalfloatAccount 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.

Pro plan required. Calculations are based on a rolling 90-day sample of historical signals matching the requested symbol, confidence, and direction parameters.

GET  /performance

Available to: Free Trader Pro

Returns historical accuracy statistics for signals issued by the API, broken down by confidence level. Useful for understanding signal reliability before committing capital.

Parameters

ParameterTypeDescription
symboloptionalstringFilter by asset. Omit for aggregate statistics across all symbols.
daysoptionalintegerLook-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.

JSON
{
"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

Available to: Free Trader Pro No authentication required

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.

JSON
{
  "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.

FieldCountsCompanion name list
exchangesVenues 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_totalThe 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.

And a third number, which is not in this response at all. Elsewhere we describe eleven instrument tables. That is a count of metadata tables — the venues whose instrument definitions and contract multipliers we read so that sizes and funding can be normalised — and it is deliberately larger than both fields above. Reading a venue’s instrument list is not the same as ingesting its time series. So: eleven venues normalise units (venue coverage), 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.
In-sample caveat. All figures in this response are computed from the same period used to tune the scorer. The 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

Available to: Free Trader Pro No authentication required

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

ParameterTypeDescription
daysoptionalintegerLook-back window in days. Default: 30
signal_typeoptionalstringFilter by type, e.g. smart_money_confirm or regime_flip. Omit for all types.
symboloptionalstringFilter 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.

JSON
{
"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

Available to: Free Trader Pro No authentication required

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.

JSON
{
"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

Available to: Free Trader Pro No authentication required

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

ParameterTypeDescription
idrequiredintegerSignal 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.

JSON
{
"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

Requires: Free Trader Pro

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

cURL
curl -H "X-API-Key: sm_your_key" \
"https://api.smartmoneyapi.com/v1/confirm-winrate"

Example Response

JSON
{
"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 }
}
}
Distinct-call basis. Win rates are computed per distinct confirm call (one per symbol per 5-minute window), not per every API hit — this prevents N-inflation from bots that poll repeatedly. Figures are in-sample over the default 30-day window; the same caveat as /v1/stats applies.

Shadow Gate

Requires: Free Trader Pro

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.

POST /v1/shadow-gate/decisions

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

FieldTypeDescription
symbolrequiredstringAsset symbol, e.g. BTC
siderequiredstringTrade direction: long or short
strategy_idoptionalstringCaller-defined strategy label (max 64 chars). Stored as-is for grouping and filtering.

Example Request

cURL
curl -X POST \
-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.

Tier note. Only the Free plan has fields removed, and the removed set is 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.
GET /v1/shadow-gate/decisions

List your own shadow-gate decisions, newest first. Owner-scoped — only decisions submitted by your API key are returned.

Parameters

ParameterTypeDescription
limitoptionalintegerMaximum rows to return. Default: 50, max: 200
cursoroptionalstringOpaque 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.

GET /v1/shadow-gate/decisions/{id}

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.

POST /v1/shadow-gate/decisions/{id}/resolve

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.

Immutability. The decision row is append-only and a database trigger refuses any UPDATE to it. Each horizon gets exactly one outcome row, written once and never rewritten, so calling resolve again is safe and changes nothing already decided. Nothing here is client-supplied except the symbol, the side and your own strategy label — which is the only reason this track record means anything.

Error Codes

StatusCodeDescription
400invalid_paramsMissing or invalid query parameters
401unauthorizedMissing or invalid API key
403plan_restrictionEndpoint not available on your current plan
429rate_limit_exceededDaily or burst limit reached
500internal_errorServer error — check /health for source status
503data_staleData 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.

Python
import requests

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
Python
import requests

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

JavaScript
const API_KEY = 'sm_your_key';

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

Shell
# Confirm a long trade
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.

Python — Freqtrade Strategy
import requests
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

Python — CCXT
import ccxt, requests

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
Need help?

Check the API status page for real-time health info, or use our contact form.