OREStats API v1
Endpoint berbayar di bawah /api/v1/*. Semua memerlukan Authorization: Bearer ore_…. Berlangganan di /pricing.
Berlangganan via API
- POST /api/v1/subscribe dengan
{ ownerPubkey }— server mengembalikan nonce unik + jumlah ORE. - Kirim jumlah priceOre ORE dari langkah 1 ke alamat treasury (dikembalikan di respons yang sama), dengan menyertakan nonce sebagai instruksi SPL Memo.
- PUT /api/v1/subscribe dengan
{ nonce, txSig, ownerPubkey }— server memverifikasi on-chain, mengaktifkan langganan, mengembalikan API key Anda. - Gunakan
Authorization: Bearer ore_…header pada semua panggilan /api/v1/*.
Detail pembayaran
A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZForeoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp/api/v1/pricingpubliktujuan: Harga saat ini (dalam ORE) untuk satu bulan akses. Harga naik bertingkat saat subs bertambah — respons juga memberitahu threshold berikutnya dan harga setelahnya.
{
"activeSubs": 17,
"oreNow": 0.1,
"nextThreshold": 100,
"oreAtNextThreshold": 0.2,
"treasury": "...",
"oreMint": "..."
}/api/v1/subscribepubliktujuan: Langkah 1 berlangganan. Mengembalikan instruksi transfer SPL sekali-pakai (memo + amount) yang harus Anda tandatangani dengan wallet pemilik dan broadcast di Solana.
ownerPubkey— pubkey Solana base58 yang akan memiliki API key
{ "ownerPubkey": "..." }{
"nonce": "ore-pay-...",
"priceOre": 0.1,
"instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
"expiresAt": "..."
}/api/v1/subscribepubliktujuan: Langkah 2 berlangganan. Setelah transfer SPL terkonfirmasi, submit signature tx untuk mencetak API key Anda. Key plaintext ditampilkan SEKALI.
nonce— nilai yang dikembalikan dari POST /subscribetxSig— signature transfer SPL terkonfirmasi yang membawa memo dari langkah 1ownerPubkey— harus cocok dengan wallet yang membayar (dan yang dikirim ke POST)
{ "nonce": "...", "txSig": "...", "ownerPubkey": "..." }{
"apiKey": "ore_xxx (shown ONCE)",
"subscriberId": "sub_...",
"paidUntil": "..."
}/api/v1/liveberbayar (Bearer)tujuan: Snapshot ronde saat ini — apa yang dipegang setiap square sekarang, detik tersisa, dan hasil ronde terakhir. Murah; aman untuk polling setiap 1-2 detik.
snapshot ronde saat ini (deployed, count, secondsLeft, prevRound)
/api/v1/streamberbayar (Bearer)tujuan: Feed SSE dari /live. Mendorong snapshot baru setiap kali akun board atau round on-chain berubah. Reconnect kapan saja — event berikutnya selalu state terkini.
server-sent events; mendorong snapshot pada setiap perubahan akun board / round on-chain
/api/v1/statsberbayar (Bearer)tujuan: Statistik grid teragregat: chi kuadrat pada hits kumulatif, jumlah hit & SOL dideploy per square, total SOL yang pernah dideploy, house edge efektif.
agregat (chi kuadrat, perGrid, totalDeployedSol, effectiveHouseEdge)
/api/v1/rounds?limit=100berbayar (Bearer)tujuan: N ronde terindeks terakhir, terbaru dulu. Gunakan ini untuk batch ingest; untuk alert ronde baru latensi rendah gunakan /events/stream.
limit— jumlah ronde yang dikembalikan; default 100, maks 10000
N ronde terindeks terakhir (id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings)
/api/v1/rounds/{id}berbayar (Bearer)tujuan: Detail ronde tunggal dengan id prev/next untuk traversal cursor pada riwayat.
id— id ronde (segmen path)
ronde tunggal + id prev/next
/api/v1/grid/{n}?limit=200berbayar (Bearer)tujuan: Statistik per-square plus seri hit/miss terkini (1 = hit, 0 = miss) untuk rendering chart.
n— indeks square 0..24 (segmen path)limit— panjang seri; default 200
statistik per-grid + seri hit/miss terkini (1 ≤ n ≤ 25)
/api/v1/events?since=N&limit=M&kind=Xberbayar (Bearer)tujuan: Log event polling. Mencakup drought-broken, big-round, tier-crossing, milestone, perubahan langganan. Tarik event lebih baru dari cursor `since`.
since— cursor id; hanya event dengan id > since yang dikembalikanlimit— maks event per panggilan; default 100kind— filter opsional: drought_broken | big_round | tier | milestone | subscription
{
"count": 12,
"lastId": 47,
"events": [
{ "id": 47, "ts": "...", "kind": "drought_broken", "grid": 8, "drought": 91, "roundId": 247101 },
{ "id": 48, "ts": "...", "kind": "big_round", "roundId": 247155, "deployedSol": 8.94, "thresholdSol": 8.15, "multiplier": 1.10, "winningSquare": 12, "totalMiners": 209 },
...
]
}/api/v1/events/stream?since=N&kind=Xberbayar (Bearer)tujuan: Feed SSE dari log event yang sama dengan /events. Memutar ulang 50 event terakhir (atau event sejak cursor) saat connect, lalu mendorong setiap event baru secara live.
since— cursor replay opsional; jika dihilangkan, memutar ulang 50 terakhirkind— filter opsional (set yang sama dengan /events)
server-sent events; replays last 50 (or events since cursor) on connect, then pushes each new event as it fires (drought / streak / big round / tier / milestone / subscription).
/api/v1/dump?from=X&to=Y&limit=10000berbayar (Bearer)tujuan: Ekspor historis bulk — paginasi semua ronde terindeks via cursor `from` / `nextFrom`. Gunakan ini untuk bootstrap database Anda sendiri, lalu beralih ke /events/stream untuk update inkremental.
from— id ronde awal (inklusif)to— id ronde akhir opsional (inklusif)limit— ukuran halaman; default 5000, maks 10000
{
"count": 5000,
"from": 228237,
"to": 233236,
"hasMore": true,
"nextFrom": 233237,
"rounds": [ { id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings }, ... ]
}/api/v1/reissuepubliktujuan: Langkah 1 rotasi API key. Mengembalikan pesan yang harus Anda tandatangani dengan wallet yang memiliki langganan aktif.
ownerPubkey— wallet yang awalnya berlangganan
{ "ownerPubkey": "..." }{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }/api/v1/reissuepubliktujuan: Langkah 2 rotasi. Submit tanda tangan wallet; key lama dicabut segera dan key baru dikembalikan (juga ditampilkan SEKALI).
nonce— nilai yang dikembalikan dari POST /reissueownerPubkey— wallet yang sama dengan POSTsignatureBase64— tanda tangan ed25519 berenkode base64 dari string pesan
{ "nonce": "...", "ownerPubkey": "...", "signatureBase64": "..." }{ "apiKey": "ore_xxx (NEW, old key revoked)", "subscriberId": "sub_...", "paidUntil": "..." }Strategy Lab
Bangun, backtest, dan forward-test strategi yang ter-parameterisasi. Endpoint create / backtest / analytics berbagi satu bentuk DSL — lihat referensi nilai di bagian bawah seksi ini.
/api/v1/lab/strategiesberbayar (Bearer)tujuan: Membuat strategi. Setelah aktif, OREStats otomatis mencatat prediksi paper-trading untuk setiap ronde baru dan menampilkan statistik forward-test.
name— label tampilan, string non-kosongdsl— Strategy DSL lengkap — base_strategy, params, filters[] opsional. Lihat referensi nilai di bawah.
{
"name": "my cold-5",
"dsl": {
"base_strategy": "cold",
"params": {
"bet_size_lamports": 200000,
"num_squares": 5,
"sizing_mode": "flat",
"max_bet_per_square_lamports": 5000000,
"tx_fee_lamports": 10000
},
"filters": [
{ "metric": "current_drought_min", "op": ">=", "value": 30 }
]
}
}{
"strategy": {
"id": "...", "owner": "...", "name": "...",
"dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
"createdAt": "...", "updatedAt": "...", "active": true
}
}/api/v1/lab/strategiesberbayar (Bearer)tujuan: Daftar strategi milik Anda dengan statistik forward-test live (ronde settled, jumlah menang, ROI pada hasil ronde nyata).
{
"count": 3,
"strategies": [
{
"id": "...", "name": "...", "dsl": { ... }, "active": true,
"stats": { "roundsSettled": 412, "roundsWon": 88, "netProfitSol": 0.123, "roiPercent": 4.7 }
},
...
]
}/api/v1/lab/strategies/{id}berbayar (Bearer)tujuan: Ambil satu strategi milik Anda, dengan jumlah prediksinya.
id— id strategi (segmen path)
{ "strategy": { ... }, "predictionCount": 412 }/api/v1/lab/strategies/{id}berbayar (Bearer)tujuan: Ubah nama strategi atau toggle flag aktifnya. Strategi tidak aktif berhenti diprediksi pada ronde baru tetapi riwayatnya tetap dipertahankan.
name— nama tampilan baru (opsional)active— true untuk melanjutkan prediksi, false untuk jeda (opsional)
{ "name": "renamed", "active": false }{ "strategy": { ... } }/api/v1/lab/strategies/{id}berbayar (Bearer)tujuan: Hard delete strategi milik Anda. Semua prediksi terkait dihapus; entri leaderboard (jika ada) menghilang.
id— id strategi (segmen path)
{ "ok": true }/api/v1/lab/strategies/{id}/forwardberbayar (Bearer)tujuan: Statistik forward-test untuk satu strategi: net SOL, ROI, win rate, kurva equity, max drawdown, max losing streak, ronde pending unsettled.
id— id strategi (segmen path)
{
"strategyId": "...",
"roundsObserved": 432,
"roundsBet": 412, "roundsWon": 88,
"squaresBet": 2060, "squaresWon": 92,
"netProfitSol": 0.12, "totalStakeSol": 2.6,
"roiPercent": 4.7, "winRate": 0.21, "perSquareWinRate": 0.045,
"maxDrawdownSol": 0.08, "maxStreak": 12,
"equityCurve": [{ "round": 247001, "balanceLamports": 0 }, ...],
"pendingCount": 1
}/api/v1/lab/backtestberbayar (Bearer)tujuan: Replay DSL terhadap ronde historis terindeks. Mengembalikan BacktestResult lengkap termasuk PnL per ronde, kontribusi per-square, kurva equity, dan alasan early-exit.
dsl— Strategy DSL (bentuk sama dengan create)fromRoundId— batas bawah inklusif jendela replay opsionaltoRoundId— batas atas inklusif opsional
{
"dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
"fromRoundId": 200000,
"toRoundId": 247000
}{
"result": {
"totalRounds": 47000, "roundsBet": 9200, "roundsWon": 1800,
"squaresBet": 46000, "squaresWonOn": 1900,
"netProfitLamports": ..., "netProfitSol": ...,
"totalStakeLamports": ..., "totalStakeSol": ...,
"totalRecoveryLamports": ..., "totalRecoverySol": ...,
"roiPercent": ..., "winRate": ..., "perSquareWinRate": ...,
"maxStreak": ..., "capHits": ..., "totalCapLossSol": ...,
"minWalletSol": ..., "maxDrawdownSol": ...,
"rangeMin": 200000, "rangeMax": 247000,
"exitedEarly": null,
"exitRoundId": 0,
"equityCurve": [{ "round": ..., "balanceLamports": ... }, ...],
"perSquare": [{ "square": 0, "betCount": ..., "winCount": ..., "netLamports": ... }, ...],
"perRoundPnlLamports": [...],
"streakRunLengths": [...]
}
}/api/v1/lab/analyticsberbayar (Bearer)tujuan: Bundle analitik berat — confidence interval Monte Carlo plus empat backtest bersarang lintas parameter sweep. Perkirakan 3-6 detik pada panggilan pertama, sub-detik pada cache hangat. Cache key adalah DSL.
dsl— Strategy DSL (bentuk sama dengan backtest)
{ "dsl": { ... } }{ "analytics": { ... } }/api/v1/lab/leaderboardpubliktujuan: Daftar strategi top publik. Hanya ROI / ukuran sampel yang diekspos; DSL disembunyikan hingga subscriber melihat endpoint detail.
{
"generatedAt": "...",
"minRoundsToQualify": 1000,
"count": 14,
"entries": [
{ "id": "...", "name": "...", "ownerShort": "abcd...wxyz", "roiPercent": ..., "roundsSettled": ... },
...
]
}/api/v1/lab/leaderboard/{id}berbayar (Bearer)tujuan: DSL lengkap dari satu entri leaderboard, plus ringkasan forward-test dan kurva equity-nya. Dibatasi ke subscriber — pengguna publik hanya melihat ROI baris atas.
id— id strategi (segmen path)
{
"strategy": {
"id": "...", "name": "...", "ownerShort": "abcd...wxyz",
"dsl": { ... },
"createdAt": "..."
},
"forwardTest": {
"roundsSettled": ...,
"netProfitSol": ...,
"equityCurve": [{ "round": ..., "balanceLamports": ... }, ...]
}
}Strategy DSL — nilai yang diterima
base_strategy — cold, spread, drought, custom_squares, hot, top_hit_rate, bottom_hit_rate, recent_winners, anti_spread, min_miners, corners, edges, center_block, diagonal_main, diagonal_anti, row, column, checkerboard, all_25
params.sizing_mode — flat, martingale, reverse_martingale, fibonacci, dalembert, kelly
filters[].metric — rounds_since_last_big, consecutive_losses, current_drought_min, current_drought_max, total_deployed_pctile, total_miners, rounds_since_big_round, chi_square_p_recent
filters[].op — < , <= , > , >= , ==
rentang numerik params.* (server clamp nilai di luar rentang): bet_size_lamports required, (0, 1e8] num_squares 1..25 drought_threshold 1..1000 custom_squares int[] in 0..24 hit_rate_lookback 50..20000 row_index, column_index 0..4 martingale_multiplier 1..10 loss_streak_threshold 1..100 dalembert_step_lamports 1..1e6 kelly_fraction 0.0001..1 kelly_bankroll_lamports >= 1 max_bet_per_square_lamports 1..1e8 tx_fee_lamports 0..1e7 stop_loss_streak 1..1000 cooldown_after_loss_rounds 0..500 take_profit_lamports >= 0 session_stop_loss_lamports >= 0 kuota: max 100 strategies per account
Batas & fair use
- Per API key: 5 req/detik (burst 60). 429 dengan
Retry-Afterjika overflow. - API key di header berupa plaintext sekali pakai: simpan key tersebut — hanya hash yang kami simpan.
- Berbagi key dapat terdeteksi (IP konkuren) dan dapat memicu pencabutan.
- Endpoint dashboard (
/api/live*) memerlukan sesi browser + Origin yang cocok — bukan untuk penggunaan programatik.