La API de Tutiplay

Ejemplos

Casos de uso habituales, del más sencillo al más completo. Todos usan curl y jq, y parten de estas dos variables.

bash
API=https://api.tutiplay.com
AUTH="Authorization: Bearer $TUTIPLAY_API_KEY"

Comprobar la API key

La llamada más sencilla devuelve los datos de tu cuenta. Sirve para comprobar que la key es válida. Requiere READ.

bash
curl -s -H "$AUTH" "$API/v1/me" | jq '{username, email}'

Tus peñas y sus jornadas

Las peñas en las que juegas, cada una con su slug, y las jornadas de una de ellas, de la más reciente a la más antigua. Requiere READ.

bash
# Tus peñas
curl -s -H "$AUTH" "$API/v1/communities" | jq '.[] | {slug, name}'

# La jornada más reciente de una peña: su temporada, su número, su fase y si se puede pronosticar
curl -s -H "$AUTH" "$API/v1/communities/bar-manolo/rounds?size=1" \
  | jq '.items[0] | {season, number, phase, openForForecast, closesAt}'

# Las temporadas que ha jugado la peña, y las jornadas de una de ellas
curl -s -H "$AUTH" "$API/v1/communities/bar-manolo/seasons" | jq '.[] | {startYear, displayName}'
curl -s -H "$AUTH" "$API/v1/communities/bar-manolo/seasons/2025/rounds" | jq '.items[] | {number, phase}'

Jugar por tu cuenta

Sin peña, la quiniela se juega bajo /v1/solo/rounds y sus hermanas: las mismas rutas que en una peña, sin /communities/{slug}. Cada pronóstico lleva su propio pleno, puede haber varios por jornada y no hay más límite de columnas que el saldo.

Por dentro, lo que juegas por tu cuenta es una peña de una sola persona, con su propio slug: el que aparece en la dirección de «Mi quiniela en solitario» en la web. Si lo conoces, las rutas de peña también funcionan con él; las de /v1/solo/rounds y sus hermanas son lo mismo sin necesitarlo.

bash
# Tus últimas jornadas jugadas por tu cuenta
curl -s -H "$AUTH" "$API/v1/solo/rounds?size=1" | jq '.items[0] | {season, number, phase}'

# Tu pronóstico 1 de la jornada 7, igual que en una peña
curl -s -H "$AUTH" "$API/v1/solo/seasons/2026/rounds/7/forecast/1" | jq

Partidos y escrutinio de una jornada

Una jornada es la misma para todas las peñas. Su detalle incluye los catorce partidos en matches, cada uno con el signo con el que cuenta (result), el pleno al 15 en match15 con la casilla de cada equipo y, tras el escrutinio, los premios. El signo no siempre sale de un marcador: un partido aplazado lo tiene por sorteo. Requiere READ y no tiene límite.

bash
# Los partidos, con su signo cuando lo hay
curl -s -H "$AUTH" "$API/v1/seasons/2026/rounds/7" \
  | jq '.matches[] | {n: .number, local: .localTeam.name, visitante: .visitorTeam.name, result}'

# El escrutinio: lo que pagó cada categoría
curl -s -H "$AUTH" "$API/v1/seasons/2026/rounds/7" | jq '.prizes'

# Lo que se juega en toda España en cada partido, en porcentaje
curl -s -H "$AUTH" "$API/v1/seasons/2026/rounds/7/distribution" | jq '.country.matches'

Datos de fútbol: competiciones y clasificaciones

Una API aparte, bajo /v1/football/competitions, que empieza por la competición y sigue por su temporada y su jornada. Una competición se identifica por su id, que no cambia aunque cambie de nombre, y sus jornadas son las suyas, no las de la quiniela. Requiere READ y cuenta para los límites de uso.

bash
# Las competiciones, y en qué temporadas se han jugado
curl -s -H "$AUTH" "$API/v1/football/competitions" | jq '.[] | {id, name}'
curl -s -H "$AUTH" "$API/v1/football/competitions/laliga-ea-sports" | jq '.seasons'

# Una temporada: sus equipos y sus jornadas
curl -s -H "$AUTH" "$API/v1/football/competitions/laliga-ea-sports/seasons/2026" \
  | jq '{equipos: [.teams[].name], jornadas: [.rounds[].number]}'

# Una jornada: sus partidos con el marcador, y la clasificación tal como quedó tras ella
curl -s -H "$AUTH" "$API/v1/football/competitions/laliga-ea-sports/seasons/2026/rounds/7" \
  | jq '.matches[] | {local: .localTeam.name, visitante: .visitorTeam.name, localGoals, visitorGoals, status}'

curl -s -H "$AUTH" "$API/v1/football/competitions/laliga-ea-sports/seasons/2026/rounds/7" \
  | jq '.standings[] | {position, equipo: .team.name, points}'

Jugar una jornada

El recorrido completo hasta confirmar un pronóstico. Los primeros pasos requieren READ; guardar y confirmar, PLAY.

bash
# 1. Los partidos de la jornada: su número en el boleto es como los cita el pronóstico
curl -s -H "$AUTH" "$API/v1/seasons/2026/rounds/7" \
  | jq '.matches[] | {n: .number, local: .localTeam.name, visitante: .visitorTeam.name}'

# 2. Tu pronóstico actual. Cada pronóstico se identifica por su número; si la
#    peña solo admite uno, es el 1. Si todavía no existe, la respuesta es 404 y el
#    cuerpo del paso 3 se construye desde cero.
curl -s -H "$AUTH" "$API/v1/communities/bar-manolo/seasons/2026/rounds/7/forecast/1" > pronostico.json

# 3. Guárdalo con "confirm": true. Confirmar cobra las columnas del saldo.
curl -s -X PUT -H "$AUTH" -H 'Content-Type: application/json' \
  -d @pronostico.json \
  "$API/v1/communities/bar-manolo/seasons/2026/rounds/7/forecast/1" | jq

El cuerpo contiene las columnas y el pleno al 15. Cada marca se refiere a un partido por su número en el boleto (number, del 1 al 14, el mismo del paso 1), y son tres booleanos, one, x y two. El pleno son cuatro casillas por equipo (localZero, localOne, localTwo, localM y sus equivalentes visitor). La especificación completa está en la referencia, en el grupo Pronósticos.

json
{
  "columns": [
    { "number": 1,
      "picks": [ { "number": 1, "one": true, "x": false, "two": false }, … ] }
  ],
  "match15": { "localOne": true, "visitorZero": true },
  "confirm": true
}

Guardar y confirmar también se pueden hacer en dos pasos: se guarda sin confirm y después se confirma lo guardado con POST …/forecast/{n}/confirm. Para deshacer la confirmación mientras el plazo siga abierto, POST …/forecast/{n}/unconfirm, que devuelve el importe cobrado.

No se admiten boletos múltiples: marcar dos signos en un mismo partido se rechaza con 422. Cada columna lleva exactamente un signo por partido.

Rellenar un pronóstico con una plantilla

Una plantilla propone columnas o plenos a partir de sus reglas. Estas llamadas devuelven la propuesta sin guardar nada; para jugarla hay que guardarla y confirmarla como en el ejemplo anterior. Requieren PLAY.

bash
# Tus plantillas, con su tipo
curl -s -H "$AUTH" "$API/v1/templates" | jq '.[] | {id, kind, name}'

# La columna 1 del pronóstico 1, propuesta por una plantilla de 1X2
curl -s -X POST -H "$AUTH" \
  "$API/v1/communities/bar-manolo/seasons/2026/rounds/7/forecast/1/fill?templateId=$TEMPLATE&column=1" \
  | jq '.marks[] | {number, sign}'
  • POST …/forecast/{n}/fill: una columna, con una plantilla de 1X2. El parámetro column indica qué columna se sustituye.
  • POST …/forecast/{n}/fill-match15: el pleno al 15, con una plantilla de pleno.
  • POST …/forecast/{n}/fill-quiniela: el pronóstico completo —columnas y pleno—, con una plantilla de quiniela.

Las propuestas no repiten columnas ya confirmadas en la peña ni las demás columnas guardadas del mismo pronóstico.

Activar el juego automático

Una plantilla de quiniela puede pronosticar por ti en una peña cada jornada: rellena y confirma el pronóstico antes del cierre. Primero se consultan las plantillas que encajan con las reglas de la peña —las que no, indican el motivo en problem— y después se asigna una. Requiere PLAY.

bash
# Las plantillas de quiniela que se pueden usar en esta peña
curl -s -H "$AUTH" "$API/v1/communities/bar-manolo/auto-play/options" \
  | jq '.[] | {id, name, problem}'

# Asignar una
curl -s -X PUT -H "$AUTH" -H 'Content-Type: application/json' \
  -d '{"templateId": "'"$TEMPLATE"'"}' \
  "$API/v1/communities/bar-manolo/auto-play" | jq

# Desactivarlo
curl -s -X DELETE -H "$AUTH" "$API/v1/communities/bar-manolo/auto-play"
El juego automático confirma pronósticos cada jornada y, por tanto, consume saldo de tu cuenta mientras esté activo.