API DOCS
Central de Provedores
Documentação White-Label de Mercados, WebSocket e Liquidação

🚀 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:

1. Pré-Jogo

not_started

Jogo agendado. Odds pré-jogo abertas, horário em schedule.start_time. completed: false.

2. Ao Vivo

in_progress

Placar dinâmico em score, minuto atual em score.period.minute, estatísticas e odds ao vivo.

3. Apito Final

awaiting_result

Tempo regulamentar expirado. O robô faz auditoria de segurança cruzando fontes para confirmar o placar definitivo.

4. Liquidado

finished

Sinal verde para pagamento: completed: true, final_score: { home, away } e data em finished_at.

JSON Estrutura de um Evento Concluído (Pronto para Liquidação)
EXEMPLO DE PAYLOAD RETORNADO EM /api/sports/finished
{
  "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.home
event.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.score
event.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.periods
event.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 === true
event.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:

// Exemplo no seu robô:
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

CURL Requisição via Terminal / Linux / Mac
CURL
# 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"
JS JavaScript / Node.js / React / Vue
JAVASCRIPT (FETCH)
// 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}`);
    }
  }
}
PY Python (requests & websockets)
PYTHON 3
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 PHP (cURL)
PHP
<?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)

WSS wss://apitestefb.evolutisistemas.com/ws/odds?sport={sport_key}
Conexão WebSocket persistente para streaming de odds. Você pode se conectar com o esporte desejado na URL ou trocar de esporte enviando comandos JSON.
EXEMPLO DE CONEXÃO WEBSOCKET (JAVASCRIPT / NODE.JS)
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)

GET /api/parlay/sports/:sport/live/sse
Recomendado para Radar
Stream SSE (Server-Sent Events) contínuo do lance a lance. O servidor empurra cada evento do jogo (gol, falta, cartão, ponto) instantaneamente conforme acontece em campo (~50ms).
CONSUMIR LANCE A LANCE VIA SSE (JAVASCRIPT NATIVO)
// 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] }
});
GET /api/parlay/sports/:sport/live/points
Consulta única (snapshot) do estado atual e histórico de pontos/lances de todas as partidas em andamento ou de uma partida específica (via ?match_id=...).
GET /api/parlay/sports/:sport/live/period_markets
Odds e mercados ao vivo divididos por período: 1º Tempo (period=1H), 2º Tempo (period=2H), quartos de basquete (Q1-Q4), etc.

🌐 3. Endpoints REST da Parlay

GET/api/parlay/sports
Lista todas as modalidades e campeonatos ativos (futebol, basquete, tênis, etc.).
GET/api/parlay/sports/:sport/events
Lista eventos e jogos agendados para a modalidade indicada.
GET/api/parlay/sports/:sport/odds
Cotações em tempo real. Parâmetros aceitos: ?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

GET/api/football/live?source=mercuriobet
Retorna todos os jogos ao vivo da Mercuriobet acompanhados de escanteios e cartões.
GET/api/football/today?source=mercuriobet
Grade de jogos de hoje e próximos confrontos com odds pré-jogo.
GET/api/football/events/:id?source=mercuriobet
Detalhes aprofundados de uma partida específica por ID.
EXEMPLO DE PAYLOAD COM ESTATÍSTICAS DA 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

GET/api/football/live?source=vaidebet
Jogos ao vivo da Vai de Bet com escanteios e cartões vinculados.
GET/api/football/events/:id?source=vaidebet
Detalhes da partida da Vai de Bet com persistência em banco.

🟢 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

GET/api/football/live?source=pixbet
Eventos em tempo real da Pixbet.
GET/api/football/today?source=pixbet
Partidas agendadas da Pixbet.

⚽ SofaScore Estatísticas Globais

Dados de campeonatos internacionais, copas e ligas com informações de tabelas, confrontos e resultados.

Endpoints SofaScore

GET/api/football/live?source=sofascore
Jogos ao vivo no SofaScore.
GET/api/football/leagues?source=sofascore
Lista de principais ligas (Brasileirão, Champions, Libertadores, etc.).

💾 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

GET/api/football/finished
Retorna a lista de jogos encerrados com placar final e totais consolidados de escanteios e cartões. Parâmetros aceitos: ?source=vaidebet ou ?source=mercuriobet e ?limit=50.
EXEMPLO DE RESPOSTA PARA LIQUIDAÇÃO
{
  "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"
      }
    ]
  }
}
GET/api/db/stats
Retorna o total de jogos salvos, total finalizados e total com estatísticas no SQLite.
GET/api/sync/status
Exibe o status do sincronizador contínuo em background (executado a cada 20 segundos).