Public API

Developer Reference

Two JSON endpoints expose live ByKaranteli performance data. CORS-enabled, rate-limited, cached. No authentication required. Attribution in embedded content is appreciated.

Quick facts

Rate limit
20 / min / IP
429 on exceed with retry-after
Cache
5 min TTL
Cache-Control: public, max-age=300
CORS
Allow-Origin: *
GET + OPTIONS preflight supported
Auth
None
All endpoints public / read-only
Formats
JSON · CSV
append ?format=csv for spreadsheets
RSS
live closed-signal stream, 72h window
GET/api/public/performance

Aggregate live performance snapshot across 30 / 90 / 180 day windows, net PnL, PF, Sharpe, DD, side breakdown, daily equity curve.

Example request
curl -s https://bykaranteli.com/api/public/performance | jq '.windows."90d"'
Response shape (truncated)
{
  "generatedAt": "2026-04-21T06:47:00.000Z",
  "firstSignalAt": "2026-03-21T07:41:27.285Z",
  "lastSignalAt": "2026-04-21T06:45:12.507Z",
  "totalTrades": 104397,
  "windows": {
    "30d": {
      "trades": 90876, "wins": 45470, "losses": 45406, "ties": 0,
      "winRatePct": 50.04,
      "profitFactorGross": 1.5406, "profitFactorNet": 1.339,
      "avgNetBps": 35.94, "medianNetBps": 1.04,
      "avgWinBps": 283.70, "avgLossBps": -212.18,
      "sumNetBps": 3265831.81, "maxDrawdownBps": …,
      "sharpeAnnualized": …, "calmarAnnualized": …,
      "avgDurationMinutes": …
    },
    "90d": { … },
    "180d": { … }
  },
  "sideBreakdown": { "30d": { "LONG": {…}, "SHORT": {…} }, … },
  "equityCurve180d": [ { "day": "2026-03-21", "cumulativeNetBps": 35.94, "tradesToDate": 1 }, … ],
  "disclaimers": { "evalMode": "terminal", "feesIncluded": true, "slippageIncluded": true, "fundingIncluded": true, … }
}
GET/api/public/leaderboard

Strategy-level ranking computed per window with composite score = PF × √(trades/25) × winness.

Query parameters
NameTypeRequiredDescription
window30 | 90 | 180noLookback window in days. Default 90.
Example request
curl -s 'https://bykaranteli.com/api/public/leaderboard?window=90' | jq '.strategies[:5]'
Response shape (truncated)
{
  "generatedAt": "2026-04-21T06:47:00.000Z",
  "windowDays": 90,
  "minTradesQualified": 25,
  "totalStrategies": 14,
  "qualifiedCount": 11,
  "strategies": [
    {
      "strategy": "breakout_v3",
      "trades": 812, "longTrades": 450, "shortTrades": 362,
      "wins": 430, "losses": 382,
      "winRatePct": 52.96,
      "profitFactorNet": 1.42,
      "avgNetBps": 28.1, "sumNetBps": 22817.2,
      "maxDrawdownBps": 14203.5,
      "sharpeAnnualized": 1.18,
      "lastTradeAt": "2026-04-21T06:30:18.201Z",
      "qualified": true,
      "compositeScore": 5.74
    },
    …
  ],
  "disclaimers": { … }
}
GET/api/public/symbols

Per-symbol performance ranking (qualified + low-sample). Same shape as /strategies but keyed by signals.symbol.

Query parameters
NameTypeRequiredDescription
window30 | 90 | 180noLookback window in days. Default 90.
Example request
curl -s 'https://bykaranteli.com/api/public/symbols?window=90' | jq '.symbols[:5]'
Response shape (truncated)
{
  "generatedAt": "2026-04-21T06:47:00.000Z",
  "windowDays": 90,
  "minTradesQualified": 20,
  "totalSymbols": 48,
  "qualifiedCount": 36,
  "symbols": [
    {
      "symbol": "BTCUSDT",
      "trades": 3120, "longTrades": 1780, "shortTrades": 1340,
      "wins": 1610, "losses": 1480,
      "winRatePct": 52.1, "profitFactorNet": 1.28,
      "avgNetBps": 18.4, "sumNetBps": 57408.0,
      "bestTradeBps": 612.0, "worstTradeBps": -480.3,
      "maxDrawdownBps": 9821.4,
      "lastTradeAt": "2026-04-21T06:38:21.118Z",
      "qualified": true, "compositeScore": 4.82
    },
    …
  ]
}
GET/api/public/pressure

Composite 0-100 derivatives pressure score for every tracked Binance USDT-M perpetual (OI delta 1h/4h/24h + funding rate + basis). Direction-aware regimes.

Query parameters
NameTypeRequiredDescription
limit1-200noMax rows. Default 60.
sidelong | shortnoFilter by direction bias.
Example request
curl -s 'https://bykaranteli.com/api/public/pressure?limit=20&side=long' | jq '.items[:5]'
Response shape (truncated)
{
  "generatedAt": "2026-04-23T20:47:28.616Z",
  "count": 60,
  "items": [
    {
      "symbol": "BARDUSDT",
      "score": 45, "direction": "SHORT", "regime": "SHORT_RAMP",
      "regimeLabel": "Net short bias building",
      "components": { "oi24hPct": -8.7, "oi4hPct": 1.5, "oi1hPct": 0.1, "fundingRatePct": -0.037, "basisPct": -0.19 },
      "explainer": [ "Open interest down 8.7% over 24h", "Funding rate -0.037% per interval" ]
    },
    …
  ]
}
GET/api/public/pressure/[symbol]

Per-symbol pressure snapshot with live refresh if cache stale.

Example request
curl -s https://bykaranteli.com/api/public/pressure/BTCUSDT
GET/api/public/funding-arb

Cross-exchange funding rate spread for top symbols across 6 exchanges (Binance, OKX, Bybit, Gate, HTX, BingX) with net-of-cost annualized APR.

Example request
curl -s https://bykaranteli.com/api/public/funding-arb | jq '.rows[:5]'
GET/api/public/indices

All market indices in one payload: Retail Euphoria Index (proprietary) + Fear & Greed (alternative.me) + CoinGecko global + DeFiLlama stablecoin flow.

Example request
curl -s https://bykaranteli.com/api/public/indices | jq '.euphoria.score, .fearGreed.today.valueRaw'
GET/api/public/euphoria

Retail Euphoria Index standalone. Composite of F&G + trending memes + BTC dominance + top-30 crowd positioning.

Example request
curl -s https://bykaranteli.com/api/public/euphoria | jq '{score, regime, explainer}'
GET/api/public/signals/[id]

Verifiable signal receipt: SHA-256 fingerprint + all decision parameters + outcome. Accepts UUID or hex hash prefix.

Example request
curl -s https://bykaranteli.com/api/public/signals/d3fbb0e3-4aef-4a8b-9fa6-2da02401f07e | jq '{hash, shortCode, symbol, side, outcome, netBps}'
GET/embed/pressure/[symbol]

Embeddable HTML widget showing current pressure score for a symbol. Use in iframe. Dark theme, no tracking.

Example request
<iframe src="https://bykaranteli.com/embed/pressure/BTCUSDT" width="340" height="200" style="border:0"></iframe>
GET/api/public/recent

Last N closed signals within an H-hour window. Good for tickers, activity feeds, and notifications.

Query parameters
NameTypeRequiredDescription
hours1-168noWindow size in hours. Default 24, max 168 (7d).
limit1-100noMax signals. Default 20.
Example request
curl -s 'https://bykaranteli.com/api/public/recent?hours=24&limit=20' | jq '.signals[:5]'
Response shape (truncated)
{
  "generatedAt": "2026-04-21T06:47:00.000Z",
  "hours": 24,
  "total24h": 1247, "wins24h": 648, "losses24h": 572, "timeouts24h": 27,
  "net24hBps": 34219.8,
  "signals": [
    {
      "symbol": "ETHUSDT", "side": "LONG", "outcome": "TP1",
      "netBps": 182.4,
      "evaluatedAt": "2026-04-21T06:44:10.009Z",
      "createdAt":   "2026-04-21T05:58:01.301Z"
    },
    …
  ]
}

Embed example

Drop this into any HTML page. Numbers refresh every 5 minutes client-side.

<div id="bk-perf"></div>
<script>
  (async () => {
    const r = await fetch('https://bykaranteli.com/api/public/performance');
    const j = await r.json();
    const m = j.windows['90d'];
    const pct = (m.sumNetBps / 100).toFixed(2);
    document.getElementById('bk-perf').innerHTML =
      `<strong>ByKaranteli 90d:</strong> ${pct >= 0 ? '+' : ''}${pct}%
       · PF ${m.profitFactorNet?.toFixed(2)}
       · ${m.trades} trades
       · <a href="https://bykaranteli.com/performance">source</a>`;
  })();
  setInterval(() => location.reload(), 300000);
</script>

Fair use

  • Rate limit is 20 requests per minute per IP. Respect it or get 429'd.
  • Data is read-only. No PII or trading actions exposed.
  • Attribution: a visible link back to bykaranteli.com or the source page (e.g. /performance) is appreciated when embedding.
  • Commercial use is allowed. Rebranding our numbers as your own in-house backtest is not.
  • Scraping internal routes (/dashboard/*, /api/admin/*, /api/terminal/*) is blocked and monitored. Stick to /api/public/*.

Not investment advice.The numbers returned describe ByKaranteli's live signal-engine performance and are not a recommendation to trade. Past performance does not guarantee future returns.