OREStats

OREStats API v1

Các endpoint trả phí dưới /api/v1/*. Tất cả yêu cầu Authorization: Bearer ore_…. Đăng ký tại /pricing.

Đăng ký qua API

  1. POST /api/v1/subscribe với { ownerPubkey } — server trả về một nonce duy nhất + số lượng ORE.
  2. Gửi số lượng priceOre của ORE từ bước 1 đến địa chỉ treasury (trả về trong cùng phản hồi), kèm nonce như một instruction SPL Memo.
  3. PUT /api/v1/subscribe với { nonce, txSig, ownerPubkey } — server xác minh on-chain, kích hoạt gói, trả về khóa API của bạn.
  4. Dùng Authorization: Bearer ore_… header trên tất cả các lệnh gọi /api/v1/*.

Chi tiết thanh toán

Ví treasury: A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZF
Mint ORE: oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp
Mạng: Solana mainnet-beta
GET/api/v1/pricingcông khai

mục đích: Giá hiện tại (tính bằng ORE) cho một tháng truy cập. Giá tăng theo bậc khi nhiều người đăng ký tham gia — phản hồi cũng cho biết ngưỡng tiếp theo và giá sau đó.

phản hồi:
{
  "activeSubs": 17,
  "oreNow": 0.1,
  "nextThreshold": 100,
  "oreAtNextThreshold": 0.2,
  "treasury": "...",
  "oreMint": "..."
}
POST/api/v1/subscribecông khai

mục đích: Bước 1 của việc đăng ký. Trả về một instruction chuyển SPL dùng một lần (memo + amount) mà bạn phải ký bằng ví chủ sở hữu và phát lên Solana.

tham số:
  • ownerPubkeypubkey Solana base58 sẽ sở hữu khóa API
thân yêu cầu:
{ "ownerPubkey": "..." }
phản hồi:
{
  "nonce": "ore-pay-...",
  "priceOre": 0.1,
  "instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
  "expiresAt": "..."
}
PUT/api/v1/subscribecông khai

mục đích: Bước 2 của việc đăng ký. Sau khi lệnh chuyển SPL xác nhận, gửi chữ ký giao dịch để cấp khóa API. Khóa plaintext chỉ hiện MỘT LẦN.

tham số:
  • noncegiá trị trả về từ POST /subscribe
  • txSigchữ ký lệnh chuyển SPL đã xác nhận mang memo từ bước 1
  • ownerPubkeyphải khớp với ví đã trả tiền (và đã truyền cho POST)
thân yêu cầu:
{ "nonce": "...", "txSig": "...", "ownerPubkey": "..." }
phản hồi:
{
  "apiKey": "ore_xxx (shown ONCE)",
  "subscriberId": "sub_...",
  "paidUntil": "..."
}
GET/api/v1/livetrả phí (Bearer)

mục đích: Snapshot vòng hiện tại — mỗi ô đang giữ bao nhiêu ngay lúc này, số giây còn lại, và kết quả vòng trước. Rẻ; an toàn để poll mỗi 1-2 s.

phản hồi:
snapshot vòng hiện tại (deployed, count, secondsLeft, prevRound)
GET/api/v1/streamtrả phí (Bearer)

mục đích: Feed SSE của /live. Đẩy snapshot mới mỗi khi tài khoản board hoặc round on-chain thay đổi. Có thể kết nối lại bất cứ lúc nào — sự kiện kế tiếp luôn là trạng thái mới nhất.

phản hồi:
server-sent events; đẩy snapshot mỗi khi tài khoản board / round on-chain thay đổi
GET/api/v1/statstrả phí (Bearer)

mục đích: Thống kê lưới tổng hợp: chi bình phương trên tổng số lần trúng, số lần trúng & SOL triển khai theo từng ô, tổng SOL đã từng triển khai, biên nhà cái hữu hiệu.

phản hồi:
tổng hợp (chi bình phương, perGrid, totalDeployedSol, effectiveHouseEdge)
GET/api/v1/rounds?limit=100trả phí (Bearer)

mục đích: N vòng đã lập chỉ mục gần nhất, mới nhất trước. Dùng cho batch ingest; với cảnh báo vòng mới độ trễ thấp dùng /events/stream.

tham số:
  • limitsố vòng cần trả về; mặc định 100, tối đa 10000
phản hồi:
N vòng đã lập chỉ mục gần nhất (id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings)
GET/api/v1/rounds/{id}trả phí (Bearer)

mục đích: Chi tiết một vòng với id prev/next để duyệt lịch sử theo cursor.

tham số:
  • idid vòng (đoạn path)
phản hồi:
một vòng + id prev/next
GET/api/v1/grid/{n}?limit=200trả phí (Bearer)

mục đích: Thống kê theo ô cùng chuỗi hit/miss gần nhất (1 = trúng, 0 = trượt) để vẽ biểu đồ.

tham số:
  • nchỉ số ô 0..24 (đoạn path)
  • limitđộ dài chuỗi; mặc định 200
phản hồi:
thống kê từng ô + chuỗi hit/miss gần nhất (1 ≤ n ≤ 25)
GET/api/v1/events?since=N&limit=M&kind=Xtrả phí (Bearer)

mục đích: Log sự kiện theo polling. Bao gồm drought-broken, big-round, tier-crossing, milestone, thay đổi subscription. Lấy các sự kiện mới hơn cursor `since`.

tham số:
  • sincecursor id; chỉ trả về các sự kiện có id > since
  • limittối đa sự kiện mỗi lần gọi; mặc định 100
  • kindbộ lọc tùy chọn: drought_broken | big_round | tier | milestone | subscription
phản hồi:
{
  "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=Xtrả phí (Bearer)

mục đích: Feed SSE của cùng log sự kiện với /events. Phát lại 50 sự kiện gần nhất (hoặc các sự kiện kể từ cursor) khi kết nối, sau đó đẩy từng sự kiện mới trực tiếp.

tham số:
  • sincecursor replay tùy chọn; nếu bỏ qua, phát lại 50 sự kiện gần nhất
  • kindbộ lọc tùy chọn (cùng tập với /events)
phản hồi:
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=10000trả phí (Bearer)

mục đích: Xuất lịch sử hàng loạt — phân trang qua tất cả các vòng đã lập chỉ mục bằng cursor `from` / `nextFrom`. Dùng để khởi tạo cơ sở dữ liệu riêng, sau đó chuyển sang /events/stream để cập nhật tăng dần.

tham số:
  • fromid vòng bắt đầu (bao gồm)
  • toid vòng kết thúc tùy chọn (bao gồm)
  • limitcỡ trang; mặc định 5000, tối đa 10000
phản hồi:
{
  "count": 5000,
  "from": 228237,
  "to": 233236,
  "hasMore": true,
  "nextFrom": 233237,
  "rounds": [ { id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings }, ... ]
}
POST/api/v1/reissuecông khai

mục đích: Bước 1 của việc xoay khóa API. Trả về một tin nhắn bạn phải ký bằng ví sở hữu gói đăng ký đang hoạt động.

tham số:
  • ownerPubkeyví đã đăng ký ban đầu
thân yêu cầu:
{ "ownerPubkey": "..." }
phản hồi:
{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }
PUT/api/v1/reissuecông khai

mục đích: Bước 2 của xoay khóa. Gửi chữ ký ví; khóa cũ bị thu hồi ngay lập tức và một khóa mới được trả về (cũng chỉ hiện MỘT LẦN).

tham số:
  • noncegiá trị trả về từ POST /reissue
  • ownerPubkeycùng ví với POST
  • signatureBase64chữ ký ed25519 mã hóa base64 của chuỗi tin nhắn
thân yêu cầu:
{ "nonce": "...", "ownerPubkey": "...", "signatureBase64": "..." }
phản hồi:
{ "apiKey": "ore_xxx (NEW, old key revoked)", "subscriberId": "sub_...", "paidUntil": "..." }

Strategy Lab

Xây dựng, backtest và forward-test các chiến lược có tham số. Các endpoint create / backtest / analytics chia sẻ chung một dạng DSL — xem tham chiếu giá trị ở cuối phần này.

POST/api/v1/lab/strategiestrả phí (Bearer)

mục đích: Tạo một chiến lược. Khi đã active, OREStats tự động ghi nhận một dự đoán paper-trading cho mỗi vòng mới và đưa ra thống kê forward-test.

tham số:
  • namenhãn hiển thị, chuỗi không rỗng
  • dslStrategy DSL đầy đủ — base_strategy, params, filters[] tùy chọn. Xem tham chiếu giá trị bên dưới.
thân yêu cầu:
{
  "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 }
    ]
  }
}
phản hồi:
{
  "strategy": {
    "id": "...", "owner": "...", "name": "...",
    "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
    "createdAt": "...", "updatedAt": "...", "active": true
  }
}
GET/api/v1/lab/strategiestrả phí (Bearer)

mục đích: Liệt kê các chiến lược bạn sở hữu với thống kê forward-test trực tiếp (số vòng đã settle, số lần thắng, ROI trên kết quả vòng thực tế).

phản hồi:
{
  "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}trả phí (Bearer)

mục đích: Lấy một chiến lược bạn sở hữu, kèm số lượng dự đoán.

tham số:
  • idid chiến lược (đoạn path)
phản hồi:
{ "strategy": { ... }, "predictionCount": 412 }
PATCH/api/v1/lab/strategies/{id}trả phí (Bearer)

mục đích: Đổi tên một chiến lược hoặc bật/tắt cờ active. Các chiến lược inactive ngừng được dự đoán trên các vòng mới nhưng lịch sử của chúng được giữ lại.

tham số:
  • nametên hiển thị mới (tùy chọn)
  • activetrue để tiếp tục dự đoán, false để tạm dừng (tùy chọn)
thân yêu cầu:
{ "name": "renamed", "active": false }
phản hồi:
{ "strategy": { ... } }
DELETE/api/v1/lab/strategies/{id}trả phí (Bearer)

mục đích: Xóa cứng một chiến lược bạn sở hữu. Tất cả dự đoán liên kết bị xóa; bản ghi bảng xếp hạng (nếu có) biến mất.

tham số:
  • idid chiến lược (đoạn path)
phản hồi:
{ "ok": true }
GET/api/v1/lab/strategies/{id}/forwardtrả phí (Bearer)

mục đích: Thống kê forward-test cho một chiến lược: SOL ròng, ROI, tỉ lệ thắng, đường cong vốn, max drawdown, chuỗi thua dài nhất, vòng chưa settle.

tham số:
  • idid chiến lược (đoạn path)
phản hồi:
{
  "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/backtesttrả phí (Bearer)

mục đích: Phát lại một DSL trên các vòng lịch sử đã lập chỉ mục. Trả về BacktestResult đầy đủ gồm PnL theo từng vòng, đóng góp theo từng ô, đường cong vốn và lý do thoát sớm.

tham số:
  • dslStrategy DSL (cùng dạng với create)
  • fromRoundIdcận dưới bao gồm của cửa sổ phát lại tùy chọn
  • toRoundIdcận trên bao gồm tùy chọn
thân yêu cầu:
{
  "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
  "fromRoundId": 200000,
  "toRoundId": 247000
}
phản hồi:
{
  "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/analyticstrả phí (Bearer)

mục đích: Gói phân tích nặng — khoảng tin cậy Monte Carlo cộng với bốn backtest lồng nhau qua các quét tham số. Dự kiến 3-6 s ở lần gọi đầu, dưới một giây khi cache nóng. Khóa cache là DSL.

tham số:
  • dslStrategy DSL (cùng dạng với backtest)
thân yêu cầu:
{ "dsl": { ... } }
phản hồi:
{ "analytics": { ... } }
GET/api/v1/lab/leaderboardcông khai

mục đích: Danh sách chiến lược hàng đầu công khai. Chỉ ROI / cỡ mẫu được lộ; DSL bị ẩn cho đến khi người đăng ký xem endpoint chi tiết.

phản hồi:
{
  "generatedAt": "...",
  "minRoundsToQualify": 1000,
  "count": 14,
  "entries": [
    { "id": "...", "name": "...", "ownerShort": "abcd...wxyz", "roiPercent": ..., "roundsSettled": ... },
    ...
  ]
}
GET/api/v1/lab/leaderboard/{id}trả phí (Bearer)

mục đích: DSL đầy đủ của một mục bảng xếp hạng, kèm tóm tắt forward-test và đường cong vốn. Giới hạn cho người đăng ký — người dùng công khai chỉ thấy ROI top-line.

tham số:
  • idid chiến lược (đoạn path)
phản hồi:
{
  "strategy": {
    "id": "...", "name": "...", "ownerShort": "abcd...wxyz",
    "dsl": { ... },
    "createdAt": "..."
  },
  "forwardTest": {
    "roundsSettled": ...,
    "netProfitSol": ...,
    "equityCurve": [{ "round": ..., "balanceLamports": ... }, ...]
  }
}

Strategy DSL — giá trị được chấp nhận

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 < , <= , > , >= , ==

params.* khoảng số (server kẹp giá trị vượt ngoài):
  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

quotas:
  max 100 strategies per account

Giới hạn & sử dụng hợp lý

  • Mỗi khóa API: 5 req/giây (burst 60). 429 với Retry-After khi vượt quá.
  • Khóa API trong header là plaintext dùng một lần: hãy lưu lại — chúng tôi chỉ giữ hash.
  • Chia sẻ khóa có thể phát hiện được (IP đồng thời) và có thể bị thu hồi.
  • Các endpoint của bảng điều khiển (/api/live*) yêu cầu session trình duyệt + khớp Origin — chúng không dành cho sử dụng lập trình.