OREStats

OREStats API v1

Endpoint berbayar di bawah /api/v1/*. Semua memerlukan Authorization: Bearer ore_…. Berlangganan di /pricing.

Berlangganan via API

  1. POST /api/v1/subscribe dengan { ownerPubkey } — server mengembalikan nonce unik + jumlah ORE.
  2. Kirim jumlah priceOre ORE dari langkah 1 ke alamat treasury (dikembalikan di respons yang sama), dengan menyertakan nonce sebagai instruksi SPL Memo.
  3. PUT /api/v1/subscribe dengan { nonce, txSig, ownerPubkey } — server memverifikasi on-chain, mengaktifkan langganan, mengembalikan API key Anda.
  4. Gunakan Authorization: Bearer ore_… header pada semua panggilan /api/v1/*.

Detail pembayaran

Wallet treasury: A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZF
Mint ORE: oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp
Jaringan: Solana mainnet-beta
GET/api/v1/pricingpublik

tujuan: Harga saat ini (dalam ORE) untuk satu bulan akses. Harga naik bertingkat saat subs bertambah — respons juga memberitahu threshold berikutnya dan harga setelahnya.

response:
{
  "activeSubs": 17,
  "oreNow": 0.1,
  "nextThreshold": 100,
  "oreAtNextThreshold": 0.2,
  "treasury": "...",
  "oreMint": "..."
}
POST/api/v1/subscribepublik

tujuan: Langkah 1 berlangganan. Mengembalikan instruksi transfer SPL sekali-pakai (memo + amount) yang harus Anda tandatangani dengan wallet pemilik dan broadcast di Solana.

parameter:
  • ownerPubkeypubkey Solana base58 yang akan memiliki API key
request body:
{ "ownerPubkey": "..." }
response:
{
  "nonce": "ore-pay-...",
  "priceOre": 0.1,
  "instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
  "expiresAt": "..."
}
PUT/api/v1/subscribepublik

tujuan: Langkah 2 berlangganan. Setelah transfer SPL terkonfirmasi, submit signature tx untuk mencetak API key Anda. Key plaintext ditampilkan SEKALI.

parameter:
  • noncenilai yang dikembalikan dari POST /subscribe
  • txSigsignature transfer SPL terkonfirmasi yang membawa memo dari langkah 1
  • ownerPubkeyharus cocok dengan wallet yang membayar (dan yang dikirim ke POST)
request body:
{ "nonce": "...", "txSig": "...", "ownerPubkey": "..." }
response:
{
  "apiKey": "ore_xxx (shown ONCE)",
  "subscriberId": "sub_...",
  "paidUntil": "..."
}
GET/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.

response:
snapshot ronde saat ini (deployed, count, secondsLeft, prevRound)
GET/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.

response:
server-sent events; mendorong snapshot pada setiap perubahan akun board / round on-chain
GET/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.

response:
agregat (chi kuadrat, perGrid, totalDeployedSol, effectiveHouseEdge)
GET/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.

parameter:
  • limitjumlah ronde yang dikembalikan; default 100, maks 10000
response:
N ronde terindeks terakhir (id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings)
GET/api/v1/rounds/{id}berbayar (Bearer)

tujuan: Detail ronde tunggal dengan id prev/next untuk traversal cursor pada riwayat.

parameter:
  • idid ronde (segmen path)
response:
ronde tunggal + id prev/next
GET/api/v1/grid/{n}?limit=200berbayar (Bearer)

tujuan: Statistik per-square plus seri hit/miss terkini (1 = hit, 0 = miss) untuk rendering chart.

parameter:
  • nindeks square 0..24 (segmen path)
  • limitpanjang seri; default 200
response:
statistik per-grid + seri hit/miss terkini (1 ≤ n ≤ 25)
GET/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`.

parameter:
  • sincecursor id; hanya event dengan id > since yang dikembalikan
  • limitmaks event per panggilan; default 100
  • kindfilter opsional: drought_broken | big_round | tier | milestone | subscription
response:
{
  "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 },
    ...
  ]
}
GET/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.

parameter:
  • sincecursor replay opsional; jika dihilangkan, memutar ulang 50 terakhir
  • kindfilter opsional (set yang sama dengan /events)
response:
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).
GET/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.

parameter:
  • fromid ronde awal (inklusif)
  • toid ronde akhir opsional (inklusif)
  • limitukuran halaman; default 5000, maks 10000
response:
{
  "count": 5000,
  "from": 228237,
  "to": 233236,
  "hasMore": true,
  "nextFrom": 233237,
  "rounds": [ { id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings }, ... ]
}
POST/api/v1/reissuepublik

tujuan: Langkah 1 rotasi API key. Mengembalikan pesan yang harus Anda tandatangani dengan wallet yang memiliki langganan aktif.

parameter:
  • ownerPubkeywallet yang awalnya berlangganan
request body:
{ "ownerPubkey": "..." }
response:
{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }
PUT/api/v1/reissuepublik

tujuan: Langkah 2 rotasi. Submit tanda tangan wallet; key lama dicabut segera dan key baru dikembalikan (juga ditampilkan SEKALI).

parameter:
  • noncenilai yang dikembalikan dari POST /reissue
  • ownerPubkeywallet yang sama dengan POST
  • signatureBase64tanda tangan ed25519 berenkode base64 dari string pesan
request body:
{ "nonce": "...", "ownerPubkey": "...", "signatureBase64": "..." }
response:
{ "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.

POST/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.

parameter:
  • namelabel tampilan, string non-kosong
  • dslStrategy DSL lengkap — base_strategy, params, filters[] opsional. Lihat referensi nilai di bawah.
request body:
{
  "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 }
    ]
  }
}
response:
{
  "strategy": {
    "id": "...", "owner": "...", "name": "...",
    "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
    "createdAt": "...", "updatedAt": "...", "active": true
  }
}
GET/api/v1/lab/strategiesberbayar (Bearer)

tujuan: Daftar strategi milik Anda dengan statistik forward-test live (ronde settled, jumlah menang, ROI pada hasil ronde nyata).

response:
{
  "count": 3,
  "strategies": [
    {
      "id": "...", "name": "...", "dsl": { ... }, "active": true,
      "stats": { "roundsSettled": 412, "roundsWon": 88, "netProfitSol": 0.123, "roiPercent": 4.7 }
    },
    ...
  ]
}
GET/api/v1/lab/strategies/{id}berbayar (Bearer)

tujuan: Ambil satu strategi milik Anda, dengan jumlah prediksinya.

parameter:
  • idid strategi (segmen path)
response:
{ "strategy": { ... }, "predictionCount": 412 }
PATCH/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.

parameter:
  • namenama tampilan baru (opsional)
  • activetrue untuk melanjutkan prediksi, false untuk jeda (opsional)
request body:
{ "name": "renamed", "active": false }
response:
{ "strategy": { ... } }
DELETE/api/v1/lab/strategies/{id}berbayar (Bearer)

tujuan: Hard delete strategi milik Anda. Semua prediksi terkait dihapus; entri leaderboard (jika ada) menghilang.

parameter:
  • idid strategi (segmen path)
response:
{ "ok": true }
GET/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.

parameter:
  • idid strategi (segmen path)
response:
{
  "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
}
POST/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.

parameter:
  • dslStrategy DSL (bentuk sama dengan create)
  • fromRoundIdbatas bawah inklusif jendela replay opsional
  • toRoundIdbatas atas inklusif opsional
request body:
{
  "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
  "fromRoundId": 200000,
  "toRoundId": 247000
}
response:
{
  "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":    [...]
  }
}
POST/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.

parameter:
  • dslStrategy DSL (bentuk sama dengan backtest)
request body:
{ "dsl": { ... } }
response:
{ "analytics": { ... } }
GET/api/v1/lab/leaderboardpublik

tujuan: Daftar strategi top publik. Hanya ROI / ukuran sampel yang diekspos; DSL disembunyikan hingga subscriber melihat endpoint detail.

response:
{
  "generatedAt": "...",
  "minRoundsToQualify": 1000,
  "count": 14,
  "entries": [
    { "id": "...", "name": "...", "ownerShort": "abcd...wxyz", "roiPercent": ..., "roundsSettled": ... },
    ...
  ]
}
GET/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.

parameter:
  • idid strategi (segmen path)
response:
{
  "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-After jika 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.