Confirm a trade before you take it
API ▸ How to call thisYou name a symbol and a direction you are about to trade. One request reads Bybit, Binance and Hyperliquid derivatives, on-chain metrics and tracked whale positioning, and returns a scored, itemised answer — including which of those components actually had data and which did not.
What it answers
You already have a trade idea. /v1/confirm tells you whether the cross-exchange data currently agrees with it, disagrees with it, or has nothing to say — and shows you the arithmetic that produced that answer.
It is an aggregation and transparency tool, not a forecast. Its job is to replace fifteen minutes of clicking between funding pages, long/short ratios, on-chain dashboards and whale trackers with a single auditable JSON object.
A real request, and the real response
The response below is not an illustration. It is a verbatim capture of a live call made while writing this page — which is why it happens to be a VETO_SKIP: the model declined the trade. Only two things were removed, and both are marked in the body: details (the raw per-factor inputs, about 2 KB) and ai_analysis.input_data.
curl -H "X-API-Key: $SMARTMONEY_KEY" \ "https://api.smartmoneyapi.com/v1/confirm?symbol=BTC&direction=long"
{
"ts": 1787911423,
"symbol": "BTC",
"direction": "long",
"source": "",
"model_version": "confirm-2026-07-10.1",
"action": "VETO_SKIP",
"confidence": "VETO",
"decision": "SKIP",
"composite": -0.0886,
"base_composite": 0.0614,
"size_mult": 0.0,
"unsupported": false,
"deriv_score": 0.1,
"onchain_score": 0.0428,
"whale_score": 0,
"x_score": 0,
"coverage": {
"derivatives": true,
"whale": true,
"onchain": true
},
"weights": {
"derivatives": 0.55,
"onchain": 0.15,
"whale_intel": 0.3
},
"weights_mode": "free",
"factors": {
"derivatives": {
"score": 0.1,
"weight": 0.55,
"weighted": 0.055
},
"onchain": {
"score": 0.0428,
"weight": 0.15,
"weighted": 0.0064,
"source": "coinmetrics_community",
"available": true
},
"whale": {
"score": 0,
"weight": 0.3,
"weight_effective": 0.15,
"staleness_factor": 0.5,
"weighted": 0.0
},
"x_sentiment": {
"score": 0,
"weight": 0,
"weighted": 0
}
},
"adjustments": {
"agreement": 0.0,
"trend": 0.0,
"rsi_1h": 0.0,
"news_macro": -0.18,
"momentum": 0.0,
"time_of_day": 0.0,
"streak_decay": 0.0
},
"reasons": [
"Funding 0.0077% -- neutral (0.00)",
"Top traders long (2.11) (+0.20)",
"Taker selling (0.76) (-0.10)",
"On-chain +0.04 (bullish, CoinMetrics MVRV/exch-flow/addr) \u2192 +0.04",
"Whales neutral (52% long)",
"X sentiment disabled",
"News/macro adjustment (-0.18)",
"Whale staleness decay (weight \u00d750%)"
],
"meta": {
"source": {
"derivatives": "smartmoney_data.derivatives_agg",
"onchain": "coinmetrics_community",
"whale": "smartmoney_data.whale_consensus"
},
"source_ts": {
"derivatives": 1787911263,
"onchain": null,
"whale": 1787910956
},
"age_s": {
"derivatives": 160,
"onchain": null,
"whale": 467
},
"coverage": {
"derivatives": true,
"whale": true,
"onchain": true
},
"stale": true,
"stale_by_source": {
"derivatives": false,
"onchain": true,
"whale": false
},
"model_version": "confirm-2026-07-10.1",
"expires_at": 1787911723
},
"multi_timeframe": {
"short": {
"composite": 0.0643,
"confidence": "LOW",
"weights_used": {
"derivatives": 0.6,
"onchain": 0.1,
"whale_intel": 0.3
},
"timeframe_label": "Scalp (1-4 hours)"
},
"medium": {
"composite": -0.0886,
"confidence": "VETO",
"weights_used": null,
"timeframe_label": "Swing (4h-3 days)"
},
"long": {
"composite": 0.0385,
"confidence": "LOW",
"weights_used": {
"derivatives": 0.15,
"onchain": 0.55,
"whale_intel": 0.2
},
"timeframe_label": "Position (3 days-2 weeks)"
}
},
"personalized": {
"risk_tolerance": "moderate",
"base_trade_size_usd": 1000.0,
"confidence": "VETO",
"confidence_multiplier": 0.0,
"suggested_size_usd": 0.0,
"timeframe_preference": "medium",
"note": "Position sizing is a suggestion only. Always apply your own risk management rules."
},
"ai_analysis": {
"regime": "choppy_no_signal",
"regime_label": "Neutral, weak signals across all modules",
"summary": "All three modules show weak or neutral readings, with composite scores vetoing both long and short signals. Derivatives show slight positive funding but a low taker buy/sell ratio, indicating weak spot demand. On-chain and whale data are inconclusive.",
"signal_conflicts": [],
"risk_factors": [
"Low taker buy/sell ratio (0.74) suggests weak spot market buying pressure",
"Composite veto on both long and short signals indicates high uncertainty"
],
"recommendation": "A trader should wait for stronger directional signals before taking significant positions.",
"time_horizon": "1-3 days",
"symbol": "BTC",
"generated_at": "2026-08-28T09:50:11.868723+00:00",
"generation_time_ms": 7718,
"ai_backend": "deepseek/deepseek-chat-v3.1",
"input_data": "<<elided for this page>>",
"cached": true,
"cache_age_seconds": 811
},
"details": "<<elided for this page: per-factor raw inputs, ~2 KB>>"
}
Every field, annotated
Values shown are the ones from the capture above.
- actionstring, 5 values
- "VETO_SKIP"The verdict, in the original vocabulary. The five values are listed in the next section. Not a trade instruction, and not an order. Nothing is placed on your behalf.
- decisionstring, 4 values
- "SKIP"A newer, coarser enum collapsing
actionintoCONFIRM/REDUCE/SKIP/ABSTAIN.ABSTAINcovers both LOW confidence and "there was no data". Use this one if you are branching in code; it has fewer edge cases thanaction. - confidencestring
- "VETO"Bucketed composite:
HIGH,MEDIUM,LOW,VETO, orNO_DATA. Not a probability. AHIGHdoes not mean "high chance of profit" — it means the components that had data leaned strongly the same way. - compositefloat, -1 to +1
- -0.0886The final score for your stated direction, after weighting each component and applying the adjustments listed in
adjustments. Positive supports the trade, negative contradicts it. Not a price target and not an expected return. It is a unitless internal score. - base_compositefloat
- 0.0614The weighted factor sum before any adjustment. Published so you can see exactly how much of the verdict came from the raw exchange data and how much from filters — here the raw data was mildly positive and the adjustments turned it negative.
- size_multfloat, 0 to 1
- 0.0A suggested fraction of your normal position size for this confidence bucket, further reduced by a liquidation-distance calculation. Not risk management. It knows nothing about your account, leverage or other open positions.
- deriv_score
onchain_score
whale_score
x_scorefloat, -1 to +1 each - 0.1 0.0428 0 0The four component scores, each already oriented to your direction (positive = supports it).
x_scoreis always 0 by design: the X/Twitter sentiment input is switched off, and its weight is renormalised to 0 (seefactors.x_sentiment.weight) so it cannot move the composite. It is kept in the payload so existing clients do not break. - coverageobject of booleans
- {"derivatives": true, "whale": true, "onchain": true}Which of the three data families actually returned something for this symbol. This is the honesty field: it tells you how much of the model ran at all.
A
falsehere does not mean bearish. It means unknown — that component was excluded, not counted as neutral. - unsupportedboolean
- false
trueonly when the symbol is outside the tracked universe entirely — no derivatives and no whale data. In that caseactionisNO_DATA_SKIP,decisionisABSTAIN, and the scores are zeros that mean "not measured". - factorsobject
- Per-component
score,weightandweightedcontribution — the composite's line items. The whale entry also carriesstaleness_factorandweight_effective: in the capture, whale consensus was stale, so its 0.30 weight was cut to 0.15. The on-chain entry carriessourceandavailable. - adjustmentsobject
- news_macro: -0.18, all others 0.0Every post-scoring modifier, itemised and signed: indicator agreement, 4h trend filter, 1h RSI, news/macro, price momentum, time-of-day liquidity, and signal-streak decay. They sum with
base_compositeto givecomposite. Published so a negative verdict is never a black box — here you can see the entire flip came from the macro/news modifier. - weights
weights_modeobject / string - {"derivatives": 0.55, "onchain": 0.15, "whale_intel": 0.3} "free"The weight set actually used, and which set it was.
freemeans the model ran without a Glassnode on-chain key and without the X input. - reasonsarray of strings
- Human-readable lines, one per contributing observation and one per non-zero adjustment — e.g.
"Top traders long (2.11) (+0.20)","Whale staleness decay (weight ×50%)". Stripped on the Free tier along withdetailsand the four raw*_scorefields. - metaobject
- Proof-carrying provenance: the
sourcetable each number came from, itssource_ts, itsage_s, a per-sourcestaleflag, themodel_version, andexpires_at. In the capture,stale: truebecause the on-chain source had no timestamp — the response says so rather than hiding it. - multi_timeframeobject
- The same component scores re-weighted for
short(scalp),medium(swing) andlong(position) horizons. In the capture the medium horizon vetoes while short and long both come outLOW— a disagreement worth seeing rather than averaging away. Horizon access is tier-gated: Free getsmedium, Trader addsshort, Pro addslong. - personalizedobject
- Your saved risk tolerance and base trade size turned into a suggested USD figure. Ships with its own disclaimer field. Not advice. It is arithmetic on numbers you entered.
- ai_analysisobject
- An LLM-written summary of the same numbers — regime label, conflicts, risk factors, plus
ai_backendandgeneration_time_msso you know which model wrote it and how long it took. It reads the payload; it has no extra information. If it disagrees withcomposite, the composite is the machine-readable answer. - detailsobject
- The raw inputs behind every component — funding rate, long/short ratios, taker flow, on-chain series, whale positioning — so you can recompute the score yourself. Elided in the sample above for length only.
- symbol, direction
ts, model_version, sourceecho + provenance - "BTC", "long", 1787911423, "confirm-2026-07-10.1"Your inputs echoed back, the Unix second the verdict was computed, and the scoring model version. Pin
model_versionin your logs: when it changes, scores are not comparable across the boundary.
The five actions
reasons and adjustments to see which part did.VETO_SKIP and from a weak LOW, so that "we do not know" can never be mistaken for "we looked and it is bad".How the composite is built
Three component scorers run against your symbol and direction. Each returns a number in -1 … +1, already oriented so that positive supports your direction:
- Derivatives — funding, open interest, global and top-trader long/short ratios and taker flow, aggregated across Bybit, Binance and Hyperliquid.
- On-chain — free Coin Metrics community series (MVRV, exchange flow, active addresses) when no Glassnode key is configured. The
factors.onchain.sourcefield always names which one was used. - Whale positioning — consensus across the tracked Hyperliquid whale wallets.
- X / social sentiment — present in the schema, switched off, weight 0.
A component with no data is excluded, not counted as neutral. If a scorer has nothing to say, its weight is renormalised across the remaining components rather than folded in as a zero — because a zero would silently drag the composite toward "no signal" and make a missing input look like a measured neutral one. Which components ran is reported in coverage; what each contributed is in factors. If neither derivatives nor whale data exists, the endpoint refuses to score at all and returns NO_DATA_SKIP with unsupported: true.
The weighted sum is base_composite. Then the modifiers in adjustments are applied — agreement between derivatives and whales, the 4h trend filter, the 1h RSI zone, the news/macro modifier, price momentum, a time-of-day liquidity penalty, and a streak decay — and the result is composite. Whale weight is additionally scaled by factors.whale.staleness_factor when the consensus snapshot is old. Every one of these is published as a signed number, so base_composite plus the adjustments is a sum you can check yourself.
What coverage and unsupported are for: they let you tell the difference between a weak answer and an unanswered question. A composite near zero with coverage all true means the model ran fully and found nothing. The same composite with two false entries means most of the model never ran. Those are not the same result, and the payload refuses to blur them.
What it does not do
This is the part most vendors leave out, so it is the part we put in full.
- It does not predict price. There is no target, no forecast horizon, no expected return anywhere in the payload.
confidenceis not a probability.HIGHdescribes agreement between the components that had data. It is not calibrated to any hit rate, and you must not read it as one.- It has no proven out-of-sample directional edge. We ran leakage-free walk-forward testing on the derivatives signal, the whale signal and the combination. All three landed in the 49–52% band — a coin flip. We publish that because it is what we measured.
- The higher win rates you may see elsewhere on this site are in-sample. They come from resolved outcomes inside a single market regime, they are carried with that caveat everywhere they appear, and they are not evidence of forward performance. The live numbers below are shown for exactly that reason: so you can see the caveat attached to the number instead of the number on its own.
- It is not risk management and not advice.
size_multandpersonalizedare arithmetic on a confidence bucket and on figures you entered yourself. They do not know your account, your leverage or your other positions. - It cannot see what it cannot see. No order book depth, no exchange outages, no news that has not reached the classifier, and nothing at all for symbols outside the tracked universe — which is why
NO_DATA_SKIPexists as its own value.
The honest pitch: what you are buying is real-time aggregation and transparency — three exchanges, on-chain and whale positioning read in one request, with every component score, weight, adjustment, data source and timestamp exposed so you can audit the answer. You are not buying a proven directional edge, because we have not measured one.
Live from this deployment, and refreshed on every page load. These are in-sample, single-regime figures and are not a forward-performance claim:
A dash means the figure could not be read from the API just now — it never means zero, and it never means good. Full method and the pre-registered studies: methodology · performance.
Tier access
Every tier can call /v1/confirm, including the free one. What changes is symbol coverage, call volume and how much of the evidence comes back in the body. Read live from the pricing API:
Free responses omit reasons, details and the four raw component scores; action, decision, confidence, composite and coverage are never stripped on any tier.