📖 Documentação API Dev

Versão v1 · Base URL: https://nacopa26.com.br/api/v1

Autenticação

Todas as chamadas exigem sua API key no header X-API-Key (recomendado) ou query ?api_key=.

# Header (recomendado)
curl -H "X-API-Key: nc26_xxxxx" https://nacopa26.com.br/api/v1/info

# Query string
curl "https://nacopa26.com.br/api/v1/info?api_key=nc26_xxxxx"

Cota: 10.000 requests/mês por chave. Resposta 429 ao exceder.

Endpoints

MétodoURLDescrição
GET/infoVersão, contagens, lista de endpoints
GET/matchesLista todos os jogos. Filtros: ?stage=Grupo+C, ?status=finished, ?team=Brasil
GET/matches/{id}1 jogo + contagem de palpites
GET/teams48 seleções
GET/teams/{slug}1 seleção + elenco completo
GET/playersLista jogadores. ?limit=100&offset=0
GET/players/{slug}Ficha de 1 jogador
GET/stadiums16 estádios
GET/stadiums/{slug}Ficha de 1 estádio
GET/phasesStatus das 7 fases (open/closed/done)
GET/rankingTop palpiteiros globais

Exemplos

PHP

$ch = curl_init('https://nacopa26.com.br/api/v1/matches?stage=Grupo+C');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['X-API-Key: nc26_xxxxx'],
]);
$data = json_decode(curl_exec($ch), true);
foreach ($data['data'] as $m) {
  echo "{$m['team_a']} x {$m['team_b']}: {$m['score_a']}-{$m['score_b']}\n";
}

Node.js

const r = await fetch('https://nacopa26.com.br/api/v1/teams/brasil', {
  headers: { 'X-API-Key': 'nc26_xxxxx' }
});
const { data } = await r.json();
console.log(data.name, data.coach, data.players.length, 'jogadores');

Python

import requests
r = requests.get('https://nacopa26.com.br/api/v1/ranking',
                 headers={'X-API-Key': 'nc26_xxxxx'})
for p in r.json()['data'][:10]:
    print(f"#{p['position']} {p['user']['nickname']}: {p['points']} pts")

🔔 Webhooks

Cadastre uma URL no painel e receba HTTP POST quando jogos mudarem de status.

Eventos

  • match.started — quando jogo passa para "ongoing"
  • match.finished — quando jogo passa para "finished" com placar

Payload

POST https://seu-app.com/webhook/nacopa26
Content-Type: application/json
X-NaCopa26-Event: match.finished
X-NaCopa26-Signature: sha256=<hmac_sha256_do_body_com_seu_secret>
User-Agent: NaCopa26-Webhook/1.0

{
  "event": "match.finished",
  "data": {
    "id": 7, "stage": "Grupo C",
    "team_a": "Brasil", "team_b": "Marrocos",
    "score_a": 2, "score_b": 1,
    "status": "finished",
    "stadium": "MetLife Stadium",
    "date": "2026-06-13T19:00:00"
  },
  "sent_at": "2026-06-13T21:08:42-03:00"
}

Validar assinatura (PHP)

$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $body, $WEBHOOK_SECRET);
$received = $_SERVER['HTTP_X_NACOPA26_SIGNATURE'] ?? '';
if (!hash_equals($expected, $received)) { http_response_code(401); exit; }
$event = json_decode($body, true);
// processa...

Webhook é desativado após 5 falhas seguidas (HTTP ≠ 2xx). Reative criando novo no painel.

Códigos de resposta

CódigoSignificado
200OK
401Key ausente / inválida / revogada
404Recurso não encontrado
429Cota mensal excedida
500Erro interno (raro, fale com a gente)