API v1 estável

Integre dados esportivos em minutos.

A SportsAPI oferece uma interface REST para consultar jogos, placares, horários, ligas e transmissões de diferentes fontes em um único formato.

1. Crie uma chave

No dashboard da sua conta.

2. Faça a chamada

Envie a chave no header.

3. Use os dados

Receba JSON normalizado.

Documentação completa para o seu agente de IA

Baixe (ou copie) toda a referência da API — autenticação, endpoints, campos de resposta, imagens, erros e boas práticas — em um único arquivo Markdown. Cole no prompt do Claude Code, Cursor, Copilot ou qualquer outro agente e deixe ele implementar a integração sozinho, sem precisar navegar pelo site.

Autenticação

Envie sua API key no header X-API-Key. Mantenha a chave somente no servidor e nunca publique em código do navegador.

X-API-Key header
X-API-Key: sapi_xxxxxxxxxxxx

Use chaves separadas para desenvolvimento e produção. Se uma chave for exposta, revogue-a imediatamente no dashboard.

Primeira requisição

Consulte os jogos de futebol ao vivo com uma chamada GET. A referência completa está em /docs (OpenAPI).

terminal
curl "https://api.sportsapi.com/api/v1/games?sport=football&status=live&limit=20" \
  -H "X-API-Key: sapi_xxxx"

Resposta 200 OK

A resposta inclui partidas paginadas (`matches`, `total`, `limit`, `offset`) e se os dados vieram do cache.

status da conta
curl "https://api.sportsapi.com/api/v1/account" \
  -H "X-API-Key: sapi_xxxx"
GET

Consultar jogos

Monte uma consulta e copie o código para sua linguagem.

Parâmetros

GET/api/v1/games?sport=football&status=live&limit=20
curl "https://api.sportsapi.com/api/v1/games?sport=football&status=live&limit=20" \
  -H "X-API-Key: sapi_xxxx"
Sua chave nunca é enviada neste playgroundGerar chave no dashboard

Parâmetros disponíveis

Combine filtros para reduzir o payload retornado.

sportstring

Modalidade (football, basketball, tennis...). Padrão: football. Veja a lista completa liberada no seu plano em GET /sports.

Exemplo: football

dateYYYY-MM-DD

Data inicial. Inclui os 7 dias seguintes. Padrão: hoje (Brasil).

Exemplo: 2026-07-17

statusstring

Filtra por live, scheduled ou finished. A resposta ainda pode trazer jogos postponed/cancelled, mas esses dois não podem ser usados como filtro.

Exemplo: live

leaguestring

Filtra partidas pelo nome da liga (substring, sem diferenciar maiúsculas).

Exemplo: Brasileirão

limitnumber

Itens por página (1–100). Padrão: 50.

Exemplo: 20

offsetnumber

Deslocamento para paginação. Padrão: 0.

Exemplo: 0

Formato da resposta

Todo dado é normalizado para o mesmo contrato. Nem todo campo aparece em toda partida — eles variam por esporte, então sempre trate campos ausentes como opcionais em vez de assumir que estarão sempre presentes.

response.json
{
  "matches": [
    {
      "id": "a3f9c1e6b2d84f70",
      "sport": "football",
      "homeTeam": {
        "id": "5981",
        "name": "Flamengo",
        "logo": "/api/v1/images/media/team/5981",
        "color": "#D2122E"
      },
      "awayTeam": {
        "id": "1963",
        "name": "Palmeiras",
        "logo": "/api/v1/images/media/team/1963"
      },
      "homeScore": 2,
      "awayScore": 1,
      "status": "live",
      "startTime": 1784311200000,
      "league": {
        "id": "325",
        "name": "Brasileirão Série A",
        "country": "Brazil",
        "logo": "/api/v1/images/media/tournament/325"
      },
      "gameTimeDisplay": "74'",
      "period": "Segundo tempo",
      "roundName": "Rodada",
      "roundNum": 15,
      "venue": {
        "name": "Maracanã",
        "capacity": 78838
      },
      "officials": [
        "Anderson Daronco"
      ],
      "tvNetworks": [
        {
          "id": 42,
          "name": "ESPN",
          "logo": "/api/v1/images/media/tv-channel/42"
        }
      ]
    }
  ],
  "total": 1,
  "limit": 50,
  "offset": 0,
  "cached": false,
  "timestamp": 1784315678123
}

Referência completa de campos

idstring

Id único e opaco da partida.

sportstring

Modalidade da partida.

statusstring

scheduled · live · finished · postponed · cancelled.

startTimenumber

Horário de início em epoch ms (UTC).

homeScore / awayScorenumber | null

Placar atual. null antes do jogo começar.

gameTimeDisplaystring (opcional)

Cronômetro legível, ex.: "74'" ou "Q3 08:12".

periodstring (opcional)

Tempo/quarto/set atual, quando informado.

roundName / stageNamestring (opcional)

Fase do torneio, ex.: "Quarterfinal", "Grupo A". Em automobilismo, roundName é a sessão do fim de semana ("Treino Livre 1", "Classificação", "Corrida") — cada sessão vem como uma partida separada.

roundNumnumber (opcional)

Número da rodada dentro da fase atual, quando a competição usa esse formato.

homeTeam.id / awayTeam.idstring

Id do time.

homeTeam.name / awayTeam.namestring

Nome do time.

homeTeam.logo / awayTeam.logostring (opcional)

Caminho relativo — veja a seção "Imagens" abaixo antes de usar.

homeTeam.color / awayColorstring (opcional)

Cor do time em hex, quando disponível.

league.id / league.name / league.countrystring

Dados da competição.

league.logostring (opcional)

Caminho relativo — veja a seção "Imagens" abaixo.

venue.name / venue.capacitystring / number (opcional)

Local da partida — populado para a maioria dos jogos, mesmo sem transmissão.

venue.city / venue.country / venue.courtstring (opcional)

Detalhes adicionais do local, quando disponíveis (court é a quadra específica, comum em tênis).

officials[]string[] (opcional)

Árbitro(s)/oficiais da partida, quando reportado.

tvNetworks[].name / tvNetworks[].logostring (opcional)

Canais de transmissão — cobertura naturalmente esparsa fora dos jogos de maior perfil.

stages[]array (opcional)

Parciais por set/quarto/tempo extra — comum em tênis, vôlei, basquete.

events[]array (opcional)

Linha do tempo de lances (gols, cartões, etc.), quando reportado.

standings[]array (opcional)

Classificação completa para golfe (todos os jogadores) e automobilismo (todos os pilotos da sessão) — essas modalidades não são "A vs B"; homeTeam/awayTeam trazem só os 2 primeiros, standings[] traz o campo inteiro (position, name, logo, isWinner, score).

GET

Esportes disponíveis

Chame /api/v1/sports para descobrir, em tempo real, quais esportes o seu plano libera — em vez de fixar essa lista no seu código. O resultado muda automaticamente se você fizer upgrade de plano.

terminal
curl "https://api.sportsapi.com/api/v1/sports" \
  -H "X-API-Key: sapi_xxxx"
response.json
{
  "sports": [
    {
      "slug": "football",
      "sport": "football",
      "label": "Futebol"
    },
    {
      "slug": "basketball",
      "sport": "basketball",
      "label": "Basquete"
    },
    {
      "slug": "tennis",
      "sport": "tennis",
      "label": "Tênis"
    }
  ],
  "total": 3
}

Imagens (logos e ícones)

Todo campo logo (time, liga, canal de TV) já vem como um caminho relativo, servido pelo nosso próprio proxy de imagens — nunca uma URL absoluta de terceiros.

Basta concatenar o caminho recebido com a URL base da API para exibir a imagem:
https://api.sportsapi.com + match.homeTeam.logo

Esses endpoints de imagem são públicos (não exigem X-API-Key) e ficam por trás de um limite de requisições próprio, separado da sua cota de dados — então usá-los para renderizar logos não consome sua franquia mensal.

/api/v1/images/proxy?url=

Proxy genérico para uma URL https já conhecida, de um host permitido.

/api/v1/images/media/team/:id

Logo de um time, a partir do id numérico.

/api/v1/images/media/tournament/:id

Logo de um torneio.

/api/v1/images/media/tv-channel/:id

Logo de um canal de TV.

/api/v1/images/media/league?uniqueId=

Logo de competição/categoria (aceita uniqueId, tournamentId ou categoryId).

Erros

400Requisição inválidaRevise os parâmetros enviados.
401Não autorizadoAPI key ausente, inválida ou revogada.
402Assinatura necessáriaTrial expirado ou cota mensal esgotada.
403Plano insuficienteEsporte não incluso no seu plano.
404Não encontradoO recurso solicitado não existe.
429Limite excedidoAguarde a janela indicada nos headers RateLimit-*.
500Erro internoTente novamente e contate o suporte se persistir.