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.
https://diario.operebem.com.br/api/v1GETapplication/json- 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
- 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.
- Guarde em variável de ambiente. Por exemplo,
OPB_API_KEY. Nunca coloque a chave no código ou em repositórios. - Faça a primeira chamada. Comece por
/accountpara confirmar a conta vinculada.
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çalho | Valor |
|---|---|
Authorization | Bearer opb_sua_api_key |
X-API-Key | opb_sua_api_key |
As chaves novas seguem o formato opb_ seguido de 64 caracteres hexadecimais. Chaves legadas no formato diario_live_ continuam aceitas.
Guia
Limites e cabeçalhos
Depois de autenticar e verificar a cota, toda resposta traz os contadores:
| Cabeçalho | Significado |
|---|---|
X-RateLimit-Limit-Minute | Limite por minuto (4). |
X-RateLimit-Remaining-Minute | Requisições restantes neste minuto. |
X-RateLimit-Limit-Day | Limite por dia UTC (50). |
X-RateLimit-Remaining-Day | Requisições restantes hoje. |
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.
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). startDateeendDateaceitamYYYY-MM-DDem UTC ou timestamp RFC 3339 com segundos e fuso.endDateno 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
{
"success": true,
"data": { }
}{
"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
| HTTP | Quando acontece |
|---|---|
| 400 | INVALID_QUERY: parâmetro ausente, inválido ou fora das opções aceitas. |
| 401 | MISSING_API_KEY, INVALID_API_KEY_FORMAT, INVALID_API_KEY, API_KEY_REVOKED ou API_KEY_EXPIRED. |
| 403 | TIER_DOWNGRADED: conta sem plano PRO. O preflight sem Origin também é recusado. |
| 404 | ACCOUNT_NOT_FOUND: conta vinculada não encontrada. |
| 429 | RATE_LIMIT_EXCEEDED: limite por minuto ou por dia excedido. |
| 500 | INTERNAL_ERROR: falha interna ao consultar ou calcular os dados. |
| 503 | ENTITLEMENT_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.
/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, createdAtstats.totalTrades, winningTrades, losingTrades, winRate, netProfit, currentBalance, currencyactivity.firstTradeAt, lastTradeAt
curl "https://diario.operebem.com.br/api/v1/account" \ -H "Authorization: Bearer $OPB_API_KEY"
{
"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"
}
}
}/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ão1- Inteiro positivo entre 1 e 1.000.000. Padrão: 1.
limitinteiropadrão50- 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ãoopenTime- Campo: openTime, closeTime, profit, volume ou symbol. Padrão: openTime.
sortOrderasc | descpadrãodesc- 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, strategypagination.page, limit, total, totalPages, hasNext, hasPrev
curl "https://diario.operebem.com.br/api/v1/trades?limit=10&result=loss&sortBy=profit&sortOrder=asc" \ -H "Authorization: Bearer $OPB_API_KEY"
{
"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
}
}
}/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, averageLossmaxWinStreak, maxLossStreak, averageTradeDuration (alias em segundos), averageTradeDurationSeconds, averageTradeDurationMinutes, bestDay, worstDaytotalDeposits, totalWithdrawals, currentBalance, netFlow
curl "https://diario.operebem.com.br/api/v1/stats" \ -H "Authorization: Bearer $OPB_API_KEY"
{
"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
}
}/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ãotrue- 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, currencybasic.totalTrades, winningTrades, losingTrades, breakEvenTrades, winRate, totalProfit, totalLoss, netProfit, averageProfit, averageLoss, averageTrade, profitFactor, bestTrade, worstTrade, expectancyrisk.sharpeRatio, sortinoRatio, maxDrawdown, maxDrawdownPercent, recoveryFactor, calmarRatio, consecutiveWins, consecutiveLosses, currentStreakbalance.initial, current, netProfit, grossTradingResult, tradeCharges, netTradingResult, contributedCapital, capitalReturnPercent, growthPercent, twrPercent, annualizedReturn, annualizedTwrPercent, currencyactivity.totalTrades, tradingDays, firstTradeAt, lastTradeAtperformance.symbol, dayOfWeek, hour, session, month (quando includePerformance=true)
curl "https://diario.operebem.com.br/api/v1/analytics/summary?startDate=2026-09-01&endDate=2026-09-30" \ -H "Authorization: Bearer $OPB_API_KEY"
{
"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
}
}
}
}
}/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ãotrade- 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, profitsummary.initialBalance, finalBalance, peak, trough, maxDrawdown, maxDrawdownPercent, grossTradingResult, tradeCharges, netTradingResult, contributedCapital, capitalReturnPercent, twrPercent, annualizedTwrPercent, totalPoints, granularity, currency
curl "https://diario.operebem.com.br/api/v1/analytics/equity-curve?granularity=week" \ -H "Authorization: Bearer $OPB_API_KEY"
{
"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"
}
}
}/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)
curl "https://diario.operebem.com.br/api/v1/analytics/performance?dimension=hour" \ -H "Authorization: Bearer $OPB_API_KEY"
{
"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.