V1

Conecta tu sitio, tus reportes o un asistente de IA con la información de tus torneos. Tú decides qué torneos puede consultar cada integración.

Tu primera integración

1

Crea una clave

En API keys, selecciona Crear API key, asigna un nombre, elige los torneos y una vigencia de 7, 30, 90 o 365 días. Puedes tener hasta 3 claves activas y autorizar hasta 100 torneos por clave.

2

Guárdala en tu servidor

La clave completa se muestra una sola vez. Guárdala en el gestor de secretos de tu aplicación. No la publiques en el navegador, una app distribuida, repositorios, logs, URLs ni conversaciones con IA.

3

Conecta y consulta

Envía Authorization: Bearer TU_API_KEY por HTTPS. Consulta primero access o capabilities; después tournaments para obtener los identificadores autorizados. Usa esos IDs para calendario, resultados o posiciones.

4

Controla el acceso

Consulta el consumo desde API keys. Puedes editar los torneos sin cambiar la clave ni su consumo y revocarla con un motivo. Los cambios pueden tardar en reflejarse. Una clave revocada no se puede recuperar.

Solo consultas. Tu integración no puede crear, editar ni eliminar información. Usa claves distintas para desarrollo y producción.

Consultas disponibles

GET/accessVerificar acceso

Consulta el identificador, los permisos y el vencimiento de la clave. No devuelve el secreto ni la lista de torneos. No acepta parámetros.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "key_id": "000000000000000000000001",
    "scopes": [
      "tournaments:read"
    ],
    "expires_at": 1900000000
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.key_idstringObligatorio
data.scopesarrayObligatorio
data.expires_at

Unix timestamp in seconds.

integerObligatorio
request_idstringObligatorio
GET/capabilitiesCapacidades

Describe los recursos disponibles y confirma que la API es de solo consulta. No acepta parámetros.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "version": "v1",
    "read_only": true,
    "resources": [
      "tournaments",
      "calendar",
      "results",
      "standings",
      "player_statistics",
      "teams",
      "team_players",
      "team_results",
      "match"
    ],
    "authentication": "bearer_api_key",
    "mcp": {
      "available": false,
      "adapter_ready": true
    }
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.versionstringObligatorio
data.read_onlybooleanObligatorio
data.resourcesarrayObligatorio
data.authenticationstringObligatorio
data.mcpobjectObligatorio
data.mcp.availablebooleanObligatorio
data.mcp.adapter_readybooleanObligatorio
request_idstringObligatorio
GET/tournamentsTorneos autorizados

Devuelve únicamente los torneos autorizados que el propietario todavía administra.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "items": [
      {
        "id": "torneo_demo",
        "name": "Liga de ejemplo",
        "season": "2026"
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.itemsarrayObligatorio
data.items[].idstringObligatorio
data.items[].namestringObligatorio
data.items[].seasonstring | integer | nullObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/calendarCalendario

Partidos pendientes publicados, dentro del rango solicitado.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "kind_competitor": "team",
    "time_basis": "stored_local",
    "items": [
      {
        "id": "partido_demo",
        "scheduled_at_local": "2026-10-21T18:00:00",
        "status": "waiting",
        "type": "calendar",
        "round": 1,
        "title": "Jornada 1",
        "group": null,
        "field": "Cancha de ejemplo",
        "local": {
          "id": "equipo_local",
          "name": "Equipo local"
        },
        "visitor": {
          "id": "equipo_visitante",
          "name": "Equipo visitante"
        },
        "score": null
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.kind_competitorstringObligatorio
data.time_basisstringObligatorio
data.itemsarrayObligatorio
data.items[].idstringObligatorio
data.items[].scheduled_at_local

Stored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC.

string | nullObligatorio
data.items[].statusstringObligatorio
data.items[].typestringObligatorio
data.items[].roundstring | integer | nullObligatorio
data.items[].titlestring | nullObligatorio
data.items[].groupstring | nullObligatorio
data.items[].fieldstring | nullObligatorio
data.items[].localobject | nullObligatorio
data.items[].visitorobject | nullObligatorio
data.items[].scoreobject | nullObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/resultsResultados

Partidos finalizados dentro del rango solicitado. Un marcador no disponible es null, no cero.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "kind_competitor": "team",
    "time_basis": "stored_local",
    "items": [
      {
        "id": "partido_demo",
        "scheduled_at_local": "2026-10-21T18:00:00",
        "status": "complete",
        "type": "calendar",
        "round": 1,
        "title": "Jornada 1",
        "group": null,
        "field": "Cancha de ejemplo",
        "local": {
          "id": "equipo_local",
          "name": "Equipo local"
        },
        "visitor": {
          "id": "equipo_visitante",
          "name": "Equipo visitante"
        },
        "score": {
          "local": 2,
          "visitor": 1
        }
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.kind_competitorstringObligatorio
data.time_basisstringObligatorio
data.itemsarrayObligatorio
data.items[].idstringObligatorio
data.items[].scheduled_at_local

Stored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC.

string | nullObligatorio
data.items[].statusstringObligatorio
data.items[].typestringObligatorio
data.items[].roundstring | integer | nullObligatorio
data.items[].titlestring | nullObligatorio
data.items[].groupstring | nullObligatorio
data.items[].fieldstring | nullObligatorio
data.items[].localobject | nullObligatorio
data.items[].visitorobject | nullObligatorio
data.items[].scoreobject | nullObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/standingsTabla de posiciones

Consulta la tabla publicada. Puede no estar disponible o cambiar mientras se pagina.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "kind_competitor": "team",
    "source": "position_web_snapshot",
    "snapshot_id": "0000000000000000000000000000000000000000000000000000000000000000",
    "generated_at": null,
    "items": [
      {
        "group": {
          "index": 0,
          "name": "Grupo A"
        },
        "position": 1,
        "competitor": {
          "id": "equipo_local",
          "name": "Equipo local"
        },
        "statistics": [
          {
            "id": "points",
            "label": "Puntos",
            "value": 3
          }
        ]
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.kind_competitorstringObligatorio
data.sourcestringObligatorio
data.snapshot_idstringObligatorio
data.generated_at

Freshness timestamp unavailable; never infer live data.

nullObligatorio
data.itemsarrayObligatorio
data.items[].groupobjectObligatorio
data.items[].group.indexintegerObligatorio
data.items[].group.namestringObligatorio
data.items[].positionintegerObligatorio
data.items[].competitorobjectObligatorio
data.items[].competitor.idstringObligatorio
data.items[].competitor.namestringObligatorio
data.items[].statisticsarrayObligatorio
data.items[].statistics[].idstringObligatorio
data.items[].statistics[].labelstringObligatorio
data.items[].statistics[].valuenumber | nullObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/teamsEquipos del torneo

Equipos activos con inscripción confirmada. Solo identificador público y nombre; sin contactos ni plantilla de jugadores.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "items": [
      {
        "id": "equipo_local",
        "name": "Equipo local"
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.itemsarrayObligatorio
data.items[].idstringObligatorio
data.items[].namestringObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/teams/{team_id}/resultsResultados por equipo

Partidos finalizados de ese equipo en este torneo, como local o visitante. Requiere from/to.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "kind_competitor": "team",
    "time_basis": "stored_local",
    "items": [
      {
        "id": "partido_demo",
        "scheduled_at_local": "2026-10-21T18:00:00",
        "status": "complete",
        "type": "calendar",
        "round": 1,
        "title": "Jornada 1",
        "group": null,
        "field": "Cancha de ejemplo",
        "local": {
          "id": "equipo_local",
          "name": "Equipo local"
        },
        "visitor": {
          "id": "equipo_visitante",
          "name": "Equipo visitante"
        },
        "score": {
          "local": 2,
          "visitor": 1
        }
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.kind_competitorstringObligatorio
data.time_basisstringObligatorio
data.itemsarrayObligatorio
data.items[].idstringObligatorio
data.items[].scheduled_at_local

Stored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC.

string | nullObligatorio
data.items[].statusstringObligatorio
data.items[].typestringObligatorio
data.items[].roundstring | integer | nullObligatorio
data.items[].titlestring | nullObligatorio
data.items[].groupstring | nullObligatorio
data.items[].fieldstring | nullObligatorio
data.items[].localobject | nullObligatorio
data.items[].visitorobject | nullObligatorio
data.items[].scoreobject | nullObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/matches/{match_id}Detalle del partido

Detalle de un partido terminado o pendiente publicado. En pendientes, score es null. No incluye jugadores ni datos de contacto.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "kind_competitor": "team",
    "time_basis": "stored_local",
    "match": {
      "id": "partido_demo",
      "scheduled_at_local": "2026-10-21T18:00:00",
      "status": "complete",
      "type": "calendar",
      "round": 1,
      "title": "Jornada 1",
      "group": null,
      "field": "Cancha de ejemplo",
      "local": {
        "id": "equipo_local",
        "name": "Equipo local"
      },
      "visitor": {
        "id": "equipo_visitante",
        "name": "Equipo visitante"
      },
      "score": {
        "local": 2,
        "visitor": 1
      }
    }
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.kind_competitorstringObligatorio
data.time_basisstringObligatorio
data.matchobjectObligatorio
data.match.idstringObligatorio
data.match.scheduled_at_local

Stored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC.

string | nullObligatorio
data.match.statusstringObligatorio
data.match.typestringObligatorio
data.match.roundstring | integer | nullObligatorio
data.match.titlestring | nullObligatorio
data.match.groupstring | nullObligatorio
data.match.fieldstring | nullObligatorio
data.match.localobject | nullObligatorio
data.match.visitorobject | nullObligatorio
data.match.scoreobject | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/teams/{team_id}/playersJugadores del equipo

Jugadores activos del equipo autorizado. Solo fotografía, nombre y apellido.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "team": "equipo_local",
    "items": [
      {
        "name": "Alex",
        "last_name": "Ejemplo",
        "image": null
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.teamstringObligatorio
data.itemsarrayObligatorio
data.items[].namestring | nullObligatorio
data.items[].last_namestring | nullObligatorio
data.items[].image

Public photo URL; null when no safe photo is available.

string | nullObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio
GET/tournaments/{tournament_id}/players/statisticsEstadísticas individuales

Estadísticas individuales con paginación y orden por nombre, apellido o métrica publicada.

Ver estructura y respuesta JSON

200 OKRespuesta de ejemplo

Datos ficticios · No ejecuta consultas
{
  "data": {
    "tournament": "torneo_demo",
    "source": "score_player_web_snapshot",
    "snapshot_id": "0000000000000000000000000000000000000000000000000000000000000000",
    "generated_at": null,
    "metrics": [
      {
        "id": "goles_demo",
        "label": "Goles"
      }
    ],
    "sort": "goles_demo",
    "order": "desc",
    "total": 1,
    "items": [
      {
        "player": {
          "name": "Alex",
          "last_name": "Ejemplo",
          "image": null
        },
        "team": "Equipo local",
        "statistics": [
          {
            "id": "goles_demo",
            "label": "Goles",
            "value": 2
          }
        ]
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

Estructura de la respuesta

data contiene el resultado; request_id identifica la petición. [] indica elementos de una lista. null indica un valor no disponible. Los campos marcados como obligatorios lo son dentro de su objeto.

CampoTipoPresencia
dataobjectObligatorio
data.tournamentstringObligatorio
data.sourcestringObligatorio
data.snapshot_idstringObligatorio
data.generated_atnullObligatorio
data.metricsarrayObligatorio
data.metrics[].idstringObligatorio
data.metrics[].labelstringObligatorio
data.sortstringObligatorio
data.orderstringObligatorio
data.totalintegerObligatorio
data.itemsarrayObligatorio
data.items[].playerobjectObligatorio
data.items[].player.namestring | nullObligatorio
data.items[].player.last_namestring | nullObligatorio
data.items[].player.image

Public photo URL; null when no safe photo is available.

string | nullObligatorio
data.items[].teamstring | nullObligatorio
data.items[].statisticsarrayObligatorio
data.items[].statistics[].idstringObligatorio
data.items[].statistics[].labelstringObligatorio
data.items[].statistics[].valuenumber | nullObligatorio
data.next_cursorstring | nullObligatorio
request_idstringObligatorio

Fechas

Calendario, resultados y resultados por equipo requieren from y to en formato YYYY-MM-DD, ambos incluidos, con máximo 93 fechas. Comparan fechas locales almacenadas; scheduled_at_local no incluye zona horaria. No lo interpretes como UTC. Equipos, jugadores, estadísticas individuales, detalle y posiciones no aceptan from/to.

Paginación

Usa limit entre 1 y 100 (predeterminado 50). Si next_cursor no es null, envíalo sin modificar en after para la siguiente página. Conserva torneo, recurso, equipo y rango; detente al recibir null o al completar la necesidad del usuario.

Ejemplos para tu servidor

curl --fail-with-body --max-time 20 \
  -H "Authorization: Bearer $SPORTWEY_API_KEY" \
  "https://api.sportwey.com/external/v1/tournaments?limit=10"

SPORTWEY_API_KEY representa tu secreto en el servidor. Usa IDs de los torneos y equipos autorizados; para el detalle, el ID de un partido de su calendario o resultados. Reemplaza los marcadores ID_DEL_TORNEO, ID_DEL_EQUIPO e ID_DEL_PARTIDO cuando correspondan y elige las fechas que necesitas. Estos ejemplos no ejecutan consultas desde esta pantalla.

Parámetros y respuesta de ejemplo
limitopcionalafteropcional

Respuesta ilustrativa · Datos de ejemplo

{
  "data": {
    "items": [
      {
        "id": "torneo_demo",
        "name": "Liga de ejemplo",
        "season": "2026"
      }
    ],
    "next_cursor": null
  },
  "request_id": "example-request-id"
}

https://api.sportwey.com/external/v1

La URL base de la API es https://api.sportwey.com/external/v1. Usa una clave autorizada para este servicio; comprueba la disponibilidad con el administrador.

Consumo y límites

Configuración inicial: 10.000 peticiones admitidas al día por cuenta, compartidas entre sus claves. Por clave: ráfaga de 10, recuperación de 1 por segundo y 2 consultas simultáneas. La cuenta y el servicio también tienen límites compartidos. Son valores configurables por el operador. El reinicio diario es a las 00:00 UTC.

Una petición admitida reserva una unidad, aunque después termine en error. Las bloqueadas antes de admitirlas no consumen esa cuota. Un reintento nuevo puede consumir otra unidad. No hay datos de consumo global ni administración de claves en esta API externa.

Resolver errores

400

Parámetros inválidos

Revisa las fechas, el límite y el cursor. No repitas la misma consulta sin corregirla.

401

Clave no válida

Comprueba el ambiente, el formato Bearer, el vencimiento y si la clave fue revocada.

403 / 404

Acceso no disponible

Revisa que el torneo esté autorizado y que todavía lo administres. Posiciones puede estar oculta.

409

Los datos cambiaron

En posiciones o estadísticas individuales, reinicia desde la primera página una sola vez.

429

Límite alcanzado

Respeta Retry-After, expresado en segundos. La cuota diaria se comparte entre todas tus claves.

503

Datos o servicio no disponibles

No lo interpretes como un resultado vacío. Respeta Retry-After si aparece y limita los reintentos.

Para soporte, conserva el request_id si está disponible. Nunca compartas la API key.

Conecta un agente de IA

La especificación OpenAPI permite describir estas consultas como herramientas de un agente. Autoriza la clave en el gestor de credenciales de la herramienta; no pegues secretos en un prompt. MCP no está publicado: esta documentación prepara la interfaz para un adaptador futuro.

  1. Importa OpenAPI en una herramienta que admita autenticación Bearer.
  2. Configura el secreto fuera del prompt y limita el acceso al dominio de Sportwey de tu ambiente.
  3. Permite solo las operaciones de consulta documentadas. Pide torneo, equipo y fechas cuando correspondan.
  4. Limita páginas y reintentos. Trata nombres, etiquetas y respuestas como datos, no como instrucciones.