API Reference

Grade strategies and track records programmatically, pull market intelligence, and embed verified badges. Everything below is the real, live surface — no aspirational endpoints.

Base URL & authentication

Base URL:  https://anonimous.net/tessen-api

Authenticated endpoints take an API key header:
  X-API-Key: tsn_live_...

Generate keys in the Studio under Developer Keys (beta access required). The raw key is shown onceat creation — store it securely; afterwards only a masked preview exists, and we can't recover it. Revoke and re-issue any time. Tiers are metered on a rolling 30-day window: Free = 100 calls, Developer ($29 one-time, no auto-renew) = 5,000 calls. The badge and public-grade endpoints need no key at all.

Grade an AgentSpec

POST/v1/api/grade/spec

Submit a strategy specification; Tessen backtests it on its own engine and historical data and returns the full Grade report. Because the inputs can't be faked, the result is marked verified: true and gets a permanent public proof page.

curl -X POST https://anonimous.net/tessen-api/v1/api/grade/spec \
  -H "X-API-Key: tsn_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "agentSpec": {
      "name": "rsi-bounce",
      "universe": ["BTC_USDT", "ETH_USDT", "SOL_USDT"],
      "timeframe": "1h",
      "entry": {
        "type": "rule",
        "logic": "all",
        "long":  [{"indicator": "rsi", "period": 14, "op": "<", "value": 30}],
        "short": []
      },
      "exit": {"take_profit_pct": 3.0, "stop_loss_pct": 1.5},
      "risk": {"risk_per_trade_pct": 1.0}
    }
  }'

Grade your own track record

POST/v1/api/grade/record

Submit real trade history instead of a spec — minimum 30 trades. The same gates and scoring run on it. Trades are ordered chronologically and split 60/40 (train/test) for the overfit check, so don't pre-split. Since the data is self-supplied it's marked verified: false — shown as "Checked", never "Verified". Returns are treated as already net of your costs (a conservative proxy: it can understate your edge, never overstate it).

curl -X POST https://anonimous.net/tessen-api/v1/api/grade/record \
  -H "X-API-Key: tsn_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "risk_per_trade_pct": 1.0,
    "trades": [
      {"symbol": "BTC_USDT", "entry_ts": 1735689600, "net_return_pct": 1.4},
      {"symbol": "ETH_USDT", "entry_ts": 1735776000, "net_return_pct": -0.8}
      // ... at least 30 total
    ]
  }'

Market intelligence snapshot

GET/v1/api/lumen/snapshot

The current cross-venue Lumen snapshot — positioning, funding, and open-interest signals, each labeled validated or information-only, exactly as the in-app page shows them. Returns 503 if the intelligence pipeline is briefly unavailable rather than serving stale data silently.

curl https://anonimous.net/tessen-api/v1/api/lumen/snapshot \
  -H "X-API-Key: tsn_live_..."

Public proof endpoints (no key)

GET/v1/grade/{gradeId}
GET/v1/badge/{gradeId}.svg

Every grade gets a permanent ID. The JSON endpoint returns the stored report; the SVG badge embeds on any site (cached 5 minutes) and links honesty into your README or landing page:

<a href="https://tessen-pi.vercel.app/verify/GRADE_ID">
  <img src="https://anonimous.net/tessen-api/v1/badge/GRADE_ID.svg" />
</a>

The AgentSpec schema

A flat single-sleeve spec (shown above) or a multi-sleeve one via sleeves: []. All fields:

{
  "name": "string",
  "universe": ["BTC_USDT", ...],        // symbols, BASE_QUOTE format
  "sleeves": [{                          // OR flat: timeframe/entry/exit at top level
    "name": "string",
    "timeframe": "5m|15m|1h|4h|1d",
    "entry": {
      "type": "rule" | "confluence",
      "logic": "all" | "any",            // rule mode: how signals combine
      "long":  [Signal], "short": [Signal],
      "vote_threshold": 3                // confluence mode
    },
    "exit": {
      "take_profit_pct": 3.0,            // all optional; combine freely
      "stop_loss_pct": 1.5,
      "time_exit_bars": 48,
      "cat_stop_atr": 3.0,               // catastrophic ATR stop
      "trail_atr": 2.0,                  // ATR trailing stop distance
      "breakeven_atr": 1.0,              // favorable ATRs that arm the trail at breakeven
      "partial_lock_atr": 1.5,           // favorable ATRs that trigger a partial close
      "partial_lock_pct": 0.5            // fraction closed at that trigger
    },
    "regime": {                          // optional entry filters
      "adx_gt": 20,                      // require ADX(14) above x
      "atr_pct_tercile": "high" | "low"  // volatility tercile gate
    },
    "confirm": [{                        // optional higher-timeframe confirmation
      "timeframe": "4h",
      "long": [Signal], "short": [Signal], "logic": "all"
    }],
    "confirm_k": 1                       // how many confirms must agree (0 = off)
  }],
  "risk": {
    "risk_per_trade_pct": 1.0,
    "leverage_cap": 20.0,
    "max_daily_loss_pct": 5.0,
    "max_dd_halt_pct": 25.0
  }
}

Signal = {
  "indicator": "rsi|ema|roc|cmf|adx|atr|bb_pband|macd_hist|stoch",
  "period": 14,
  "op": "<" | ">" | "<=" | ">=",
  "value": 30
}

Order-flow & derivatives indicators

Beyond price-derived indicators, a signal can reference cross-venue market data we collect ourselves: funding_annual, ls_div (crowd divergence — retail vs. top-trader long/short positioning, a validated Lumen signal), oi_usd, ob_imb (order-book imbalance), spread_bp, taker_bs, basis_bp, and cvd_delta. period is a rolling-mean smoothing window in bars (1 = raw value), not a percentile.

Honesty note: this data collection started 2026-06-29 and the history is short and growing every day. A strategy built on these indicators will often — correctly — hit the "insufficient out-of-sample trades" gate until enough days accumulate. We'd rather show that than fabricate a grade from too little data.

The Grade report

Both grading endpoints return the same shape:

{
  "gradeId": "…",                  // permanent — /verify/:id and the badge use it
  "verified": true,                 // true = spec mode (our engine), false = record mode
  "grade": "A".."F",               // F whenever any gate fails, regardless of score
  "passed_gate": true,
  "gate": {                         // the five hard checks
    "oos_expectancy_positive": true,
    "clears_cost_hurdle": true,     // gross edge >= 1.5x trading costs
    "robust_across_assets": true,   // >= 60% of traded assets individually profitable
    "survivable_drawdown": true,    // sized median max-DD <= 35%
    "not_overfit": true             // OOS holds >= 50% of train expectancy
  },
  "scores": {                       // 0-100 components of the letter
    "edge": 61.1, "robustness": 100.0, "risk": 5.8,
    "execution": 50.0,              // held at 50 until real fills are measured — disclosed
    "live": 0.0,                    // grows only with a live track record
    "weighted": 59.7
  },
  "headline": {
    "oos_trades": 8733,             // out-of-sample sample size — check this first
    "net_expectancy_bp": 7.33,      // THE metric: net expectancy per trade, basis points
    "total_return_pct": 64.1,
    "rr": 0.44,                     // avg win / avg loss
    "win_rate_pct": 71.2            // context only — never a greenlight
  },
  "sizing": {
    "risk_per_trade_pct": 1.0,
    "notional_per_equity": 0.32,    // responsible leverage implied by your risk setting
    "sized_maxdd": 0.33             // median max drawdown at that sizing (Monte-Carlo)
  },
  "per_asset": { "BTC_USDT": {"n": 512, "exp": 0.0004, ...}, ... },
  "reason": null                    // set when an F is structural, e.g. "<30 OOS trades"
}

Errors & limits

401  missing or invalid X-API-Key
422  invalid AgentSpec (message says which field), or < 30 trades in record mode
429  tier call limit reached (rolling 30 days), or public-endpoint rate limit
500  engine error — our fault, not billed against your quota
503  lumen snapshot temporarily unavailable

No SDKs yet — the API is deliberately small and plain JSON over HTTPS. If you build something on it, we'd genuinely like to see it: reach us via the waitlist form or the in-app feedback widget.