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-afterCache
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/performanceAggregate 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/leaderboardStrategy-level ranking computed per window with composite score = PF × √(trades/25) × winness.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| window | 30 | 90 | 180 | no | Lookback 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.