🚀 Guia de Integração para Contratantes Pronto para Produção
Tudo o que a sua equipe técnica precisa para integrar a API em qualquer linguagem (Node.js, Python, PHP, C#, Go) em menos de 10 minutos.
🌐 URL Base da API
https://apitestefb.evolutisistemas.com
⚡ URL Base WebSocket
wss://apitestefb.evolutisistemas.com/ws
🔓 Acesso Livre & CORS
Headers de CORS liberados (*). Não exige chaves complexas no frontend.
🔄 Como Chegam os Resultados & Ciclo de Vida do Jogo
Entenda como cada partida transita de estado na API até o momento em que os resultados são consolidados para pagamento de apostas:
not_started
Jogo agendado. Odds pré-jogo abertas, horário em schedule.start_time. completed: false.
in_progress
Placar dinâmico em score, minuto atual em score.period.minute, estatísticas e odds ao vivo.
awaiting_result
Tempo regulamentar expirado. O robô faz auditoria de segurança cruzando fontes para confirmar o placar definitivo.
finished
Sinal verde para pagamento: completed: true, final_score: { home, away } e data em finished_at.
{
"id": "17958073",
"name": "River Plate Asuncion vs. Club Silvio Pettirossi",
"sport": "football",
"completed": true, // ✓ OBRIGATÓRIO: Garante que a partida terminou oficialmente
"state": "finished", // Estado final consolidado
"status": "finished",
"final_score": { // ✓ PLACAR OFICIAL DEFINITIVO
"home": 1,
"away": 1
},
"score": {
"home": 1,
"away": 1,
"first_half": { // Placar oficial do 1º Tempo (HT)
"score": { "home": 1, "away": 0 },
"completed": true
},
"second_half": { // Placar dos gols anotados no 2º Tempo
"score": { "home": 0, "away": 1 },
"completed": true
},
"statistics": { // Estatísticas consolidadas
"corners": { "home": 5, "away": 4, "total": 9 },
"yellow_cards": { "home": 2, "away": 3, "total": 5 },
"red_cards": { "home": 0, "away": 0, "total": 0 }
}
},
"finished_at": "2026-10-09T14:40:00.000Z", // Horário oficial do término
"settlement_reason": "time_elapsed_confirmed" // Motivo da validação
}
📋 1. Dicionário de Liquidação de Apostas (Como validar bilhetes)
Ao consultar GET /api/football/finished ou GET /api/sports/finished, use os campos abaixo para liquidar qualquer bilhete de forma 100% automática:
| Tipo de Aposta | Campo no JSON | Regra de Liquidação |
|---|---|---|
| Vencedor do Jogo (1X2) | event.final_score.homeevent.final_score.away |
Se home > away deu Casa (1). Se away > home deu Fora (2). Se iguais, Empate (X). |
| Total de Gols (Over / Under) | event.final_score.home + event.final_score.away |
Soma total de gols anotados na partida. Ex: 2 + 1 = 3 gols (Mais de 2.5 Ganhou). |
| 1º Tempo (Half-Time / HT) | event.score.first_half.scoreevent.score.first_half.completed |
Liquidável assim que first_half.completed === true. Use score.home e score.away do 1ºT (não espere o jogo todo acabar). |
| 2º Tempo (Second Half) | event.score.second_half.score |
Liquidável após o apito final. Contabiliza estritamente os gols marcados no 2º tempo. |
| Total de Escanteios (Cantos) | event.score.statistics.corners.total |
Contador oficial consolidado de escanteios. Ex: total: 9 (Mais de 8.5 Ganhou). |
| Escanteios por Equipe | corners.home e corners.away |
Total de escanteios cobrados individualmente por cada time. |
| Cartões Amarelos | event.score.statistics.yellow_cards.total |
Total de advertências com cartão amarelo na partida. |
| Cartões Vermelhos (Expulsões) | event.score.statistics.red_cards.total |
Total de cartões vermelhos aplicados. |
| Basquete (Quartos Q1 a Q4 & 1T) | event.score.periodsevent.score.first_half (Q1+Q2) |
1º Tempo no Basquete é a soma de Q1 + Q2. Cada quarto individual tem seu placar em periods. |
| Status de Encerramento Oficial | event.completed === trueevent.state === "finished" |
Garante que o evento recebeu o apito final oficial da súmula. NUNCA liquidar se completed: false. |
🛡️ Regra de Ouro para Robôs de Liquidação (Sem Erros)
No endpoint GET /api/football/unified/:id (JSON Master), entregamos o objeto settlement_guide que já calcula e valida se a aposta pode ser paga de forma 100% segura:
if (event.settlement_guide.can_settle_first_half) {
liquidarMercado1T(event.settlement_guide.first_half_score); // Ex: { home: 1, away: 0 }
}
if (event.settlement_guide.can_settle_full_time) {
liquidarMercadoFinal(event.settlement_guide.full_time_score); // Ex: { home: 2, away: 1 }
}
⚡ Fusão Automática & Cross-Enrichment (100% de Completude)
Você tem total liberdade para escolher qualquer fonte primária (Vai de Bet, Mercuriobet ou Parlay). Se a casa escolhida deixar de entregar alguma estatística (ex: escanteios do 1T, cartões ou lance a lance), nossa API cruza os times e completa automaticamente os dados a partir das outras fontes.
✓ Garantia de 100%: Seu JSON sempre retornará preenchido com placares de 1T/2T, escanteios e o bloco settlement_guide pronto para liquidação, independente da fonte original do evento.
💻 2. Exemplos de Código Prontos para Copiar
# 1. Pegar jogos ao vivo com escanteios e odds (Vai de Bet enriquecida)
curl -X GET "https://apitestefb.evolutisistemas.com/api/football/live?source=vaidebet"
# 2. Pegar partidas finalizadas para liquidar bilhetes
curl -X GET "https://apitestefb.evolutisistemas.com/api/football/finished?limit=20"
# 3. Consultar um jogo específico por ID
curl -X GET "https://apitestefb.evolutisistemas.com/api/football/events/17894758"
// 1. Consultar jogos ao vivo
async function getLiveMatches() {
const response = await fetch('https://apitestefb.evolutisistemas.com/api/football/live?source=vaidebet');
const json = await response.json();
for (const match of json.data.events) {
console.log(`${match.name} | Placar: ${match.score?.home ?? 0} x ${match.score?.away ?? 0}`);
console.log(`Escanteios: Total ${match.score?.statistics?.corners?.total ?? 0}`);
}
}
// 2. Liquidar apostas de jogos finalizados
async function checkFinishedMatches() {
const response = await fetch('https://apitestefb.evolutisistemas.com/api/football/finished');
const json = await response.json();
for (const match of json.data.events) {
if (match.completed) {
console.log(`Jogo Encerrado: ${match.name}`);
console.log(`Resultado: ${match.final_score.home} x ${match.final_score.away}`);
console.log(`Total de Cantos: ${match.score?.statistics?.corners?.total}`);
}
}
}
import requests
BASE_URL = "https://apitestefb.evolutisistemas.com"
# Obter jogos ao vivo
def get_live():
res = requests.get(f"{BASE_URL}/api/football/live", params={"source": "vaidebet"})
data = res.json()
for ev in data.get("data", {}).get("events", []):
score = ev.get("score") or {}
corners = score.get("statistics", {}).get("corners", {})
print(f"{ev['name']} - Placar: {score.get('home')} x {score.get('away')} | Cantos: {corners.get('total')}")
# Liquidar partidas encerradas
def get_finished():
res = requests.get(f"{BASE_URL}/api/football/finished")
data = res.json()
for ev in data.get("data", {}).get("events", []):
final = ev.get("final_score") or {}
print(f"Finalizado: {ev['name']} -> {final.get('home')} x {final.get('away')}")
if __name__ == "__main__":
get_live()
get_finished()
<?php
$url = "https://apitestefb.evolutisistemas.com/api/football/finished";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
curl_close($ch);
$json = json_decode($response, true);
if (!empty($json['data']['events'])) {
foreach ($json['data']['events'] as $match) {
$homeScore = $match['final_score']['home'] ?? 0;
$awayScore = $match['final_score']['away'] ?? 0;
$corners = $match['score']['statistics']['corners']['total'] ?? 0;
echo "Partida: " . $match['name'] . "\n";
echo "Resultado Oficial: {$homeScore} x {$awayScore}\n";
echo "Total Escanteios: {$corners}\n\n";
}
}
?>
⚡ Parlay API Gateway White-Label
Conexão WebSocket contínua em tempo real, Lance a Lance (Play-by-Point via SSE) com latência de ~50ms e catálogo completo de odds de mais de 30 bookmakers internacionais.
🔒 100% Blindado
Seus clientes conectam exclusivamente pelo seu domínio. Nenhuma chave externa é exposta ao contratante.
⚡ Relay Inteligente
A API mantém 1 única conexão com a Parlay por esporte e redistribui para centenas de clientes sem custo extra.
⏱️ Lance a Lance (PBP)
Stream contínuo de lances (gols, faltas, cartões, pontos) via SSE para placares e radares em tempo real.
📡 1. WebSocket de Odds e Mercados (Em Tempo Real)
const WebSocket = require('ws');
// Conecte no seu domínio público (sem API key necessária)
const ws = new WebSocket('wss://apitestefb.evolutisistemas.com/ws/odds?sport=soccer_epl');
ws.on('open', () => {
console.log('Conectado ao WebSocket de Odds!');
// Opcional: Se inscrever em outro campeonato simultaneamente
ws.send(JSON.stringify({ action: 'subscribe', sport: 'soccer_brazil_campeonato' }));
});
ws.on('message', (message) => {
const packet = JSON.parse(message);
console.log('Atualização recebida:', packet);
// Tipos de pacote: "subscribed", "odds_update", "initial_state"
});
// Heartbeat a cada 30 segundos
setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ action: 'ping' }));
}
}, 30000);
⏱️ 2. Lance a Lance (Play-by-Point / PBP)
// Funciona direto no Navegador ou no Backend
const sse = new EventSource('https://apitestefb.evolutisistemas.com/api/parlay/sports/soccer_epl/live/sse');
// 1. Estado inicial da partida
sse.addEventListener('initial_state', (e) => {
const match = JSON.parse(e.data);
console.log('Partida ao vivo iniciada:', match);
});
// 2. Cada novo lance registrado (Gols, Cartões, Faltas, Escanteios, Pontos)
sse.addEventListener('pbp_event', (e) => {
const lance = JSON.parse(e.data);
console.log('LANCE EM TEMPO REAL:', lance);
// Exemplo de retorno:
// { event: "goal", team: "home", minute: 42, score: [1, 0] }
});
?match_id=...).
period=1H), 2º Tempo (period=2H), quartos de basquete (Q1-Q4), etc.
🌐 3. Endpoints REST da Parlay
?markets=h2h,spreads,totals e ?bookmakers=pinnacle,bet365.🧪 Testador de WebSocket ao Vivo
Teste a conexão com o seu Gateway WebSocket diretamente do navegador:
Pronto para testar. Clique em "Conectar" para iniciar a transmissão.
🦅 Mercuriobet (Betby) Provedor Oficial de Stats
Fonte primária para estatísticas oficiais detalhadas em tempo real: Escanteios (Home/Away/Total), Cartões Amarelos, Cartões Vermelhos, Períodos e odds completas.
🚩 Escanteios Consolidados
Retorna corners: { home, away, total } exatos para liquidação de mercados over/under.
🟨 Cartões Amarelos & Vermelhos
Contadores oficiais de advertências por equipe e totais do confronto.
🎯 Odds Completas
1X2, Dupla Chance, Acima/Abaixo de Gols, Ambos Marcam e Handicaps Asiáticos.
Endpoints Mercuriobet
{
"source": "mercuriobet",
"id": "2719525842324693039",
"name": "Blacks Power FC - Vipers SC",
"is_live": true,
"state": "in_progress",
"score": {
"home": 0,
"away": 0,
"period": { "description": "1ª parte", "minute": 23 },
"periods": [ { "number": 1, "home": 0, "away": 0 } ],
"statistics": {
"corners": { "home": 2, "away": 3, "total": 5 },
"yellow_cards": { "home": 1, "away": 0, "total": 1 },
"red_cards": { "home": 0, "away": 0, "total": 0 }
}
}
}
🟡 Vai de Bet (Altenar) Auto-Enriquecido
Jogos e odds da Vai de Bet enriquecidos automaticamente pelo motor de Matchmaking com os escanteios, cartões e liquidação da Mercuriobet.
🔄 Cruzamento Automático
A API identifica quando o jogo da Vai de Bet é o mesmo da Mercuriobet e injeta as estatísticas ricas.
🏁 Liquidação Instantânea
Quando a partida acaba, o evento da Vai de Bet é encerrado com completed: true e placar final.
Endpoints Vai de Bet
🟢 Pix.bet (FSSB) Alimentador Oficial
Feed ao vivo e pré-jogo da Pixbet com cobertura de mercados 1X2, Dupla Chance e Total de Gols.
Endpoints Pix.bet
⚽ SofaScore Estatísticas Globais
Dados de campeonatos internacionais, copas e ligas com informações de tabelas, confrontos e resultados.
Endpoints SofaScore
💾 Liquidação de Apostas & Banco SQLite Pronto para Contratante
Todos os jogos, resultados, placares finais e totais de escanteios/cartões são gravados no banco de dados SQLite (data/sports.db) no modo WAL para liquidação imediata de bilhetes.
Endpoints de Liquidação
?source=vaidebet ou ?source=mercuriobet e ?limit=50.
{
"success": true,
"data": {
"count": 1,
"events": [
{
"id": "17894758",
"source": "vaidebet",
"name": "Blacks Power FC vs. Vipers",
"state": "finished",
"completed": true,
"final_score": { "home": 1, "away": 2 },
"score": {
"statistics": {
"corners": { "home": 4, "away": 5, "total": 9 },
"yellow_cards": { "home": 2, "away": 1, "total": 3 },
"red_cards": { "home": 0, "away": 0, "total": 0 }
}
},
"finished_at": "2026-10-08T13:40:00.000Z"
}
]
}
}