# Referencia API

Base URL local:

```text
http://127.0.0.1:3000
```

Base URL produccion:

```text
https://worldcupfixtureapi.com
```

La API solo acepta `GET` y responde JSON, salvo `/api/calendar.ics`, que responde `text/calendar`.

En produccion, Netlify sirve la landing y el visor como archivos estaticos. Las rutas `/api` y `/api/*` se ejecutan como Netlify Function mediante el adaptador `netlify/functions/api.js`, manteniendo la misma interfaz que el servidor local.

Todas las respuestas JSON incluyen CORS abierto:

```text
Access-Control-Allow-Origin: *
```

## Timezones

Los partidos se guardan con fecha UTC en `kickoff.utc`. Si se envia el parametro `timezone`, la API agrega `kickoff.local` calculado con ese huso horario.

Ejemplo:

```text
GET /api/matches?timezone=America/Argentina/Buenos_Aires
```

Respuesta parcial:

```json
{
  "kickoff": {
    "utc": "2026-06-12T02:00:00Z",
    "local": {
      "date": "2026-06-11",
      "time": "23:00",
      "isoLike": "2026-06-11T23:00:00",
      "timezone": "America/Argentina/Buenos_Aires"
    }
  }
}
```

Si el timezone no es valido, responde `400`.

## Modelo Match

Campos principales:

```json
{
  "id": "wc2026-537327",
  "sourceIds": {
    "footballData": 537327
  },
  "competition": {
    "id": 2000,
    "code": "WC",
    "name": "FIFA World Cup",
    "emblemUrl": "https://crests.football-data.org/wm26.png"
  },
  "season": {
    "year": 2026,
    "startDate": "2026-06-11",
    "endDate": "2026-07-19"
  },
  "stage": "group-stage",
  "stageCode": "GROUP_STAGE",
  "group": "A",
  "groupCode": "GROUP_A",
  "matchday": 1,
  "status": "scheduled",
  "sourceStatus": "TIMED",
  "kickoff": {
    "utc": "2026-06-11T19:00:00Z",
    "local": {
      "date": "2026-06-11",
      "time": "16:00",
      "isoLike": "2026-06-11T16:00:00",
      "timezone": "America/Argentina/Buenos_Aires"
    }
  },
  "homeTeam": {
    "id": "769",
    "sourceId": 769,
    "name": "Mexico",
    "shortName": "Mexico",
    "code": "MEX",
    "crestUrl": "https://crests.football-data.org/769.svg"
  },
  "awayTeam": {
    "id": "774",
    "sourceId": 774,
    "name": "South Africa",
    "shortName": "South Africa",
    "code": "RSA",
    "crestUrl": "https://crests.football-data.org/9396.svg"
  },
  "score": {
    "winner": null,
    "duration": "REGULAR",
    "fullTime": {
      "home": null,
      "away": null
    },
    "halfTime": {
      "home": null,
      "away": null
    }
  },
  "venue": null,
  "referees": [],
  "lastUpdated": "2025-12-06T20:20:44Z",
  "source": {
    "name": "football-data.org",
    "retrievedFrom": "https://api.football-data.org/v4/competitions/WC/matches?season=2026"
  }
}
```

## Estados normalizados

La API normaliza estados de football-data.org:

```text
TIMED, SCHEDULED       -> scheduled
LIVE, IN_PLAY, PAUSED  -> live
FINISHED               -> finished
POSTPONED              -> postponed
SUSPENDED              -> suspended
CANCELLED              -> cancelled
```

El valor original queda en `sourceStatus`.

## GET /api

Devuelve metadata general, fuente, version, temporada y lista de endpoints.

Ejemplo:

```text
GET /api?timezone=America/Argentina/Buenos_Aires
```

Respuesta:

```json
{
  "name": "World Cup 2026 Match API",
  "version": "1.0.0",
  "timezone": "America/Argentina/Buenos_Aires",
  "resultSet": {
    "count": 104,
    "first": "2026-06-11",
    "last": "2026-07-19",
    "played": 0
  }
}
```

## GET /api/matches

Lista partidos con filtros.

Parametros:

```text
timezone  IANA timezone. Default: UTC
team      Codigo, id o nombre exacto del equipo. Ej: ARG, Mexico
group     Grupo. Ej: A
stage     Fase normalizada. Ej: group-stage
status    scheduled, live, finished, postponed, suspended, cancelled
date      Fecha local exacta YYYY-MM-DD
from      Fecha local minima YYYY-MM-DD
to        Fecha local maxima YYYY-MM-DD
q         Busqueda por equipo, codigo, grupo, fase, estado o sede
```

Ejemplos:

```text
GET /api/matches
GET /api/matches?team=MEX
GET /api/matches?group=A&timezone=America/Mexico_City
GET /api/matches?from=2026-06-11&to=2026-06-13&timezone=America/Argentina/Buenos_Aires
GET /api/matches?q=quarter
```

Respuesta:

```json
{
  "count": 3,
  "matches": []
}
```

## GET /api/matches/today

Lista partidos del dia actual segun el timezone indicado.

Ejemplo:

```text
GET /api/matches/today?timezone=America/Argentina/Buenos_Aires
```

Respuesta:

```json
{
  "date": "2026-06-11",
  "timezone": "America/Argentina/Buenos_Aires",
  "count": 2,
  "matches": []
}
```

## GET /api/matches/{id}

Obtiene un partido por id interno o por id de football-data.org.

Ejemplos:

```text
GET /api/matches/wc2026-537327
GET /api/matches/537327
GET /api/matches/537327?timezone=America/Argentina/Buenos_Aires
```

## GET /api/teams

Lista equipos presentes en el fixture descargado.

Respuesta:

```json
{
  "count": 48,
  "teams": [
    {
      "id": "769",
      "sourceId": 769,
      "name": "Mexico",
      "shortName": "Mexico",
      "code": "MEX",
      "crestUrl": "https://crests.football-data.org/769.svg",
      "matches": 3,
      "groups": ["A"]
    }
  ]
}
```

## GET /api/teams/{code}/matches

Lista partidos de un equipo.

Ejemplos:

```text
GET /api/teams/MEX/matches
GET /api/teams/ARG/matches?timezone=America/Argentina/Buenos_Aires
```

Acepta los mismos filtros de `/api/matches` ademas del equipo incluido en la ruta.

## GET /api/groups

Lista grupos, equipos y cantidad de partidos por grupo.

Ejemplo:

```text
GET /api/groups
```

## GET /api/groups/{group}/standings

Devuelve tabla calculada para un grupo.

Ejemplo:

```text
GET /api/groups/A/standings
```

Campos:

```text
played
won
drawn
lost
goalsFor
goalsAgainst
goalDifference
points
```

Mientras los partidos no tengan resultados, todos los equipos aparecen con cero partidos jugados.

## GET /api/venues

Lista sedes disponibles en los datos.

Ejemplo:

```text
GET /api/venues
```

Respuesta actual esperada:

```json
{
  "count": 0,
  "venues": [],
  "note": "The current source data does not include venue names yet."
}
```

## GET /api/calendar.ics

Genera un calendario ICS filtrable. Sirve para importar partidos en Google Calendar, Outlook, Apple Calendar u otros clientes.

Parametros soportados:

```text
team
group
stage
status
date
from
to
q
timezone
```

Ejemplos:

```text
GET /api/calendar.ics
GET /api/calendar.ics?team=ARG
GET /api/calendar.ics?group=A
GET /api/calendar.ics?from=2026-06-11&to=2026-06-13
```

Nota: los eventos ICS usan `DTSTART` y `DTEND` en UTC, que es el formato mas compatible con clientes de calendario.

## GET /api/changes

Lista partidos cuyo `lastUpdated` sea posterior al parametro `since`.

Ejemplo:

```text
GET /api/changes?since=2026-01-01T00:00:00Z
```

Respuesta:

```json
{
  "since": "2026-01-01T00:00:00Z",
  "count": 42,
  "matches": []
}
```

Si no se envia `since`, devuelve todos los partidos.

## GET /api/openapi.json

Devuelve un documento OpenAPI basico para descubrir la API.

Ejemplo:

```text
GET /api/openapi.json
```

## Errores

Formato:

```json
{
  "error": "Not found"
}
```

Codigos usados:

```text
400  Parametro invalido, por ejemplo timezone inexistente
404  Recurso no encontrado
405  Metodo no permitido
500  Error interno
```
