Referência · v1

Documentação da API

Tudo o que você precisa para autenticar, respeitar os limites e consultar os 6 endpoints do Diário Operebem, com exemplos em cURL, Python, JavaScript e Apps Script.

Abrir .mdBase URLhttps://diario.operebem.com.br/api/v1

Guia

Visão geral

A API v1 do Diário Operebem é somente leitura. Cada chave consulta uma única conta de trading e devolve JSON com operações, estatísticas e análises dessa conta.

Base URLhttps://diario.operebem.com.br/api/v1
MétodoGET
Formatoapplication/json
PlanoPRO
  • Todos os endpoints usam GET; nenhum cria, altera ou apaga dados.
  • Respostas de sucesso usam o envelope { "success": true, "data": ... }.
  • Datas e horários vêm em UTC, no formato ISO 8601.
  • A chave só enxerga a conta a que está vinculada.

Guia

Início rápido

  1. Gere a chave. No Diário, abra Configurações, API Keys, escolha a conta e clique em Nova API Key. A chave aparece uma única vez.
  2. Guarde em variável de ambiente. Por exemplo, OPB_API_KEY. Nunca coloque a chave no código ou em repositórios.
  3. Faça a primeira chamada. Comece por /account para confirmar a conta vinculada.
Primeira chamada
curl "https://diario.operebem.com.br/api/v1/account" \
  -H "Authorization: Bearer $OPB_API_KEY"

Guia

Autenticação

Envie a chave em um dos cabeçalhos abaixo, em todas as requisições.

CabeçalhoValor
AuthorizationBearer opb_sua_api_key
X-API-Keyopb_sua_api_key

As chaves novas seguem o formato opb_ seguido de 64 caracteres hexadecimais. Chaves legadas no formato diario_live_ continuam aceitas.

Nunca envie a chave na URL
Parâmetros de URL ficam em logs, histórico e ferramentas de terceiros. A API não aceita a chave em query string. Se uma chave vazar, revogue em Configurações, API Keys; ela para de funcionar na hora.

Guia

Limites e cabeçalhos

4requisições por minuto, por chave
50requisições por dia (UTC), por chave
100itens por página em /trades

Depois de autenticar e verificar a cota, toda resposta traz os contadores:

CabeçalhoSignificado
X-RateLimit-Limit-MinuteLimite por minuto (4).
X-RateLimit-Remaining-MinuteRequisições restantes neste minuto.
X-RateLimit-Limit-DayLimite por dia UTC (50).
X-RateLimit-Remaining-DayRequisições restantes hoje.
Evite repetições automáticas
Erros de parâmetro também consomem cota, e falhas de chave ou de plano podem vir sem os contadores. Ao receber 429, espere o próximo minuto; não repita em laço.
Lendo o saldo da cota (Python)
resp = requests.get(url, headers=H, timeout=15)
restante = int(resp.headers.get("X-RateLimit-Remaining-Minute", "0"))

if resp.status_code == 429:
    # Confira a cota por minuto e por dia. Salve o progresso antes de retomar.
    # A próxima janela de minuto não libera uma cota diária esgotada.
    raise RuntimeError(resp.json()["message"])

Guia

Paginação

/trades devolve uma página por chamada. Use limit (até 100) e page, e continue enquanto pagination.hasNext for true. Com 100 itens por página, a cota diária cobre até 5000 operações.

Buscando o histórico inteiro (Python)
import os, requests

H = {"Authorization": f"Bearer {os.environ['OPB_API_KEY']}"}
url = "https://diario.operebem.com.br/api/v1/trades"
page, trades = 1, []  # na retomada, use a página e os dados já salvos

while True:
    resp = requests.get(url, headers=H, params={"limit": 100, "page": page}, timeout=15)
    if resp.status_code == 429:
        print("Cota atingida. Salve trades e retome na página", page)
        break  # sem repetir automaticamente: confira a cota e o próximo período
    resp.raise_for_status()
    body = resp.json()["data"]
    trades += body["trades"]
    if not body["pagination"]["hasNext"]:
        break
    page += 1  # somente uma página confirmada avança a retomada

Guia

Datas e fusos

  • Todos os campos de data e hora vêm em UTC, no formato ISO 8601 (por exemplo, 2026-09-23T17:05:34.000Z).
  • startDate e endDate aceitam YYYY-MM-DD em UTC ou timestamp RFC 3339 com segundos e fuso. endDate no formato de data inclui o dia UTC inteiro.
  • O filtro de período considera a abertura do trade.
  • O desempenho por horário também usa UTC: para ler no horário de Brasília, subtraia 3 horas.

Guia

Formato das respostas

Sucesso
{
  "success": true,
  "data": { }
}
Erro
{
  "error": "INVALID_API_KEY_FORMAT",
  "message": "Invalid API key format. Keys should start with \"opb_\" or \"diario_live_\"."
}

O campo error traz um código estável para tratar no seu código; message é um texto de apoio e pode mudar.

Guia

Códigos de erro

HTTPQuando acontece
400INVALID_QUERY: parâmetro ausente, inválido ou fora das opções aceitas.
401MISSING_API_KEY, INVALID_API_KEY_FORMAT, INVALID_API_KEY, API_KEY_REVOKED ou API_KEY_EXPIRED.
403TIER_DOWNGRADED: conta sem plano PRO. O preflight sem Origin também é recusado.
404ACCOUNT_NOT_FOUND: conta vinculada não encontrada.
429RATE_LIMIT_EXCEEDED: limite por minuto ou por dia excedido.
500INTERNAL_ERROR: falha interna ao consultar ou calcular os dados.
503ENTITLEMENT_UNAVAILABLE: não foi possível revalidar o plano; Retry-After informa a espera.

Guia

CORS e navegador

O preflight usa OPTIONS e responde 204 quando a requisição traz o cabeçalho Origin. Mesmo assim, prefira chamar a API a partir de um servidor, script ou planilha: no navegador, a chave fica exposta a quem abrir a página.

Referência de endpoints
GET

/account

Conta conectada

Retorna a conta vinculada à chave, as estatísticas básicas e o primeiro e o último registro de atividade.

Parâmetros de consulta

Este endpoint não recebe parâmetros. A chave já define a conta.

Campos da resposta

  • account.id, name, broker, brokerLogo, platform, currency, accountNumber, server, isDemo, isActive, initialBalance, createdAt
  • stats.totalTrades, winningTrades, losingTrades, winRate, netProfit, currentBalance, currency
  • activity.firstTradeAt, lastTradeAt
Requisição
curl "https://diario.operebem.com.br/api/v1/account" \
  -H "Authorization: Bearer $OPB_API_KEY"
200Resposta de exemplo
{
  "success": true,
  "data": {
    "account": {
      "id": "01990000-0000-7000-8000-000000000001",
      "name": "Conta de exemplo",
      "broker": null,
      "brokerLogo": null,
      "platform": null,
      "currency": "USD",
      "accountNumber": null,
      "server": null,
      "isDemo": false,
      "isActive": true,
      "initialBalance": 1000,
      "createdAt": "2026-01-01T00:00:00.000Z"
    },
    "stats": {
      "totalTrades": 3,
      "winningTrades": 1,
      "losingTrades": 1,
      "winRate": 33.33,
      "netProfit": 15,
      "currentBalance": 1015,
      "currency": "USD"
    },
    "activity": {
      "firstTradeAt": "2026-09-06T10:00:00.000Z",
      "lastTradeAt": "2026-09-06T12:10:00.000Z"
    }
  }
}
GET

/trades

Lista de operações

Lista as operações da conta com paginação, filtros de ativo, tipo, resultado, período e ordenação.

Parâmetros de consulta

pageinteiropadrão 1
Inteiro positivo entre 1 e 1.000.000. Padrão: 1.
limitinteiropadrão 50
Inteiro positivo entre 1 e 100. Padrão: 50.
symboltextoopcional
Ativo exato, por exemplo WINQ26 ou EURUSD.
typeBUY | SELLopcional
Tipo da operação, por exemplo BUY ou SELL.
resultwin | loss | breakevenopcional
Resultado exato: win, loss ou breakeven.
startDatedataopcional
Início pela abertura do trade: YYYY-MM-DD em UTC ou timestamp RFC 3339 com segundos e fuso. Datas impossíveis são rejeitadas.
endDatedataopcional
Fim pela abertura do trade: YYYY-MM-DD inclui o dia UTC inteiro; timestamp RFC 3339 com segundos e fuso mantém o instante exato.
sortByenumpadrão openTime
Campo: openTime, closeTime, profit, volume ou symbol. Padrão: openTime.
sortOrderasc | descpadrão desc
Ordem: asc ou desc. Padrão: desc.

Campos da resposta

  • trades[].id, ticket, symbol, type, volume, openPrice, closePrice, openTime, closeTime, profit, commission, swap, sl, tp, durationSeconds, profitPercent, strategy
  • pagination.page, limit, total, totalPages, hasNext, hasPrev
Requisição
curl "https://diario.operebem.com.br/api/v1/trades?limit=10&result=loss&sortBy=profit&sortOrder=asc" \
  -H "Authorization: Bearer $OPB_API_KEY"
200Resposta de exemplo
{
  "success": true,
  "data": {
    "trades": [
      {
        "id": "01990000-0000-7000-8000-000000000003",
        "ticket": null,
        "symbol": "ATIVO_EXEMPLO",
        "type": "BUY",
        "volume": 1,
        "openPrice": 10,
        "closePrice": 11,
        "openTime": "2026-09-06T11:00:00.000Z",
        "closeTime": "2026-09-06T11:10:00.000Z",
        "profit": -5,
        "commission": 0,
        "swap": 0,
        "sl": null,
        "tp": null,
        "durationSeconds": 600,
        "profitPercent": null,
        "strategy": null
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 10,
      "total": 1,
      "totalPages": 1,
      "hasNext": false,
      "hasPrev": false
    }
  }
}
GET

/stats

Estatísticas essenciais

Retorna métricas de trades (profit bruto), sequências, duração e visão financeira da conta. Campos permanecem presentes na conta vazia. profitFactor pode ser o texto Infinity quando há ganho sem perda; currentBalance inclui custos e lançamentos confirmados.

Parâmetros de consulta

Este endpoint não recebe parâmetros. A chave já define a conta.

Campos da resposta

  • currency, totalTrades, winningTrades, losingTrades, winRate, profitFactor, totalProfit, averageWin, averageLoss
  • maxWinStreak, maxLossStreak, averageTradeDuration (alias em segundos), averageTradeDurationSeconds, averageTradeDurationMinutes, bestDay, worstDay
  • totalDeposits, totalWithdrawals, currentBalance, netFlow
Requisição
curl "https://diario.operebem.com.br/api/v1/stats" \
  -H "Authorization: Bearer $OPB_API_KEY"
200Resposta de exemplo
{
  "success": true,
  "data": {
    "currency": "USD",
    "totalTrades": 3,
    "winningTrades": 1,
    "losingTrades": 1,
    "winRate": 33.33,
    "profitFactor": 4,
    "totalProfit": 15,
    "averageWin": 20,
    "averageLoss": 5,
    "maxWinStreak": 1,
    "maxLossStreak": 1,
    "averageTradeDuration": 600,
    "averageTradeDurationSeconds": 600,
    "averageTradeDurationMinutes": 10,
    "bestDay": {
      "date": "2026-09-06",
      "profit": 15
    },
    "worstDay": {
      "date": "2026-09-06",
      "profit": 15
    },
    "totalDeposits": 0,
    "totalWithdrawals": 0,
    "currentBalance": 1015,
    "netFlow": 0
  }
}
GET

/analytics/summary

Resumo analítico

Consolida métricas básicas, risco, saldo, atividade e, por padrão, performance por dimensão.

Parâmetros de consulta

startDatedataopcional
Início pela abertura do trade: YYYY-MM-DD em UTC ou timestamp RFC 3339 com segundos e fuso. Datas impossíveis são rejeitadas.
endDatedataopcional
Fim pela abertura do trade: YYYY-MM-DD inclui o dia UTC inteiro; timestamp RFC 3339 com segundos e fuso mantém o instante exato.
includePerformancebooleanopadrão true
Booleano true ou false. Padrão: true; quando false, omite data.performance e evita seu cálculo.

Campos da resposta

  • account.id, name, broker, brokerLogo, platform, currency
  • basic.totalTrades, winningTrades, losingTrades, breakEvenTrades, winRate, totalProfit, totalLoss, netProfit, averageProfit, averageLoss, averageTrade, profitFactor, bestTrade, worstTrade, expectancy
  • risk.sharpeRatio, sortinoRatio, maxDrawdown, maxDrawdownPercent, recoveryFactor, calmarRatio, consecutiveWins, consecutiveLosses, currentStreak
  • balance.initial, current, netProfit, grossTradingResult, tradeCharges, netTradingResult, contributedCapital, capitalReturnPercent, growthPercent, twrPercent, annualizedReturn, annualizedTwrPercent, currency
  • activity.totalTrades, tradingDays, firstTradeAt, lastTradeAt
  • performance.symbol, dayOfWeek, hour, session, month (quando includePerformance=true)
Requisição
curl "https://diario.operebem.com.br/api/v1/analytics/summary?startDate=2026-09-01&endDate=2026-09-30" \
  -H "Authorization: Bearer $OPB_API_KEY"
200Resposta de exemplo
{
  "success": true,
  "data": {
    "account": {
      "id": "01990000-0000-7000-8000-000000000001",
      "name": "Conta de exemplo",
      "broker": null,
      "brokerLogo": null,
      "platform": null,
      "currency": "USD"
    },
    "basic": {
      "totalTrades": 3,
      "winningTrades": 1,
      "losingTrades": 1,
      "breakEvenTrades": 1,
      "winRate": 33.33,
      "totalProfit": 20,
      "totalLoss": 5,
      "netProfit": 15,
      "averageProfit": 20,
      "averageLoss": 5,
      "averageTrade": 5,
      "profitFactor": 4,
      "bestTrade": 20,
      "worstTrade": -5,
      "expectancy": 5
    },
    "risk": {
      "sharpeRatio": 7.35,
      "sortinoRatio": 15.87,
      "maxDrawdown": 5,
      "maxDrawdownPercent": 0.49,
      "recoveryFactor": 3,
      "calmarRatio": 46559.67346938776,
      "consecutiveWins": 1,
      "consecutiveLosses": 1,
      "currentStreak": -1
    },
    "balance": {
      "initial": 1000,
      "current": 1015,
      "netProfit": 15,
      "grossTradingResult": 15,
      "tradeCharges": 0,
      "netTradingResult": 15,
      "contributedCapital": 1000,
      "capitalReturnPercent": 1.5,
      "twrPercent": 1.5,
      "annualizedTwrPercent": 22814.24,
      "growthPercent": 1.5,
      "annualizedReturn": 22814.24,
      "currency": "USD"
    },
    "activity": {
      "totalTrades": 3,
      "tradingDays": 1,
      "firstTradeAt": "2026-09-06T10:00:00.000Z",
      "lastTradeAt": "2026-09-06T12:00:00.000Z"
    },
    "performance": {
      "symbol": {
        "ATIVO_EXEMPLO": {
          "trades": 3,
          "wins": 1,
          "losses": 1,
          "winRate": 33.33,
          "profit": 15,
          "avgProfit": 5
        }
      },
      "dayOfWeek": {
        "Domingo": {
          "trades": 3,
          "wins": 1,
          "losses": 1,
          "winRate": 33.33,
          "profit": 15,
          "avgProfit": 5
        }
      },
      "hour": {
        "10:00": {
          "trades": 1,
          "wins": 1,
          "losses": 0,
          "winRate": 100,
          "profit": 20,
          "avgProfit": 20
        },
        "11:00": {
          "trades": 1,
          "wins": 0,
          "losses": 1,
          "winRate": 0,
          "profit": -5,
          "avgProfit": -5
        },
        "12:00": {
          "trades": 1,
          "wins": 0,
          "losses": 0,
          "winRate": 0,
          "profit": 0,
          "avgProfit": 0
        }
      },
      "session": {
        "Londres (08-16 UTC)": {
          "trades": 3,
          "wins": 1,
          "losses": 1,
          "winRate": 33.33,
          "profit": 15,
          "avgProfit": 5
        }
      },
      "month": {
        "2026-09": {
          "trades": 3,
          "wins": 1,
          "losses": 1,
          "winRate": 33.33,
          "profit": 15,
          "avgProfit": 5
        }
      }
    }
  }
}
GET

/analytics/equity-curve

Curva de patrimônio

Retorna patrimônio, resultado operacional líquido, TWR e seus drawdowns por operação ou período agregado.

Parâmetros de consulta

startDatedataopcional
Início pela abertura do trade: YYYY-MM-DD em UTC ou timestamp RFC 3339 com segundos e fuso. Datas impossíveis são rejeitadas.
endDatedataopcional
Fim pela abertura do trade: YYYY-MM-DD inclui o dia UTC inteiro; timestamp RFC 3339 com segundos e fuso mantém o instante exato.
granularitytrade | day | week | monthpadrão trade
Agregação em UTC: trade, day, week (segunda a domingo) ou month. Padrão: trade; a curva também contém eventos financeiros.

Campos da resposta

  • equityCurve[].date, equity, drawdown, operationalResult, operationalDrawdown, returnPercent, drawdownPercent, profit
  • summary.initialBalance, finalBalance, peak, trough, maxDrawdown, maxDrawdownPercent, grossTradingResult, tradeCharges, netTradingResult, contributedCapital, capitalReturnPercent, twrPercent, annualizedTwrPercent, totalPoints, granularity, currency
Requisição
curl "https://diario.operebem.com.br/api/v1/analytics/equity-curve?granularity=week" \
  -H "Authorization: Bearer $OPB_API_KEY"
200Resposta de exemplo
{
  "success": true,
  "data": {
    "equityCurve": [
      {
        "date": "2026-08-31",
        "occurredAt": "2026-08-31",
        "equity": 1015,
        "drawdown": 5,
        "drawdownPercent": 0.49,
        "profit": 15,
        "operationalResult": 15,
        "operationalDrawdown": 5,
        "returnPercent": 1.5
      }
    ],
    "summary": {
      "initialBalance": 1000,
      "finalBalance": 1015,
      "peak": 1015,
      "trough": 1000,
      "maxDrawdown": 5,
      "maxDrawdownPercent": 0.49,
      "grossTradingResult": 15,
      "tradeCharges": 0,
      "netTradingResult": 15,
      "contributedCapital": 1000,
      "capitalReturnPercent": 1.5,
      "growthPercent": 1.5,
      "twrPercent": 1.5,
      "annualizedReturn": 22814.24,
      "annualizedTwrPercent": 22814.24,
      "totalPoints": 1,
      "granularity": "week",
      "currency": "USD"
    }
  }
}
GET

/analytics/performance

Performance por dimensão

Agrupa o resultado por ativo, dia da semana, hora, sessão ou mês. Sem dimension, retorna todas as dimensões e meta; com dimension, retorna somente a dimensão escolhida.

Parâmetros de consulta

startDatedataopcional
Início pela abertura do trade: YYYY-MM-DD em UTC ou timestamp RFC 3339 com segundos e fuso. Datas impossíveis são rejeitadas.
endDatedataopcional
Fim pela abertura do trade: YYYY-MM-DD inclui o dia UTC inteiro; timestamp RFC 3339 com segundos e fuso mantém o instante exato.
dimensionenumopcional
Filtro opcional: symbol, dayOfWeek, hour, session ou month.

Campos da resposta

  • data.symbol, dayOfWeek, hour, session, month (cada chave contém trades, wins, losses, winRate, profit e avgProfit)
  • meta.tradesAnalyzed, meta.dateRange.from, meta.dateRange.to (quando dimension não é informado; datas null se vazio)
Requisição
curl "https://diario.operebem.com.br/api/v1/analytics/performance?dimension=hour" \
  -H "Authorization: Bearer $OPB_API_KEY"
200Resposta de exemplo
{
  "success": true,
  "data": {
    "hour": {
      "10:00": {
        "trades": 1,
        "wins": 1,
        "losses": 0,
        "winRate": 100,
        "profit": 20,
        "avgProfit": 20
      },
      "11:00": {
        "trades": 1,
        "wins": 0,
        "losses": 1,
        "winRate": 0,
        "profit": -5,
        "avgProfit": -5
      },
      "12:00": {
        "trades": 1,
        "wins": 0,
        "losses": 0,
        "winRate": 0,
        "profit": 0,
        "avgProfit": 0
      }
    }
  }
}

Recursos

Markdown e LLMs

Toda esta referência existe em Markdown, pronta para colar em um assistente de IA ou versionar junto do seu projeto.