OREStats

OREStats API v1

유료 엔드포인트는 /api/v1/* 하위에 있습니다. 모두 Authorization: Bearer ore_… 가 필요합니다. 구독은 /pricing 에서 가능합니다.

API 로 구독하기

  1. POST /api/v1/subscribe 로 { ownerPubkey } 를 보내면 서버가 고유 nonce 와 ORE 금액을 반환합니다.
  2. 1단계의 priceOre 금액을 트레저리 주소 (동일 응답에 포함) 로 전송하고, nonce 를 SPL Memo 인스트럭션으로 첨부합니다.
  3. PUT /api/v1/subscribe 로 { nonce, txSig, ownerPubkey } 를 보내면 서버가 온체인을 검증하여 구독을 활성화하고 API 키를 반환합니다.
  4. 모든 /api/v1/* 호출에 Authorization: Bearer ore_… 헤더를 사용하세요.

결제 상세

트레저리 지갑: A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZF
ORE mint: oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp
네트워크: Solana mainnet-beta
GET/api/v1/pricing공개

용도: 1개월 액세스의 현재 가격 (ORE 단위). 구독자가 늘어날수록 가격이 단계적으로 상승합니다 — 응답에 다음 임계값과 그 너머의 가격이 포함됩니다.

응답:
{
  "activeSubs": 17,
  "oreNow": 0.1,
  "nextThreshold": 100,
  "oreAtNextThreshold": 0.2,
  "treasury": "...",
  "oreMint": "..."
}
POST/api/v1/subscribe공개

용도: 구독 1단계. 소유자 지갑으로 서명하고 Solana 에 브로드캐스트해야 하는 1회용 SPL 전송 인스트럭션 (memo + amount) 을 반환합니다.

파라미터:
  • ownerPubkeyAPI 키를 소유할 base58 Solana pubkey
요청 본문:
{ "ownerPubkey": "..." }
응답:
{
  "nonce": "ore-pay-...",
  "priceOre": 0.1,
  "instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
  "expiresAt": "..."
}
PUT/api/v1/subscribe공개

용도: 구독 2단계. SPL 전송이 확정된 후 tx 서명을 제출하여 API 키를 발급받습니다. 평문 키는 한 번만 표시됩니다.

파라미터:
  • noncePOST /subscribe 에서 반환된 값
  • txSig1단계의 memo 를 담은 확정된 SPL 전송 서명
  • ownerPubkey결제한 지갑과 일치해야 함 (POST 에 전달된 값)
요청 본문:
{ "nonce": "...", "txSig": "...", "ownerPubkey": "..." }
응답:
{
  "apiKey": "ore_xxx (shown ONCE)",
  "subscriberId": "sub_...",
  "paidUntil": "..."
}
GET/api/v1/live유료 (Bearer)

용도: 현재 라운드 스냅샷 — 지금 각 칸이 보유 중인 값, 남은 초, 직전 라운드 결과. 가벼우므로 1-2초마다 폴링해도 안전합니다.

응답:
현재 라운드 스냅샷 (deployed, count, secondsLeft, prevRound)
GET/api/v1/stream유료 (Bearer)

용도: /live 의 SSE 피드. 온체인 board 나 round 어카운트가 변경될 때마다 새 스냅샷을 푸시합니다. 언제든 재접속 가능 — 다음 이벤트는 항상 최신 상태입니다.

응답:
server-sent events; 온체인 board / round 어카운트가 변경될 때마다 스냅샷을 푸시합니다
GET/api/v1/stats유료 (Bearer)

용도: 집계된 그리드 통계: 누적 적중에 대한 카이제곱, 칸별 적중 횟수 & 배치 SOL, 누적 배치 SOL, 실효 하우스 엣지.

응답:
집계 (chi-squared, perGrid, totalDeployedSol, effectiveHouseEdge)
GET/api/v1/rounds?limit=100유료 (Bearer)

용도: 최근 N 개 인덱싱 라운드 (최신순). 배치 인제스트에 사용하세요; 저지연 신규 라운드 알림은 /events/stream 을 사용하세요.

파라미터:
  • limit반환할 라운드 수; 기본 100, 최대 10000
응답:
최근 N 개 인덱싱 라운드 (id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings)
GET/api/v1/rounds/{id}유료 (Bearer)

용도: 단일 라운드 상세와 이력 커서 순회를 위한 이전 / 다음 id.

파라미터:
  • id라운드 id (경로 세그먼트)
응답:
단일 라운드 + 이전 / 다음 id
GET/api/v1/grid/{n}?limit=200유료 (Bearer)

용도: 칸별 통계와 차트 렌더링용 최근 적중 / 미적중 시리즈 (1 = 적중, 0 = 미적중).

파라미터:
  • n칸 인덱스 0..24 (경로 세그먼트)
  • limit시리즈 길이; 기본 200
응답:
그리드별 통계 + 최근 적중 / 미적중 시리즈 (1 ≤ n ≤ 25)
GET/api/v1/events?since=N&limit=M&kind=X유료 (Bearer)

용도: 폴링용 이벤트 로그. drought-broken, big-round, tier-crossing, milestones, subscription changes 를 포함합니다. `since` 커서보다 새로운 이벤트를 가져옵니다.

파라미터:
  • sinceid 커서; id > since 인 이벤트만 반환
  • limit호출당 최대 이벤트 수; 기본 100
  • kind선택 필터: 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 },
    ...
  ]
}
GET/api/v1/events/stream?since=N&kind=X유료 (Bearer)

용도: /events 와 동일한 이벤트 로그의 SSE 피드. 접속 시 최근 50 이벤트 (또는 커서 이후 이벤트) 를 재생한 뒤 새 이벤트를 실시간으로 푸시합니다.

파라미터:
  • since선택 재생 커서; 생략 시 최근 50개를 재생
  • kind선택 필터 (/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).
GET/api/v1/dump?from=X&to=Y&limit=10000유료 (Bearer)

용도: 이력 대량 내보내기 — `from` / `nextFrom` 커서로 모든 인덱싱 라운드를 페이지 단위로 순회합니다. 자체 DB 부트스트랩에 사용한 뒤 증분 업데이트는 /events/stream 으로 전환하세요.

파라미터:
  • from시작 라운드 id (포함)
  • to선택 종료 라운드 id (포함)
  • limit페이지 크기; 기본 5000, 최대 10000
응답:
{
  "count": 5000,
  "from": 228237,
  "to": 233236,
  "hasMore": true,
  "nextFrom": 233237,
  "rounds": [ { id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings }, ... ]
}
POST/api/v1/reissue공개

용도: API 키 교체 1단계. 활성 구독을 소유한 지갑으로 서명해야 하는 메시지를 반환합니다.

파라미터:
  • ownerPubkey원래 구독한 지갑
요청 본문:
{ "ownerPubkey": "..." }
응답:
{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }
PUT/api/v1/reissue공개

용도: 교체 2단계. 지갑 서명을 제출하면 기존 키는 즉시 무효화되고 새 키가 반환됩니다 (역시 한 번만 표시).

파라미터:
  • noncePOST /reissue 에서 반환된 값
  • ownerPubkeyPOST 와 동일한 지갑
  • signatureBase64메시지 문자열에 대한 ed25519 서명의 base64 인코딩
요청 본문:
{ "nonce": "...", "ownerPubkey": "...", "signatureBase64": "..." }
응답:
{ "apiKey": "ore_xxx (NEW, old key revoked)", "subscriberId": "sub_...", "paidUntil": "..." }

Strategy Lab

파라미터화된 전략을 빌드, 백테스트, 포워드 테스트하세요. create / backtest / analytics 엔드포인트는 동일한 DSL 형태를 공유합니다 — 이 섹션 하단의 값 레퍼런스를 참고하세요.

POST/api/v1/lab/strategies유료 (Bearer)

용도: 전략 생성. 활성화되면 OREStats 가 매 신규 라운드마다 페이퍼 트레이딩 예측을 자동 기록하고 포워드 테스트 통계를 노출합니다.

파라미터:
  • name표시 라벨, 빈 문자열 불가
  • dsl전체 Strategy DSL — base_strategy, params, 선택 filters[]. 아래 값 레퍼런스 참고.
요청 본문:
{
  "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
  }
}
GET/api/v1/lab/strategies유료 (Bearer)

용도: 본인이 소유한 전략 목록을 라이브 포워드 테스트 통계 (정산된 라운드, 승수, 실제 라운드 결과 기반 ROI) 와 함께 반환합니다.

응답:
{
  "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}유료 (Bearer)

용도: 본인이 소유한 단일 전략을 예측 수와 함께 가져옵니다.

파라미터:
  • id전략 id (경로 세그먼트)
응답:
{ "strategy": { ... }, "predictionCount": 412 }
PATCH/api/v1/lab/strategies/{id}유료 (Bearer)

용도: 전략 이름 변경 또는 활성 플래그 토글. 비활성 전략은 신규 라운드에서 예측되지 않지만 이력은 보존됩니다.

파라미터:
  • name새 표시 이름 (선택)
  • activetrue 면 예측 재개, false 면 일시중지 (선택)
요청 본문:
{ "name": "renamed", "active": false }
응답:
{ "strategy": { ... } }
DELETE/api/v1/lab/strategies/{id}유료 (Bearer)

용도: 본인이 소유한 전략을 영구 삭제합니다. 연결된 모든 예측이 제거되며 리더보드 항목 (있다면) 도 사라집니다.

파라미터:
  • id전략 id (경로 세그먼트)
응답:
{ "ok": true }
GET/api/v1/lab/strategies/{id}/forward유료 (Bearer)

용도: 전략 하나에 대한 포워드 테스트 통계: 순 SOL, ROI, 승률, 자본 곡선, 최대 낙폭, 최대 연패, 정산 대기 라운드.

파라미터:
  • id전략 id (경로 세그먼트)
응답:
{
  "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/backtest유료 (Bearer)

용도: 인덱싱된 과거 라운드에 대해 DSL 을 리플레이합니다. 라운드별 PnL, 칸별 기여도, 자본 곡선, 조기 종료 사유를 포함한 전체 BacktestResult 를 반환합니다.

파라미터:
  • dslStrategy DSL (create 와 동일 형태)
  • fromRoundId선택 리플레이 윈도우의 하한 (포함)
  • toRoundId선택 상한 (포함)
요청 본문:
{
  "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":    [...]
  }
}
POST/api/v1/lab/analytics유료 (Bearer)

용도: 무거운 분석 번들 — 몬테카를로 신뢰 구간과 파라미터 스윕에 대한 4개 중첩 백테스트. 첫 호출은 3-6초, 워밍업 캐시에서는 1초 이내. 캐시 키는 DSL 입니다.

파라미터:
  • dslStrategy DSL (backtest 와 동일 형태)
요청 본문:
{ "dsl": { ... } }
응답:
{ "analytics": { ... } }
GET/api/v1/lab/leaderboard공개

용도: 공개 상위 전략 리스트. ROI / 샘플 크기만 노출되며 DSL 은 구독자가 상세 엔드포인트를 조회할 때까지 숨겨집니다.

응답:
{
  "generatedAt": "...",
  "minRoundsToQualify": 1000,
  "count": 14,
  "entries": [
    { "id": "...", "name": "...", "ownerShort": "abcd...wxyz", "roiPercent": ..., "roundsSettled": ... },
    ...
  ]
}
GET/api/v1/lab/leaderboard/{id}유료 (Bearer)

용도: 리더보드 항목 한 건의 전체 DSL 과 포워드 테스트 요약 및 자본 곡선. 구독자 전용 — 비구독자는 상단의 ROI 만 볼 수 있습니다.

파라미터:
  • id전략 id (경로 세그먼트)
응답:
{
  "strategy": {
    "id": "...", "name": "...", "ownerShort": "abcd...wxyz",
    "dsl": { ... },
    "createdAt": "..."
  },
  "forwardTest": {
    "roundsSettled": ...,
    "netProfitSol": ...,
    "equityCurve": [{ "round": ..., "balanceLamports": ... }, ...]
  }
}

Strategy DSL — 허용 값

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.* 수치 범위 (서버가 범위 밖 값을 클램프합니다):
  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

쿼터:
  max 100 strategies per account

제한 & 공정 사용

  • API 키당: 초당 5 요청 (버스트 60). 초과 시 Retry-After 와 함께 429 를 반환합니다.
  • 헤더의 API 키는 1회용 평문입니다: 반드시 보관하세요 — 서버에는 해시만 남습니다.
  • 키 공유는 감지됩니다 (동시 IP) 와 무효화의 사유가 될 수 있습니다.
  • 대시보드 엔드포인트 (/api/live*) 는 브라우저 세션 + Origin 매치가 필요합니다 — 프로그래밍 용도가 아닙니다.