OREStats API v1
Endpoints de pago bajo /api/v1/*. Todos requieren Authorization: Bearer ore_…. Suscríbete en /pricing.
Suscribirse vía API
- POST /api/v1/subscribe con
{ ownerPubkey }— el servidor devuelve un nonce único + cantidad de ORE. - Envía la cantidad priceOre de ORE del paso 1 a la dirección de tesorería (devuelta en la misma respuesta), adjuntando el nonce como una instrucción SPL Memo.
- PUT /api/v1/subscribe con
{ nonce, txSig, ownerPubkey }— el servidor verifica en cadena, activa la suscripción y devuelve tu clave API. - Usa
Authorization: Bearer ore_…como cabecera en todas las llamadas a /api/v1/*.
Detalles del pago
A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZForeoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp/api/v1/pricingpúblicopropósito: Precio actual (en ORE) para un mes de acceso. El precio escala a medida que se suman suscriptores — la respuesta también te dice el siguiente umbral y el precio más allá.
{
"activeSubs": 17,
"oreNow": 0.1,
"nextThreshold": 100,
"oreAtNextThreshold": 0.2,
"treasury": "...",
"oreMint": "..."
}/api/v1/subscribepúblicopropósito: Paso 1 de la suscripción. Devuelve una instrucción única de transferencia SPL (memo + cantidad) que debes firmar con la cartera propietaria y difundir en Solana.
ownerPubkey— Pubkey de Solana en base58 que será propietaria de la clave API
{ "ownerPubkey": "..." }{
"nonce": "ore-pay-...",
"priceOre": 0.1,
"instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
"expiresAt": "..."
}/api/v1/subscribepúblicopropósito: Paso 2 de la suscripción. Tras confirmar la transferencia SPL, envía la firma de la tx para emitir tu clave API. La clave en texto plano se muestra UNA SOLA VEZ.
nonce— valor devuelto por POST /subscribetxSig— firma de transferencia SPL confirmada que lleva el memo del paso 1ownerPubkey— debe coincidir con la cartera que pagó (y que se pasó en POST)
{ "nonce": "...", "txSig": "...", "ownerPubkey": "..." }{
"apiKey": "ore_xxx (shown ONCE)",
"subscriberId": "sub_...",
"paidUntil": "..."
}/api/v1/livepago (Bearer)propósito: Snapshot de la ronda actual — qué contiene cada casilla en este momento, segundos restantes y resultado de la ronda anterior. Barato; se puede sondear cada 1-2 s sin problema.
snapshot de la ronda actual (deployed, count, secondsLeft, prevRound)
/api/v1/streampago (Bearer)propósito: Feed SSE de /live. Envía un nuevo snapshot cada vez que cambia la cuenta de board o round en cadena. Reconecta cuando quieras — el siguiente evento siempre es el estado más reciente.
server-sent events; envía un snapshot en cada cambio de la cuenta de board / round en cadena
/api/v1/statspago (Bearer)propósito: Estadísticas agregadas de la cuadrícula: chi-cuadrado sobre aciertos acumulados, conteo de aciertos & SOL desplegado por casilla, total de SOL desplegado de toda la historia, margen efectivo de la casa.
agregado (chi-cuadrado, perGrid, totalDeployedSol, effectiveHouseEdge)
/api/v1/rounds?limit=100pago (Bearer)propósito: Últimas N rondas indexadas, las más nuevas primero. Úsalo para ingesta por lotes; para alertas de baja latencia de nuevas rondas usa /events/stream.
limit— número de rondas a devolver; por defecto 100, máximo 10000
últimas N rondas indexadas (id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings)
/api/v1/rounds/{id}pago (Bearer)propósito: Detalle de una sola ronda con ids prev/next para recorrer el historial con cursor.
id— id de la ronda (segmento de la ruta)
ronda única + ids prev/next
/api/v1/grid/{n}?limit=200pago (Bearer)propósito: Estadísticas por casilla más la serie reciente de aciertos/fallos (1 = acierto, 0 = fallo) para renderizar gráficos.
n— índice de la casilla 0..24 (segmento de la ruta)limit— longitud de la serie; por defecto 200
estadística por casilla + serie reciente de aciertos/fallos (1 ≤ n ≤ 25)
/api/v1/events?since=N&limit=M&kind=Xpago (Bearer)propósito: Registro de eventos sondeable. Incluye drought-broken, big-round, tier-crossing, milestones, cambios de suscripción. Recupera eventos más nuevos que el cursor `since`.
since— cursor de id; solo se devuelven eventos con id > sincelimit— máximo de eventos por llamada; por defecto 100kind— filtro opcional: 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 },
...
]
}/api/v1/events/stream?since=N&kind=Xpago (Bearer)propósito: Feed SSE del mismo registro que /events. Reproduce los últimos 50 eventos (o eventos desde el cursor) al conectar, y luego envía cada nuevo evento en vivo.
since— cursor opcional de replay; si se omite, reproduce los últimos 50kind— filtro opcional (mismo conjunto que /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).
/api/v1/dump?from=X&to=Y&limit=10000pago (Bearer)propósito: Exportación histórica masiva — paginación por todas las rondas indexadas mediante los cursores `from` / `nextFrom`. Úsalo para arrancar tu propia base de datos, luego cambia a /events/stream para actualizaciones incrementales.
from— id de ronda inicial (inclusive)to— id de ronda final opcional (inclusive)limit— tamaño de página; por defecto 5000, máximo 10000
{
"count": 5000,
"from": 228237,
"to": 233236,
"hasMore": true,
"nextFrom": 233237,
"rounds": [ { id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings }, ... ]
}/api/v1/reissuepúblicopropósito: Paso 1 de la rotación de clave API. Devuelve un mensaje que debes firmar con la cartera dueña de la suscripción activa.
ownerPubkey— cartera que se suscribió originalmente
{ "ownerPubkey": "..." }{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }/api/v1/reissuepúblicopropósito: Paso 2 de la rotación. Envía la firma de la cartera; la clave antigua se revoca inmediatamente y se devuelve una nueva (también mostrada UNA SOLA VEZ).
nonce— valor devuelto por POST /reissueownerPubkey— misma cartera que en POSTsignatureBase64— firma ed25519 del mensaje codificada en base64
{ "nonce": "...", "ownerPubkey": "...", "signatureBase64": "..." }{ "apiKey": "ore_xxx (NEW, old key revoked)", "subscriberId": "sub_...", "paidUntil": "..." }Strategy Lab
Construye, haz backtest y forward-test de estrategias parametrizadas. Los endpoints create / backtest / analytics comparten una misma forma de DSL — consulta la referencia de valores al final de esta sección.
/api/v1/lab/strategiespago (Bearer)propósito: Crea una estrategia. Una vez activa, OREStats registra automáticamente una predicción de paper-trading para cada nueva ronda y expone estadísticas de forward-test.
name— etiqueta de visualización, cadena no vacíadsl— Strategy DSL completo — base_strategy, params, filters[] opcionales. Ver referencia de valores abajo.
{
"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
}
}/api/v1/lab/strategiespago (Bearer)propósito: Lista tus estrategias propias con estadísticas en vivo de forward-test (rondas liquidadas, número de victorias, ROI sobre resultados reales de rondas).
{
"count": 3,
"strategies": [
{
"id": "...", "name": "...", "dsl": { ... }, "active": true,
"stats": { "roundsSettled": 412, "roundsWon": 88, "netProfitSol": 0.123, "roiPercent": 4.7 }
},
...
]
}/api/v1/lab/strategies/{id}pago (Bearer)propósito: Obtén una sola estrategia tuya, con su número de predicciones.
id— id de la estrategia (segmento de la ruta)
{ "strategy": { ... }, "predictionCount": 412 }/api/v1/lab/strategies/{id}pago (Bearer)propósito: Renombra una estrategia o alterna su flag de actividad. Las estrategias inactivas dejan de predecir nuevas rondas pero conservan su historial.
name— nuevo nombre de visualización (opcional)active— true para reanudar predicciones, false para pausarlas (opcional)
{ "name": "renamed", "active": false }{ "strategy": { ... } }/api/v1/lab/strategies/{id}pago (Bearer)propósito: Elimina por completo una estrategia tuya. Todas las predicciones vinculadas se borran; la entrada de la clasificación (si la hubiera) desaparece.
id— id de la estrategia (segmento de la ruta)
{ "ok": true }/api/v1/lab/strategies/{id}/forwardpago (Bearer)propósito: Estadísticas de forward-test para una estrategia: SOL neto, ROI, tasa de victoria, curva de equity, drawdown máximo, mayor racha de pérdidas, rondas pendientes sin liquidar.
id— id de la estrategia (segmento de la ruta)
{
"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
}/api/v1/lab/backtestpago (Bearer)propósito: Reproduce un DSL contra las rondas históricas indexadas. Devuelve el BacktestResult completo, incluyendo PnL por ronda, contribución por casilla, curva de equity y motivo de salida temprana.
dsl— Strategy DSL (misma forma que en create)fromRoundId— límite inferior inclusivo opcional de la ventana de replaytoRoundId— límite superior inclusivo opcional
{
"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": [...]
}
}/api/v1/lab/analyticspago (Bearer)propósito: Paquete de analítica pesado — intervalos de confianza Monte Carlo más cuatro backtests anidados sobre barridos de parámetros. Espera 3-6 s en la primera llamada, sub-segundo con caché caliente. La clave de caché es el DSL.
dsl— Strategy DSL (misma forma que en backtest)
{ "dsl": { ... } }{ "analytics": { ... } }/api/v1/lab/leaderboardpúblicopropósito: Lista pública de mejores estrategias. Solo se expone ROI / tamaño muestral; el DSL queda oculto hasta que un suscriptor consulta el endpoint de detalle.
{
"generatedAt": "...",
"minRoundsToQualify": 1000,
"count": 14,
"entries": [
{ "id": "...", "name": "...", "ownerShort": "abcd...wxyz", "roiPercent": ..., "roundsSettled": ... },
...
]
}/api/v1/lab/leaderboard/{id}pago (Bearer)propósito: DSL completo de una entrada de la clasificación, más su resumen de forward-test y curva de equity. Restringido a suscriptores — los usuarios públicos solo ven el ROI principal.
id— id de la estrategia (segmento de la ruta)
{
"strategy": {
"id": "...", "name": "...", "ownerShort": "abcd...wxyz",
"dsl": { ... },
"createdAt": "..."
},
"forwardTest": {
"roundsSettled": ...,
"netProfitSol": ...,
"equityCurve": [{ "round": ..., "balanceLamports": ... }, ...]
}
}Strategy DSL — valores aceptados
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 — < , <= , > , >= , ==
rangos numéricos de params.* (el servidor recorta valores fuera de rango): 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 cuotas: max 100 strategies per account
Límites y uso justo
- Por clave API: 5 req/s (ráfaga 60). 429 con
Retry-Afteren caso de exceso. - La clave API en la cabecera es texto plano de un solo uso: guárdala — solo se conserva el hash.
- Compartir claves es detectable (IPs concurrentes) y puede provocar revocación.
- Los endpoints del panel (
/api/live*) requieren sesión de navegador + coincidencia de Origin — no son para uso programático.