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
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": { … }
}

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.