Trade confirmation · /v1/confirm

Confirm a trade before you take it

API ▸ How to call this

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

Request
curl -H "X-API-Key: $SMARTMONEY_KEY" \
  "https://api.smartmoneyapi.com/v1/confirm?symbol=BTC&direction=long"
Response · 200captured live
{
  "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 action into CONFIRM / REDUCE / SKIP / ABSTAIN. ABSTAIN covers both LOW confidence and "there was no data". Use this one if you are branching in code; it has fewer edge cases than action.
confidencestring
"VETO"Bucketed composite: HIGH, MEDIUM, LOW, VETO, or NO_DATA. Not a probability. A HIGH does 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_score is always 0 by design: the X/Twitter sentiment input is switched off, and its weight is renormalised to 0 (see factors.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 false here does not mean bearish. It means unknown — that component was excluded, not counted as neutral.
unsupportedboolean
falsetrue only when the symbol is outside the tracked universe entirely — no derivatives and no whale data. In that case action is NO_DATA_SKIP, decision is ABSTAIN, and the scores are zeros that mean "not measured".
factorsobject
Per-component score, weight and weighted contribution — the composite's line items. The whale entry also carries staleness_factor and weight_effective: in the capture, whale consensus was stale, so its 0.30 weight was cut to 0.15. The on-chain entry carries source and available.
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_composite to give composite. 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. free means 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 with details and the four raw *_score fields.
metaobject
Proof-carrying provenance: the source table each number came from, its source_ts, its age_s, a per-source stale flag, the model_version, and expires_at. In the capture, stale: true because 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) and long (position) horizons. In the capture the medium horizon vetoes while short and long both come out LOW — a disagreement worth seeing rather than averaging away. Horizon access is tier-gated: Free gets medium, Trader adds short, Pro adds long.
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_backend and generation_time_ms so you know which model wrote it and how long it took. It reads the payload; it has no extra information. If it disagrees with composite, 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_version in your logs: when it changes, scores are not comparable across the boundary.

The five actions

CONFIRM_FULLconfidence HIGH · decision CONFIRM
The components that had data agree with your direction, and at least two of the three core factors are positive (a stacking gate demotes a lone-factor HIGH to MEDIUM). Read as: nothing in this data set argues against the trade you already decided to take.
CONFIRM_REDUCEDconfidence MEDIUM · decision REDUCE
A positive but modest composite. Support is real but thin, or one component is pulling the other way. Read as: the case is weaker than a full-size entry deserves.
CONFIRM_MINIMALconfidence LOW · decision ABSTAIN
Barely above zero. Read as: the data is not distinguishable from noise. Treat it as no information, not as weak support.
VETO_SKIPconfidence VETO · decision SKIP
Composite at or below zero, or a hard veto fired — an untradeable volatility regime, or a blacklisted symbol. Read as: this data set actively contradicts the trade. Check reasons and adjustments to see which part did.
NO_DATA_SKIPconfidence NO_DATA · decision ABSTAIN · unsupported: true
Neither derivatives nor whale data exists for the symbol. Read as: nothing was measured. This is deliberately a separate value from 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.source field 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.
  • confidence is not a probability. HIGH describes 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_mult and personalized are 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_SKIP exists 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:

Walk-forward OOS
49–52%
Leakage-free, our own study. Coin flip. Fixed figure, not live.
Confirm hit rate 24h
in-sample · loading
Tracked signals 4h
in-sample · loading
Profit factor
in-sample · loading

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
loading…
Trader
loading…
Pro
loading…

Free responses omit reasons, details and the four raw component scores; action, decision, confidence, composite and coverage are never stripped on any tier.

See all plans & pricing → Endpoint reference Try it in the console