OREStats

OREStats API v1

Платные эндпоинты под /api/v1/*. Все требуют Authorization: Bearer ore_…. Подписаться: /pricing.

Подписка через API

  1. POST /api/v1/subscribe с { ownerPubkey } — сервер возвращает уникальный nonce + сумму ORE.
  2. Отправьте сумму priceOre в ORE из шага 1 на адрес казначейства (возвращён в том же ответе), прикрепив nonce инструкцией SPL Memo.
  3. PUT /api/v1/subscribe с { nonce, txSig, ownerPubkey } — сервер проверяет on-chain, активирует подписку и возвращает ваш API-ключ.
  4. Используйте заголовок Authorization: Bearer ore_… во всех вызовах /api/v1/*.

Детали оплаты

Кошелёк казначейства: A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZF
Mint ORE: oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp
Сеть: Solana mainnet-beta
GET/api/v1/pricingпубличный

назначение: Текущая цена (в ORE) за месяц доступа. Цена растёт по мере подключения новых подписчиков — ответ также сообщает следующий порог и цену за ним.

ответ:
{
  "activeSubs": 17,
  "oreNow": 0.1,
  "nextThreshold": 100,
  "oreAtNextThreshold": 0.2,
  "treasury": "...",
  "oreMint": "..."
}
POST/api/v1/subscribeпубличный

назначение: Шаг 1 подписки. Возвращает одноразовую SPL-инструкцию перевода (memo + сумма), которую нужно подписать кошельком владельца и опубликовать в Solana.

параметры:
  • ownerPubkeybase58 Solana pubkey, который будет владеть API-ключом
тело запроса:
{ "ownerPubkey": "..." }
ответ:
{
  "nonce": "ore-pay-...",
  "priceOre": 0.1,
  "instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
  "expiresAt": "..."
}
PUT/api/v1/subscribeпубличный

назначение: Шаг 2 подписки. После подтверждения SPL-перевода отправьте подпись транзакции, чтобы выпустить API-ключ. Открытый ключ показывается ОДИН раз.

параметры:
  • nonceзначение, возвращённое из POST /subscribe
  • txSigподтверждённая подпись SPL-перевода, несущая memo из шага 1
  • 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)

назначение: SSE-поток /live. Присылает свежий снимок всякий раз, когда меняется on-chain аккаунт board или round. Переподключайтесь когда угодно — следующее событие всегда содержит последнее состояние.

ответ:
server-sent events; присылает снимок при каждом изменении on-chain аккаунта board / round
GET/api/v1/statsплатный (Bearer)

назначение: Агрегированная статистика по сетке: хи-квадрат по накопленным попаданиям, число попаданий и размещённый SOL по клеткам, всего размещённый SOL, эффективная доля казино.

ответ:
агрегаты (хи-квадрат, 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 prev/next для курсорного обхода истории.

параметры:
  • idid раунда (сегмент пути)
ответ:
один раунд + id prev/next
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, переходы тарифов, вехи, изменения подписок. Получайте события новее курсора `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)

назначение: SSE-поток того же журнала, что и /events. При подключении воспроизводит последние 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`. Используйте для первичного наполнения своей БД, затем переключайтесь на /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публичный

назначение: Шаг 1 ротации API-ключа. Возвращает сообщение, которое нужно подписать кошельком — владельцем активной подписки.

параметры:
  • ownerPubkeyкошелёк, изначально оформивший подписку
тело запроса:
{ "ownerPubkey": "..." }
ответ:
{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }
PUT/api/v1/reissueпубличный

назначение: Шаг 2 ротации. Отправьте подпись кошелька; старый ключ немедленно отзывается, возвращается новый (также показан ОДИН раз).

параметры:
  • nonceзначение, возвращённое из POST /reissue
  • ownerPubkeyтот же кошелёк, что и в POST
  • signatureBase64base64-кодированная ed25519 подпись строки сообщения
тело запроса:
{ "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)

назначение: Список ваших стратегий с live-статистикой форвард-теста (число расчётных раундов, число побед, 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)

назначение: Получить одну вашу стратегию с числом её прогнозов.

параметры:
  • idid стратегии (сегмент пути)
ответ:
{ "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)

назначение: Жёстко удалить вашу стратегию. Все связанные прогнозы удаляются; запись в рейтинге (если есть) исчезает.

параметры:
  • idid стратегии (сегмент пути)
ответ:
{ "ok": true }
GET/api/v1/lab/strategies/{id}/forwardплатный (Bearer)

назначение: Статистика форвард-теста для одной стратегии: чистый SOL, ROI, win rate, кривая equity, max drawdown, максимальная серия поражений, ожидающие нерассчитанные раунды.

параметры:
  • idid стратегии (сегмент пути)
ответ:
{
  "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 по проиндексированной истории раундов. Возвращает полный BacktestResult: PnL по раундам, вклад по клеткам, кривая equity и причина раннего выхода.

параметры:
  • 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)

назначение: Тяжёлый блок аналитики — доверительные интервалы методом Монте-Карло плюс четыре вложенных бэктеста по параметрическим свипам. Ожидайте 3–6 с на первом вызове, доли секунды при тёплом кеше. Ключ кеша — DSL.

параметры:
  • dslStrategy DSL (та же форма, что у backtest)
тело запроса:
{ "dsl": { ... } }
ответ:
{ "analytics": { ... } }
GET/api/v1/lab/leaderboardпубличный

назначение: Публичный список топ-стратегий. Открыт только ROI / размер выборки; DSL скрыт, пока подписчик не откроет endpoint детали.

ответ:
{
  "generatedAt": "...",
  "minRoundsToQualify": 1000,
  "count": 14,
  "entries": [
    { "id": "...", "name": "...", "ownerShort": "abcd...wxyz", "roiPercent": ..., "roundsSettled": ... },
    ...
  ]
}
GET/api/v1/lab/leaderboard/{id}платный (Bearer)

назначение: Полный DSL одной записи рейтинга, плюс сводка её форвард-теста и кривая equity. Закрыто для подписчиков — публика видит только верхнеуровневый ROI.

параметры:
  • idid стратегии (сегмент пути)
ответ:
{
  "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 запросов/сек (burst 60). 429 с Retry-After при превышении.
  • API-ключ в заголовке — открытый одноразовый: сохраните его — у нас хранится только хеш.
  • Шеринг ключей детектируется (одновременные IP) и может привести к отзыву.
  • Эндпоинты панели (/api/live*) требуют браузерной сессии + совпадения Origin — для программного использования не предназначены.