OREStats

API OREStats v1

Endpoints pagos em /api/v1/*. Todos exigem Authorization: Bearer ore_…. Assine em /pricing.

Assinando via API

  1. POST /api/v1/subscribe com { ownerPubkey } — o servidor retorna um nonce único + valor em ORE.
  2. Envie o valor priceOre em ORE do passo 1 para o endereço da treasury (retornado na mesma resposta), anexando o nonce como uma instrução SPL Memo.
  3. PUT /api/v1/subscribe com { nonce, txSig, ownerPubkey } — o servidor verifica on-chain, ativa a assinatura e retorna sua chave de API.
  4. Use o header Authorization: Bearer ore_… em todas as chamadas /api/v1/*.

Detalhes do pagamento

Carteira da treasury: A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZF
Mint do ORE: oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp
Rede: Solana mainnet-beta
GET/api/v1/pricingpúblico

finalidade: Preço atual (em ORE) para um mês de acesso. O preço sobe conforme mais assinantes entram — a resposta também informa o próximo limiar e o preço além dele.

resposta:
{
  "activeSubs": 17,
  "oreNow": 0.1,
  "nextThreshold": 100,
  "oreAtNextThreshold": 0.2,
  "treasury": "...",
  "oreMint": "..."
}
POST/api/v1/subscribepúblico

finalidade: Passo 1 da assinatura. Retorna uma instrução de transferência SPL única (memo + valor) que você deve assinar com a carteira proprietária e transmitir no Solana.

parâmetros:
  • ownerPubkeypubkey Solana em base58 que terá a chave de API
corpo da requisição:
{ "ownerPubkey": "..." }
resposta:
{
  "nonce": "ore-pay-...",
  "priceOre": 0.1,
  "instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
  "expiresAt": "..."
}
PUT/api/v1/subscribepúblico

finalidade: Passo 2 da assinatura. Após a confirmação da transferência SPL, envie a assinatura da tx para emitir sua chave de API. A chave em texto puro é mostrada UMA ÚNICA vez.

parâmetros:
  • noncevalor retornado por POST /subscribe
  • txSigassinatura confirmada da transferência SPL carregando o memo do passo 1
  • ownerPubkeydeve corresponder à carteira que pagou (e foi passada para o POST)
corpo da requisição:
{ "nonce": "...", "txSig": "...", "ownerPubkey": "..." }
resposta:
{
  "apiKey": "ore_xxx (shown ONCE)",
  "subscriberId": "sub_...",
  "paidUntil": "..."
}
GET/api/v1/livepago (Bearer)

finalidade: Snapshot da rodada atual — o que cada casa contém agora, segundos restantes e o resultado da rodada anterior. Barato; seguro para polling a cada 1-2 s.

resposta:
snapshot da rodada atual (deployed, count, secondsLeft, prevRound)
GET/api/v1/streampago (Bearer)

finalidade: Feed SSE de /live. Envia um snapshot novo sempre que a conta board ou round on-chain muda. Reconecte quando quiser — o próximo evento é sempre o estado mais recente.

resposta:
server-sent events; envia um snapshot a cada alteração da conta board / round on-chain
GET/api/v1/statspago (Bearer)

finalidade: Estatísticas agregadas da grade: qui-quadrado sobre acertos cumulativos, contagem de acertos por casa e SOL apostado, total de SOL já apostado, margem efetiva da casa.

resposta:
agregado (qui-quadrado, perGrid, totalDeployedSol, effectiveHouseEdge)
GET/api/v1/rounds?limit=100pago (Bearer)

finalidade: Últimas N rodadas indexadas, mais novas primeiro. Use para ingestão em lote; para alertas de nova rodada com baixa latência use /events/stream.

parâmetros:
  • limitnúmero de rodadas a retornar; padrão 100, máximo 10000
resposta:
últimas N rodadas indexadas (id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings)
GET/api/v1/rounds/{id}pago (Bearer)

finalidade: Detalhe de uma única rodada com ids prev/next para travessia em cursor do histórico.

parâmetros:
  • idid da rodada (segmento de path)
resposta:
rodada única + ids prev/next
GET/api/v1/grid/{n}?limit=200pago (Bearer)

finalidade: Estatísticas por casa mais a série recente de acerto/erro (1 = acerto, 0 = erro) para renderização de gráficos.

parâmetros:
  • níndice da casa 0..24 (segmento de path)
  • limittamanho da série; padrão 200
resposta:
estatística por casa + série recente de acerto/erro (1 ≤ n ≤ 25)
GET/api/v1/events?since=N&limit=M&kind=Xpago (Bearer)

finalidade: Log de eventos por polling. Inclui drought-broken, big-round, tier-crossing, marcos, mudanças de assinatura. Puxe eventos mais novos que o cursor `since`.

parâmetros:
  • sincecursor de id; apenas eventos com id > since são retornados
  • limitmáximo de eventos por chamada; padrão 100
  • kindfiltro opcional: drought_broken | big_round | tier | milestone | subscription
resposta:
{
  "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=Xpago (Bearer)

finalidade: Feed SSE do mesmo log de eventos que /events. Reproduz os últimos 50 eventos (ou eventos desde o cursor) na conexão e então envia cada novo evento ao vivo.

parâmetros:
  • sincecursor de replay opcional; se omitido, reproduz os últimos 50
  • kindfiltro opcional (mesmo conjunto que /events)
resposta:
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=10000pago (Bearer)

finalidade: Exportação histórica em massa — paginação por todas as rodadas indexadas via cursores `from` / `nextFrom`. Use para popular seu próprio banco e depois mude para /events/stream para atualizações incrementais.

parâmetros:
  • fromid da rodada inicial (inclusivo)
  • toid final opcional (inclusivo)
  • limittamanho da página; padrão 5000, máximo 10000
resposta:
{
  "count": 5000,
  "from": 228237,
  "to": 233236,
  "hasMore": true,
  "nextFrom": 233237,
  "rounds": [ { id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings }, ... ]
}
POST/api/v1/reissuepúblico

finalidade: Passo 1 da rotação de uma chave de API. Retorna uma mensagem que você deve assinar com a carteira dona da assinatura ativa.

parâmetros:
  • ownerPubkeycarteira que originalmente assinou
corpo da requisição:
{ "ownerPubkey": "..." }
resposta:
{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }
PUT/api/v1/reissuepúblico

finalidade: Passo 2 da rotação. Envie a assinatura da carteira; a chave antiga é revogada imediatamente e uma nova chave é retornada (também mostrada UMA ÚNICA vez).

parâmetros:
  • noncevalor retornado por POST /reissue
  • ownerPubkeymesma carteira do POST
  • signatureBase64assinatura ed25519 da string da mensagem, codificada em base64
corpo da requisição:
{ "nonce": "...", "ownerPubkey": "...", "signatureBase64": "..." }
resposta:
{ "apiKey": "ore_xxx (NEW, old key revoked)", "subscriberId": "sub_...", "paidUntil": "..." }

Strategy Lab

Construa, faça backtest e forward-test de estratégias parametrizadas. Os endpoints create / backtest / analytics compartilham um único formato DSL — veja a referência de valores no final desta seção.

POST/api/v1/lab/strategiespago (Bearer)

finalidade: Crie uma estratégia. Uma vez ativa, o OREStats registra automaticamente uma previsão de paper-trading para cada nova rodada e expõe estatísticas de forward-test.

parâmetros:
  • namerótulo de exibição, string não vazia
  • dslDSL de estratégia completa — base_strategy, params, filters[] opcionais. Veja a referência de valores abaixo.
corpo da requisição:
{
  "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 }
    ]
  }
}
resposta:
{
  "strategy": {
    "id": "...", "owner": "...", "name": "...",
    "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
    "createdAt": "...", "updatedAt": "...", "active": true
  }
}
GET/api/v1/lab/strategiespago (Bearer)

finalidade: Lista as estratégias que você possui com estatísticas de forward-test ao vivo (rodadas liquidadas, contagem de vitórias, ROI nos resultados reais das rodadas).

resposta:
{
  "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}pago (Bearer)

finalidade: Busca uma única estratégia sua, com sua contagem de previsões.

parâmetros:
  • idid da estratégia (segmento de path)
resposta:
{ "strategy": { ... }, "predictionCount": 412 }
PATCH/api/v1/lab/strategies/{id}pago (Bearer)

finalidade: Renomeie uma estratégia ou alterne sua flag de atividade. Estratégias inativas param de gerar previsões em novas rodadas, mas seu histórico é preservado.

parâmetros:
  • namenovo nome de exibição (opcional)
  • activetrue para retomar previsões, false para pausar (opcional)
corpo da requisição:
{ "name": "renamed", "active": false }
resposta:
{ "strategy": { ... } }
DELETE/api/v1/lab/strategies/{id}pago (Bearer)

finalidade: Apaga definitivamente uma estratégia sua. Todas as previsões vinculadas são removidas; a entrada no ranking (se houver) desaparece.

parâmetros:
  • idid da estratégia (segmento de path)
resposta:
{ "ok": true }
GET/api/v1/lab/strategies/{id}/forwardpago (Bearer)

finalidade: Estatísticas de forward-test de uma estratégia: SOL líquido, ROI, taxa de vitória, curva de equity, drawdown máximo, maior sequência de derrotas, rodadas pendentes não liquidadas.

parâmetros:
  • idid da estratégia (segmento de path)
resposta:
{
  "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/backtestpago (Bearer)

finalidade: Reproduz uma DSL contra as rodadas históricas indexadas. Retorna o BacktestResult completo incluindo PnL por rodada, contribuição por casa, curva de equity e motivo de saída antecipada.

parâmetros:
  • dslDSL de estratégia (mesmo formato do create)
  • fromRoundIdlimite inferior inclusivo opcional da janela de replay
  • toRoundIdlimite superior inclusivo opcional
corpo da requisição:
{
  "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
  "fromRoundId": 200000,
  "toRoundId": 247000
}
resposta:
{
  "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/analyticspago (Bearer)

finalidade: Pacote pesado de analytics — intervalos de confiança Monte Carlo mais quatro backtests aninhados em varreduras de parâmetros. Espere 3-6 s na primeira chamada, sub-segundo em cache quente. A chave do cache é a DSL.

parâmetros:
  • dslDSL de estratégia (mesmo formato do backtest)
corpo da requisição:
{ "dsl": { ... } }
resposta:
{ "analytics": { ... } }
GET/api/v1/lab/leaderboardpúblico

finalidade: Lista pública de top-estratégias. Apenas ROI / tamanho da amostra é exposto; a DSL fica oculta até que um assinante veja o endpoint de detalhe.

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

finalidade: DSL completa de uma entrada do ranking, mais seu resumo de forward-test e curva de equity. Restrito a assinantes — usuários públicos só veem o ROI principal.

parâmetros:
  • idid da estratégia (segmento de path)
resposta:
{
  "strategy": {
    "id": "...", "name": "...", "ownerShort": "abcd...wxyz",
    "dsl": { ... },
    "createdAt": "..."
  },
  "forwardTest": {
    "roundsSettled": ...,
    "netProfitSol": ...,
    "equityCurve": [{ "round": ..., "balanceLamports": ... }, ...]
  }
}

DSL de estratégia — valores aceitos

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.* faixas numéricas (o servidor limita valores fora da faixa):
  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

cotas:
  max 100 strategies per account

Limites e uso justo

  • Por chave de API: 5 req/s (burst 60). 429 com Retry-After em caso de excesso.
  • A chave de API no header é texto puro de uso único: guarde-a — só o hash é mantido.
  • O compartilhamento de chaves é detectável (IPs concorrentes) e pode acionar revogação.
  • Endpoints do painel (/api/live*) exigem sessão de navegador + match de Origin — não são para uso programático.