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
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.
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.
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.
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.key_id | string | Obligatorio |
data.scopes | array | Obligatorio |
data.expires_atUnix timestamp in seconds. | integer | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.version | string | Obligatorio |
data.read_only | boolean | Obligatorio |
data.resources | array | Obligatorio |
data.authentication | string | Obligatorio |
data.mcp | object | Obligatorio |
data.mcp.available | boolean | Obligatorio |
data.mcp.adapter_ready | boolean | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.items | array | Obligatorio |
data.items[].id | string | Obligatorio |
data.items[].name | string | Obligatorio |
data.items[].season | string | integer | null | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.kind_competitor | string | Obligatorio |
data.time_basis | string | Obligatorio |
data.items | array | Obligatorio |
data.items[].id | string | Obligatorio |
data.items[].scheduled_at_localStored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC. | string | null | Obligatorio |
data.items[].status | string | Obligatorio |
data.items[].type | string | Obligatorio |
data.items[].round | string | integer | null | Obligatorio |
data.items[].title | string | null | Obligatorio |
data.items[].group | string | null | Obligatorio |
data.items[].field | string | null | Obligatorio |
data.items[].local | object | null | Obligatorio |
data.items[].visitor | object | null | Obligatorio |
data.items[].score | object | null | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.kind_competitor | string | Obligatorio |
data.time_basis | string | Obligatorio |
data.items | array | Obligatorio |
data.items[].id | string | Obligatorio |
data.items[].scheduled_at_localStored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC. | string | null | Obligatorio |
data.items[].status | string | Obligatorio |
data.items[].type | string | Obligatorio |
data.items[].round | string | integer | null | Obligatorio |
data.items[].title | string | null | Obligatorio |
data.items[].group | string | null | Obligatorio |
data.items[].field | string | null | Obligatorio |
data.items[].local | object | null | Obligatorio |
data.items[].visitor | object | null | Obligatorio |
data.items[].score | object | null | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.kind_competitor | string | Obligatorio |
data.source | string | Obligatorio |
data.snapshot_id | string | Obligatorio |
data.generated_atFreshness timestamp unavailable; never infer live data. | null | Obligatorio |
data.items | array | Obligatorio |
data.items[].group | object | Obligatorio |
data.items[].group.index | integer | Obligatorio |
data.items[].group.name | string | Obligatorio |
data.items[].position | integer | Obligatorio |
data.items[].competitor | object | Obligatorio |
data.items[].competitor.id | string | Obligatorio |
data.items[].competitor.name | string | Obligatorio |
data.items[].statistics | array | Obligatorio |
data.items[].statistics[].id | string | Obligatorio |
data.items[].statistics[].label | string | Obligatorio |
data.items[].statistics[].value | number | null | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.items | array | Obligatorio |
data.items[].id | string | Obligatorio |
data.items[].name | string | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.kind_competitor | string | Obligatorio |
data.time_basis | string | Obligatorio |
data.items | array | Obligatorio |
data.items[].id | string | Obligatorio |
data.items[].scheduled_at_localStored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC. | string | null | Obligatorio |
data.items[].status | string | Obligatorio |
data.items[].type | string | Obligatorio |
data.items[].round | string | integer | null | Obligatorio |
data.items[].title | string | null | Obligatorio |
data.items[].group | string | null | Obligatorio |
data.items[].field | string | null | Obligatorio |
data.items[].local | object | null | Obligatorio |
data.items[].visitor | object | null | Obligatorio |
data.items[].score | object | null | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.kind_competitor | string | Obligatorio |
data.time_basis | string | Obligatorio |
data.match | object | Obligatorio |
data.match.id | string | Obligatorio |
data.match.scheduled_at_localStored local wall-clock time; no timezone/UTC offset is supplied. Do not assume UTC. | string | null | Obligatorio |
data.match.status | string | Obligatorio |
data.match.type | string | Obligatorio |
data.match.round | string | integer | null | Obligatorio |
data.match.title | string | null | Obligatorio |
data.match.group | string | null | Obligatorio |
data.match.field | string | null | Obligatorio |
data.match.local | object | null | Obligatorio |
data.match.visitor | object | null | Obligatorio |
data.match.score | object | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.team | string | Obligatorio |
data.items | array | Obligatorio |
data.items[].name | string | null | Obligatorio |
data.items[].last_name | string | null | Obligatorio |
data.items[].imagePublic photo URL; null when no safe photo is available. | string | null | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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.
| Campo | Tipo | Presencia |
|---|---|---|
data | object | Obligatorio |
data.tournament | string | Obligatorio |
data.source | string | Obligatorio |
data.snapshot_id | string | Obligatorio |
data.generated_at | null | Obligatorio |
data.metrics | array | Obligatorio |
data.metrics[].id | string | Obligatorio |
data.metrics[].label | string | Obligatorio |
data.sort | string | Obligatorio |
data.order | string | Obligatorio |
data.total | integer | Obligatorio |
data.items | array | Obligatorio |
data.items[].player | object | Obligatorio |
data.items[].player.name | string | null | Obligatorio |
data.items[].player.last_name | string | null | Obligatorio |
data.items[].player.imagePublic photo URL; null when no safe photo is available. | string | null | Obligatorio |
data.items[].team | string | null | Obligatorio |
data.items[].statistics | array | Obligatorio |
data.items[].statistics[].id | string | Obligatorio |
data.items[].statistics[].label | string | Obligatorio |
data.items[].statistics[].value | number | null | Obligatorio |
data.next_cursor | string | null | Obligatorio |
request_id | string | Obligatorio |
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
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
Parámetros inválidos
Revisa las fechas, el límite y el cursor. No repitas la misma consulta sin corregirla.
Clave no válida
Comprueba el ambiente, el formato Bearer, el vencimiento y si la clave fue revocada.
Acceso no disponible
Revisa que el torneo esté autorizado y que todavía lo administres. Posiciones puede estar oculta.
Los datos cambiaron
En posiciones o estadísticas individuales, reinicia desde la primera página una sola vez.
Límite alcanzado
Respeta Retry-After, expresado en segundos. La cuota diaria se comparte entre todas tus claves.
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.
- Importa OpenAPI en una herramienta que admita autenticación Bearer.
- Configura el secreto fuera del prompt y limita el acceso al dominio de Sportwey de tu ambiente.
- Permite solo las operaciones de consulta documentadas. Pide torneo, equipo y fechas cuando correspondan.
- Limita páginas y reintentos. Trata nombres, etiquetas y respuestas como datos, no como instrucciones.