Visão Geral
A Zuryon Odds Engine é uma infraestrutura de coleta e entrega de odds pré-jogo em tempo real. O sistema monitora mais de 250 casas de apostas em paralelo e entrega os dados organizados por esporte → competição → evento → mercado diretamente no seu sistema via Webhook HTTPS.
Apenas odds de pré-jogo são processadas. Quando um evento começa, os dados são automaticamente removidos do sistema, garantindo que você sempre trabalhe com informações relevantes para arbitragem.
Autenticação
Todas as requisições à API REST devem incluir o header Authorization com sua API key no formato Bearer zoe_.... As API keys são geradas no painel administrativo e têm escopo configurável por módulo.
// Toda requisição deve incluir o header Authorization
GET https://api.zuryon.com/v1/bookmakers
Authorization: Bearer zoe_sua_api_key_aqui
Content-Type: application/jsonImportante: Nunca exponha sua API key no frontend. Sempre faça as chamadas pelo seu backend.
Webhook
O sistema entrega odds via POST HTTPS para o endpoint configurado no painel. Cada entrega inclui um header X-Zuryon-Signature com assinatura HMAC-SHA256 para verificação de autenticidade.
// Node.js — Verificar assinatura HMAC-SHA256
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return `sha256=${expected}` === signature;
}
// No seu handler de webhook:
app.post('/odds-webhook', (req, res) => {
const sig = req.headers['x-zuryon-signature'];
const body = JSON.stringify(req.body);
if (!verifySignature(body, sig, process.env.WEBHOOK_SECRET)) {
return res.status(401).json({ error: 'Assinatura inválida' });
}
// Processar odds...
res.json({ received: true });
});Formato do Payload
O payload é entregue em JSON com estrutura hierárquica: esporte → competição → evento → mercados. Cada evento inclui o horário de início em UTC e os mercados disponíveis com as odds de cada casa.
POST https://seu-endpoint.com/odds-webhook
Content-Type: application/json
X-Zuryon-Signature: sha256=<hmac_sha256>
X-Zuryon-Timestamp: 1709123456789
{
"event": "odds.update",
"timestamp": 1709123456789,
"data": {
"football": {
"Brasileirão Série A": {
"Flamengo vs Palmeiras": {
"commence_time": "2024-03-10T20:00:00Z",
"markets": {
"h2h": {
"Flamengo": 2.10,
"Palmeiras": 3.40,
"Empate": 3.20
},
"totals": {
"over_2.5": 1.85,
"under_2.5": 1.95
}
}
}
}
}
}
}Esportes e Mercados
O sistema cobre os principais esportes e mercados para arbitragem pré-jogo. A cobertura é expandida continuamente conforme demanda dos clientes.
Erros e Códigos HTTP
| Código | Significado | Ação Recomendada |
|---|---|---|
| 200 | Sucesso | Processar normalmente |
| 400 | Requisição inválida | Verificar parâmetros enviados |
| 401 | Não autorizado | Verificar API key ou assinatura HMAC |
| 403 | Acesso negado | Verificar permissões da API key |
| 429 | Rate limit excedido | Aguardar e tentar novamente (Retry-After header) |
| 500 | Erro interno | Aguardar e tentar novamente em 30s |
Quickstart — 5 minutos
Com sua API key em mãos, você consegue receber odds em menos de 5 minutos. Basta configurar um endpoint HTTPS que aceite POST e registrá-lo no painel.
// 1. Instale o pacote de utilitários (opcional)
npm install axios crypto
// 2. Configure seu endpoint de webhook
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());
app.post('/webhook/odds', (req, res) => {
// Verificar assinatura
const signature = req.headers['x-zuryon-signature'];
const hmac = crypto.createHmac('sha256', process.env.WEBHOOK_SECRET);
const digest = 'sha256=' + hmac.update(JSON.stringify(req.body)).digest('hex');
if (signature !== digest) {
return res.status(401).send('Unauthorized');
}
const { event, data } = req.body;
if (event === 'odds.update') {
// Processar odds por esporte
for (const [sport, competitions] of Object.entries(data)) {
for (const [competition, events] of Object.entries(competitions)) {
for (const [eventName, eventData] of Object.entries(events)) {
console.log(`[${sport}] ${competition} — ${eventName}`);
console.log('Mercados:', eventData.markets);
}
}
}
}
res.json({ ok: true });
});
app.listen(3000, () => console.log('Webhook server rodando na porta 3000'));