{"openapi":"3.1.0","info":{"title":"EliteFootball API","description":"API pública temporada 2025/2026 (vistas PostgreSQL v_*_api).","version":"1.0.0"},"paths":{"/":{"get":{"summary":"Read Root","operationId":"read_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/time":{"get":{"summary":"Get Server Time","operationId":"get_server_time_api_time_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/teams":{"get":{"summary":"List Teams Legacy","operationId":"list_teams_legacy_api_teams_get","parameters":[{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Club Id"}},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"League Id"}},{"name":"visible_leagues_only","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Visible Leagues Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/{team_id}":{"get":{"summary":"Get Team Legacy","description":"Detalle de un equipo (nombre, club, estadio, ligas activas, colores).","operationId":"get_team_legacy_api_teams__team_id__get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/{team_id}/players":{"get":{"summary":"Get Team Players Legacy","description":"Plantilla actual de un equipo agrupada por posición (porteros / defensas /\ncentrocampistas / delanteros) usando `registrations` activas y el último\n`player_snapshots.market_value` disponible.","operationId":"get_team_players_legacy_api_teams__team_id__players_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clubs":{"get":{"summary":"List Clubs Legacy","operationId":"list_clubs_legacy_api_clubs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/leagues":{"get":{"summary":"List Leagues Legacy","operationId":"list_leagues_legacy_api_leagues_get","parameters":[{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leagues/{league_id}/teams":{"get":{"summary":"List League Teams Legacy","description":"Equipos que compiten en la liga en la temporada marcada como actual\n(league_participations + seasons.is_current).","operationId":"list_league_teams_legacy_api_leagues__league_id__teams_get","parameters":[{"name":"league_id","in":"path","required":true,"schema":{"type":"string","title":"League Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeagueTeamOption"},"title":"Response List League Teams Legacy Api Leagues  League Id  Teams Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/academies":{"get":{"summary":"List Academies Legacy","description":"Canteras agrupadas por equipo principal: filiales vía `teams.parent_team_id`.","operationId":"list_academies_legacy_api_academies_get","parameters":[{"name":"country_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UUID país","title":"Country Id"},"description":"UUID país"},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UUID liga (temporada actual)","title":"League Id"},"description":"UUID liga (temporada actual)"},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UUID equipo padre o filial","title":"Team Id"},"description":"UUID equipo padre o filial"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcademiesListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/seasons/current":{"get":{"summary":"Get Current Season Legacy","description":"Respuesta compatible con frontend legacy.\nIntenta temporada activa (si existe), y si no, la más reciente.","operationId":"get_current_season_legacy_api_seasons_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/stats":{"get":{"summary":"Get Dashboard Stats Legacy","description":"KPIs rápidos para portada/dashboard legacy.","operationId":"get_dashboard_stats_legacy_api_dashboard_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analytics/log":{"post":{"summary":"Analytics Log Legacy","description":"Endpoint no-crítico para evitar 404 del frontend.\nSe puede persistir más adelante en tabla/event bus.","operationId":"analytics_log_legacy_api_analytics_log_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players":{"get":{"summary":"List Players Legacy","description":"Endpoint legacy para frontend actual.\nDevuelve shape paginado con `items`.","operationId":"list_players_legacy_api_players_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Page Size"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players/{player_id}":{"get":{"summary":"Get Player Legacy","operationId":"get_player_legacy_api_players__player_id__get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players/{player_id}/value-history":{"get":{"summary":"Get Player Value History Legacy","operationId":"get_player_value_history_legacy_api_players__player_id__value_history_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transfers":{"get":{"summary":"List Transfers Feed","description":"Feed global de fichajes desde v_player_history_api.\nExcluye Cantera y Fin de Cesión; no muestra fechas futuras.","operationId":"list_transfers_feed_api_transfers_get","parameters":[{"name":"window","in":"query","required":false,"schema":{"enum":["recent","summer","winter","all"],"type":"string","description":"Ventana: recent | summer | winter | all","default":"recent","title":"Window"},"description":"Ventana: recent | summer | winter | all"},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtrar por equipos del destino en league_participations (temporada actual)","title":"League Id"},"description":"Filtrar por equipos del destino en league_participations (temporada actual)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":40,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedTransfersPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players/{player_id}/transfers":{"get":{"summary":"Get Player Transfers Legacy","operationId":"get_player_transfers_legacy_api_players__player_id__transfers_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players/{player_id}/history":{"get":{"summary":"Get Player History Legacy","operationId":"get_player_history_legacy_api_players__player_id__history_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players/{player_id}/similar":{"get":{"summary":"Get Player Similar Legacy","description":"Jugadores con valor de mercado reciente parecido y demarcación similar (misma familia de posición).","operationId":"get_player_similar_legacy_api_players__player_id__similar_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players/{player_id}/match-stats":{"get":{"summary":"Get Player Match Stats Legacy","description":"Stats por partido para la pestaña Estadísticas de la ficha.","operationId":"get_player_match_stats_legacy_api_players__player_id__match_stats_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/players/{player_id}/season-stats":{"get":{"summary":"Get Player Season Stats Legacy","description":"Agregados por temporada/equipo/liga para la pestaña Temporada.","operationId":"get_player_season_stats_legacy_api_players__player_id__season_stats_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/countries":{"get":{"summary":"Get Countries Legacy","operationId":"get_countries_legacy_api_countries_get","parameters":[{"name":"from_leagues","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"From Leagues"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches":{"get":{"summary":"List Matches Legacy","operationId":"list_matches_legacy_api_matches_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Page Size"}},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Id"}},{"name":"country_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UUID país (liga.matches filtrados por leagues.country_id)","title":"Country Id"},"description":"UUID país (liga.matches filtrados por leagues.country_id)"},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Solo partidos donde este equipo es local o visitante","title":"Team Id"},"description":"Solo partidos donde este equipo es local o visitante"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Estados separados por coma, p. ej. finished,live","title":"Status"},"description":"Estados separados por coma, p. ej. finished,live"},{"name":"include_goals","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Include Goals"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches/live":{"get":{"summary":"Get Matches Live And Today","description":"Partidos de un día (Europe/Madrid) + live (solo si no hay ?date=): para la home.\n- ?date=YYYY-MM-DD filtra por día local Madrid (sin colar live de otros días).\n- Sin date: hoy (Madrid) OR status=live.\n- Con ?date= incluye ligas secundarias por defecto (Hypermotion, etc.).\n- ?league_id=UUID acota a una liga (calendario por UUID).\n- kickoff_local HH:MM Europe/Madrid; scores null en scheduled.","operationId":"get_matches_live_and_today_api_matches_live_get","parameters":[{"name":"include_secondary","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Si true, incluye Hypermotion y otras. Por defecto: false sin date; true con ?date= (calendario del día).","title":"Include Secondary"},"description":"Si true, incluye Hypermotion y otras. Por defecto: false sin date; true con ?date= (calendario del día)."},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Día Europe/Madrid YYYY-MM-DD. Sin date = hoy (+ live). Con date = solo partidos de ese día.","title":"Date"},"description":"Día Europe/Madrid YYYY-MM-DD. Sin date = hoy (+ live). Con date = solo partidos de ese día."},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opcional: UUID de liga (calendario de esa liga ese día / hoy). Si se pasa, ignora el filtro de top leagues.","title":"League Id"},"description":"Opcional: UUID de liga (calendario de esa liga ese día / hoy). Si se pasa, ignora el filtro de top leagues."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches/{match_id}":{"get":{"summary":"Get Match Legacy","operationId":"get_match_legacy_api_matches__match_id__get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches/{match_id}/lineups":{"get":{"summary":"List Match Lineups Legacy","operationId":"list_match_lineups_legacy_api_matches__match_id__lineups_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches/{match_id}/statistics":{"get":{"summary":"Get Match Statistics Legacy","operationId":"get_match_statistics_legacy_api_matches__match_id__statistics_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches/{match_id}/events":{"get":{"summary":"Get Match Events Legacy","operationId":"get_match_events_legacy_api_matches__match_id__events_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches/{match_id}/hub":{"get":{"summary":"Get Match Hub","description":"Hub live (test): detalle + eventos timeline + estadísticas en un solo payload.\nPreferible para Frontend; los endpoints sueltos siguen disponibles.","operationId":"get_match_hub_api_matches__match_id__hub_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/matches/{match_id}/prediction":{"get":{"summary":"Get Match Prediction Legacy","description":"Probabilidades 1-X-2 previas (modelo Poisson / job semanal).\nFuente: data/predictions/latest.json — aún sin ajuste por alineación.","operationId":"get_match_prediction_legacy_api_matches__match_id__prediction_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scout/players":{"get":{"summary":"Scout Players Legacy","description":"Explorador scouting: filtros sobre player_season_stats_mv.","operationId":"scout_players_legacy_api_scout_players_get","parameters":[{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Id"}},{"name":"season_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"}},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Id"}},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"}},{"name":"position_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"GK, DF, MF, FW","title":"Position Group"},"description":"GK, DF, MF, FW"},{"name":"position_detail","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CB, LB, RB, DM, CM, CAM, LW, RW, ST","title":"Position Detail"},"description":"CB, LB, RB, DM, CM, CAM, LW, RW, ST"},{"name":"country_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UUID nacionalidad (primaria o secundaria)","title":"Country Id"},"description":"UUID nacionalidad (primaria o secundaria)"},{"name":"foot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"L, R o B","title":"Foot"},"description":"L, R o B"},{"name":"contract_end_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Contrato expira antes de (YYYY-MM-DD)","title":"Contract End Before"},"description":"Contrato expira antes de (YYYY-MM-DD)"},{"name":"goals_per_million_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Goals Per Million Min"}},{"name":"ga_per90_per_million_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Ga Per90 Per Million Min"}},{"name":"age_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":14},{"type":"null"}],"title":"Age Min"}},{"name":"age_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":14},{"type":"null"}],"title":"Age Max"}},{"name":"market_value_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Market Value Min"}},{"name":"market_value_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Market Value Max"}},{"name":"goals_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Goals Min"}},{"name":"assists_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Assists Min"}},{"name":"matches_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Matches Min"}},{"name":"minutes_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Minutes Min"}},{"name":"saves_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Saves Min"}},{"name":"save_pct_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Save Pct Min"}},{"name":"clean_sheets_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Clean Sheets Min"}},{"name":"goals_conceded_per90_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Goals Conceded Per90 Max"}},{"name":"form_window","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Ventana forma reciente: 5 o 10 partidos","title":"Form Window"},"description":"Ventana forma reciente: 5 o 10 partidos"},{"name":"form_goals_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Form Goals Min"}},{"name":"form_assists_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Form Assists Min"}},{"name":"form_ga_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Form Ga Min"}},{"name":"player_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UUIDs de jugadores separados por coma","title":"Player Ids"},"description":"UUIDs de jugadores separados por coma"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"goals","title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"desc","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/standings/{season_id}":{"get":{"summary":"Get Standings Legacy","description":"Clasificación calculada en vivo desde `matches` con status='finished'.\n\n- Si se proporciona `league_id`, los equipos base salen de `league_participations`\n  (así se incluyen equipos sin partidos jugados todavía con 0/0/0...).\n- Sin `league_id`, se infieren los equipos desde los `matches` de la temporada.\n- `league_id` acepta UUID o ids externos (p. ej. 140 = LaLiga).\n\nReglas: PG=3, PE=1, PP=0. Orden base por puntos; desempates según\n`league_tiebreaker_rules` si la liga tiene reglas activas (p. ej. LaLiga RFEF).\nSin reglas: pts DESC, dg DESC, gf DESC, team_name ASC.","operationId":"get_standings_legacy_api_standings__season_id__get","parameters":[{"name":"season_id","in":"path","required":true,"schema":{"type":"string","title":"Season Id"}},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/standings/{season_id}/player-stats":{"get":{"summary":"Get Standings Player Stats Legacy","description":"Top-N de goleadores, asistentes, amarillas y rojas para una temporada\n(y opcionalmente una liga), agregando `match_events`.","operationId":"get_standings_player_stats_legacy_api_standings__season_id__player_stats_get","parameters":[{"name":"season_id","in":"path","required":true,"schema":{"type":"string","title":"Season Id"}},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leagues":{"get":{"summary":"Get Leagues V1","operationId":"get_leagues_v1_api_v1_leagues_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LeaguePublic"},"type":"array","title":"Response Get Leagues V1 Api V1 Leagues Get"}}}}}}},"/api/v1/countries":{"get":{"summary":"Get Countries V1","operationId":"get_countries_v1_api_v1_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/continents":{"get":{"summary":"List Continents","description":"Listado de continentes desde v_continents_api.","operationId":"list_continents_api_v1_continents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContinentPublic"},"type":"array","title":"Response List Continents Api V1 Continents Get"}}}}}}},"/api/v1/teams":{"get":{"summary":"List Teams","description":"Listado de equipos desde v_teams_api.","operationId":"list_teams_api_v1_teams_get","parameters":[{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filtrar por club","title":"Club Id"},"description":"Filtrar por club"},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filtrar por liga (solo si la vista expone league_id)","title":"League Id"},"description":"Filtrar por liga (solo si la vista expone league_id)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeamPublic"},"title":"Response List Teams Api V1 Teams Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/teams/{team_id}":{"patch":{"summary":"Patch Team","description":"Actualiza columnas editables de `public.teams` (p. ej. parent_team_id).\nEnvía JSON con la clave `parent_team_id`: uuid o null para limpiar.","operationId":"patch_team_api_v1_teams__team_id__patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Team Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clubs":{"get":{"summary":"List Clubs","description":"Información institucional de clubes desde v_clubs_api.","operationId":"list_clubs_api_v1_clubs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ClubPublic"},"type":"array","title":"Response List Clubs Api V1 Clubs Get"}}}}}}},"/api/v1/clubs/teams":{"get":{"summary":"List Clubs Teams","description":"Equipos por club sin requerir club_id.\nSi envías club_id, devuelve solo ese club.","operationId":"list_clubs_teams_api_v1_clubs_teams_get","parameters":[{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Opcional: filtrar por club_id","title":"Club Id"},"description":"Opcional: filtrar por club_id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubTeamsPublic"},"title":"Response List Clubs Teams Api V1 Clubs Teams Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clubs/{club_id}/teams":{"get":{"summary":"List Club Teams","description":"Equipos de un club separados por tipo:\n- team_type == 'main'    -> equipo profesional\n- team_type == 'reserve' -> filiales","operationId":"list_club_teams_api_v1_clubs__club_id__teams_get","parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamsPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/coaches":{"get":{"summary":"List Coaches","description":"Entrenadores desde v_coaches_api.","operationId":"list_coaches_api_v1_coaches_get","parameters":[{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filtrar por estado activo/inactivo","title":"Active"},"description":"Filtrar por estado activo/inactivo"},{"name":"nationality","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtrar por nacionalidad (igualdad sin distinguir mayúsculas)","title":"Nationality"},"description":"Filtrar por nacionalidad (igualdad sin distinguir mayúsculas)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CoachPublic"},"title":"Response List Coaches Api V1 Coaches Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stadiums":{"get":{"summary":"List Stadiums","description":"Sedes / estadios desde v_stadiums_api.","operationId":"list_stadiums_api_v1_stadiums_get","parameters":[{"name":"country_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtrar por país (nombre, igualdad sin distinguir mayúsculas)","title":"Country Name"},"description":"Filtrar por país (nombre, igualdad sin distinguir mayúsculas)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StadiumPublic"},"title":"Response List Stadiums Api V1 Stadiums Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/matches":{"get":{"summary":"List Matches","description":"Listado de partidos desde v_matches_api.","operationId":"list_matches_api_v1_matches_get","parameters":[{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filtrar por liga","title":"League Id"},"description":"Filtrar por liga"},{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filtrar por temporada (UUID)","title":"Season Id"},"description":"Filtrar por temporada (UUID)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MatchPublic"},"title":"Response List Matches Api V1 Matches Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/matches/{match_id}/statistics":{"get":{"summary":"Get Match Statistics","description":"Estadísticas del partido (tabla match_statistics + equipos; una fila por partido).\nIncluye `stats` como lista {name, home, away} para el frontend.","operationId":"get_match_statistics_api_v1_matches__match_id__statistics_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchStatisticsDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/matches/{match_id}/lineups":{"get":{"summary":"List Match Lineups","description":"Alineaciones (titulares y suplentes) desde v_match_lineups_api.","operationId":"list_match_lineups_api_v1_matches__match_id__lineups_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MatchLineupPublic"},"title":"Response List Match Lineups Api V1 Matches  Match Id  Lineups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/players":{"get":{"summary":"List Players","description":"Listado paginado desde v_players_api (~20k jugadores).","operationId":"list_players_api_v1_players_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"position","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtrar por posición (comparación insensible a mayúsculas)","title":"Position"},"description":"Filtrar por posición (comparación insensible a mayúsculas)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPlayersPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/players/stats":{"get":{"summary":"List Player Stats Ranking","description":"Ranking de goleadores (y datos de temporada) desde v_player_season_stats_api.\nOrden: goles DESC, asistencias DESC.\nSi la vista no tiene league_id, elimina el filtro del SQL en este archivo.","operationId":"list_player_stats_ranking_api_v1_players_stats_get","parameters":[{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filtrar ranking por temporada","title":"Season Id"},"description":"Filtrar ranking por temporada"},{"name":"season_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtrar por nombre de temporada (ej. 2025/2026)","title":"Season Name"},"description":"Filtrar por nombre de temporada (ej. 2025/2026)"},{"name":"league_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filtrar por liga si la vista lo expone","title":"League Id"},"description":"Filtrar por liga si la vista lo expone"},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filtrar por equipo","title":"Team Id"},"description":"Filtrar por equipo"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Máximo de filas","default":100,"title":"Limit"},"description":"Máximo de filas"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Desplazamiento para paginación","default":0,"title":"Offset"},"description":"Desplazamiento para paginación"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPlayerStatsPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/players/{player_id}/history":{"get":{"summary":"List Player History","description":"Fichajes e historial de equipos desde v_player_history_api.","operationId":"list_player_history_api_v1_players__player_id__history_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlayerTransferHistoryPublic"},"title":"Response List Player History Api V1 Players  Player Id  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/players/{player_id}/snapshots":{"get":{"summary":"List Player Snapshots","description":"Evolución del valor de mercado (y datos físicos) desde v_player_snapshots_api.","operationId":"list_player_snapshots_api_v1_players__player_id__snapshots_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlayerSnapshotPublic"},"title":"Response List Player Snapshots Api V1 Players  Player Id  Snapshots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/players/{player_id}/injuries":{"get":{"summary":"List Player Injuries","description":"Lesiones / estado físico del jugador desde v_player_injuries_api.","operationId":"list_player_injuries_api_v1_players__player_id__injuries_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlayerInjuryPublic"},"title":"Response List Player Injuries Api V1 Players  Player Id  Injuries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcademiesListResponse":{"properties":{"academies":{"items":{"$ref":"#/components/schemas/AcademyResponse"},"type":"array","title":"Academies"}},"type":"object","required":["academies"],"title":"AcademiesListResponse"},"AcademyResponse":{"properties":{"parent_club_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Club Id"},"parent_club_name":{"type":"string","title":"Parent Club Name"},"parent_team_id":{"type":"string","title":"Parent Team Id"},"parent_team_ids":{"items":{"type":"string"},"type":"array","title":"Parent Team Ids","default":[]},"subsidiaries":{"items":{"$ref":"#/components/schemas/AcademySubsidiaryResponse"},"type":"array","title":"Subsidiaries"},"total_market_value":{"type":"number","title":"Total Market Value"},"total_growth_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Growth Percentage"}},"type":"object","required":["parent_club_name","parent_team_id","subsidiaries","total_market_value"],"title":"AcademyResponse","description":"Cantera agrupada por equipo padre (`teams.parent_team_id` apunta al principal)."},"AcademySubsidiaryResponse":{"properties":{"subsidiary_id":{"type":"integer","title":"Subsidiary Id"},"subsidiary_name":{"type":"string","title":"Subsidiary Name"},"teams":{"items":{"$ref":"#/components/schemas/AcademyTeamResponse"},"type":"array","title":"Teams"},"total_market_value":{"type":"number","title":"Total Market Value"},"growth_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Percentage"}},"type":"object","required":["subsidiary_id","subsidiary_name","teams","total_market_value"],"title":"AcademySubsidiaryResponse"},"AcademyTeamResponse":{"properties":{"team_id":{"type":"string","title":"Team Id"},"team_name":{"type":"string","title":"Team Name"},"category_level":{"type":"integer","title":"Category Level"},"total_market_value":{"type":"number","title":"Total Market Value"},"growth_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Percentage"},"team_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Role"}},"type":"object","required":["team_id","team_name","category_level","total_market_value"],"title":"AcademyTeamResponse","description":"Equipo en árbol cantera: ids UUID como string (legacy /api)."},"ClubPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"official_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Official Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"stadium_name":{"type":"string","title":"Stadium Name"},"country_name":{"type":"string","title":"Country Name"},"country_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Country Id"},"stadium_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Stadium Id"}},"type":"object","required":["id","name","stadium_name","country_name"],"title":"ClubPublic","description":"Club institucional desde v_clubs_api."},"ClubTeamsPublic":{"properties":{"club_id":{"type":"string","format":"uuid","title":"Club Id"},"main_team":{"anyOf":[{"$ref":"#/components/schemas/TeamPublic"},{"type":"null"}]},"reserve_teams":{"items":{"$ref":"#/components/schemas/TeamPublic"},"type":"array","title":"Reserve Teams","default":[]}},"type":"object","required":["club_id"],"title":"ClubTeamsPublic","description":"Equipos de un club, separados por profesional y filiales."},"CoachPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"birth_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birth Date"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"nationality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nationality"}},"type":"object","required":["id"],"title":"CoachPublic","description":"Cuerpo técnico / entrenador desde v_coaches_api."},"ContinentPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"continent_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continent Code"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","required":["id","name"],"title":"ContinentPublic","description":"Continente desde v_continents_api."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LeaguePublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"category_level":{"type":"integer","title":"Category Level"},"country_name":{"type":"string","title":"Country Name"},"country_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Country Id"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["id","name","slug","category_level","country_name"],"title":"LeaguePublic","description":"Esquema público para API v1: sin URLs externas en la respuesta ni en OpenAPI."},"LeagueTeamOption":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"LeagueTeamOption","description":"Equipo (id, name) para desplegables por liga (league_participations)."},"MatchLineupPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"match_id":{"type":"string","format":"uuid","title":"Match Id"},"team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"},"player_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Player Id"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"player_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Name"},"player_nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Nickname"},"shirt_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shirt Number"},"position_short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position Short Name"},"is_starter":{"type":"boolean","title":"Is Starter","default":false},"formation_slot_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Formation Slot Id"},"slot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slot Name"},"x_pos":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X Pos"},"y_pos":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y Pos"},"formation_template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formation Template Name"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"minutes_played":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minutes Played"},"expected_goals":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Goals"},"expected_assists":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Assists"},"total_shots":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Shots"},"shots_on_target":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shots On Target"},"key_passes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Key Passes"},"accurate_passes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Accurate Passes"},"total_passes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Passes"},"touches":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Touches"},"tackles_won":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tackles Won"},"interceptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interceptions"},"saves":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saves"},"goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Goals"},"assists":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assists"},"yellow_cards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Yellow Cards"},"red_cards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Red Cards"},"sofa_statistics":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Sofa Statistics"},"sofascore_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sofascore Synced At"}},"additionalProperties":true,"type":"object","required":["id","match_id"],"title":"MatchLineupPublic","description":"Fila de alineación (titular o suplente) + stats SofaScore si existen."},"MatchPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"season_id":{"type":"string","format":"uuid","title":"Season Id"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"league_id":{"type":"string","format":"uuid","title":"League Id"},"league_name":{"type":"string","title":"League Name"},"stadium_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Stadium Id"},"stadium_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stadium Name"},"home_formation_template_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Formation Template Id"},"away_formation_template_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Formation Template Id"},"home_formation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Formation"},"away_formation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Formation"},"home_team_id":{"type":"string","format":"uuid","title":"Home Team Id"},"home_team_name":{"type":"string","title":"Home Team Name"},"away_team_id":{"type":"string","format":"uuid","title":"Away Team Id"},"away_team_name":{"type":"string","title":"Away Team Name"},"match_date":{"type":"string","format":"date-time","title":"Match Date"},"status":{"type":"string","title":"Status"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"round_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Round Number"}},"type":"object","required":["id","season_id","league_id","league_name","home_team_id","home_team_name","away_team_id","away_team_name","match_date","status"],"title":"MatchPublic","description":"Partido expuesto desde v_matches_api (solo columnas seguras; sin external_id ni URLs)."},"MatchStatGroupPublic":{"properties":{"name":{"type":"string","title":"Name"},"items":{"items":{"$ref":"#/components/schemas/MatchStatPairPublic"},"type":"array","title":"Items"}},"type":"object","required":["name","items"],"title":"MatchStatGroupPublic","description":"Bloque de estadísticas (Resumen, Tiros, Ataque, …)."},"MatchStatPairPublic":{"properties":{"name":{"type":"string","title":"Name"},"home":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home"},"away":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away"},"home_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Display"},"away_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Display"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},"type":"object","required":["name"],"title":"MatchStatPairPublic","description":"Una fila de estadística local vs visitante (para la pestaña del partido)."},"MatchStatisticsDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"match_id":{"type":"string","format":"uuid","title":"Match Id"},"home_team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team Name"},"away_team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team Name"},"posesion_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Posesion Home"},"posesion_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Posesion Away"},"possession_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Possession Home"},"possession_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Possession Away"},"pases_realizados_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pases Realizados Home"},"pases_intentados_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pases Intentados Home"},"pases_realizados_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pases Realizados Away"},"pases_intentados_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pases Intentados Away"},"remates_a_puerta_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remates A Puerta Home"},"remates_a_puerta_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remates A Puerta Away"},"shots_on_target_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shots On Target Home"},"shots_on_target_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shots On Target Away"},"fueras_de_juego_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fueras De Juego Home"},"fueras_de_juego_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fueras De Juego Away"},"corneres_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Corneres Home"},"corneres_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Corneres Away"},"corners_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Corners Home"},"corners_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Corners Away"},"saques_de_banda_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saques De Banda Home"},"saques_de_banda_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saques De Banda Away"},"faltas_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Faltas Home"},"faltas_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Faltas Away"},"paradas_home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Paradas Home"},"paradas_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Paradas Away"},"stats":{"anyOf":[{"items":{"$ref":"#/components/schemas/MatchStatPairPublic"},"type":"array"},{"type":"null"}],"title":"Stats"},"groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/MatchStatGroupPublic"},"type":"array"},{"type":"null"}],"title":"Groups"}},"type":"object","required":["id","match_id"],"title":"MatchStatisticsDetail","description":"Una fila de estadísticas por partido (vista ancha tipo match_statistics).\n`stats` se rellena en el backend para el frontend (evita depender solo del parseo en cliente).\n`groups` son las estadísticas avanzadas SofaScore en castellano."},"PaginatedPlayerStatsPublic":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlayerTopScorerPublic"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"PaginatedPlayerStatsPublic","description":"Ranking paginado (goleadores, etc.)."},"PaginatedPlayersPublic":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlayerPublic"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","page_size","pages"],"title":"PaginatedPlayersPublic"},"PaginatedTransfersPublic":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TransferFeedItemPublic"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"pages":{"type":"integer","title":"Pages"},"window":{"type":"string","title":"Window"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},"type":"object","required":["items","total","page","page_size","pages","window"],"title":"PaginatedTransfersPublic"},"PlayerInjuryPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"player_id":{"type":"string","format":"uuid","title":"Player Id"},"injury_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Injury Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"started_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Started On"},"expected_return_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expected Return On"}},"type":"object","required":["id","player_id"],"title":"PlayerInjuryPublic","description":"Lesión / estado físico desde v_player_injuries_api."},"PlayerPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"full_name_raw":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name Raw"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position"},"birth_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birth Date"},"birth_place":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Birth Place"},"height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Height"},"weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight"},"foot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Foot"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"},"country_flag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Country Flag"}},"type":"object","required":["id"],"title":"PlayerPublic","description":"Jugador listado desde v_players_api."},"PlayerSnapshotPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"player_id":{"type":"string","format":"uuid","title":"Player Id"},"log_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Log Date"},"market_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Value"},"height_cm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Cm"},"weight_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight Kg"},"current_team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Current Team Id"},"current_team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Team Name"}},"type":"object","required":["id","player_id"],"title":"PlayerSnapshotPublic","description":"Evolución valor de mercado / datos físicos desde v_player_snapshots_api."},"PlayerTopScorerPublic":{"properties":{"player_id":{"type":"string","format":"uuid","title":"Player Id"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"season_id":{"type":"string","format":"uuid","title":"Season Id"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Goals"},"assists":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assists"},"matches_played":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matches Played"}},"type":"object","required":["player_id","season_id"],"title":"PlayerTopScorerPublic","description":"Fila de ranking (goleadores) desde v_player_season_stats_api."},"PlayerTransferHistoryPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"player_id":{"type":"string","format":"uuid","title":"Player Id"},"team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"season_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Season Id"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"joining_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Joining Date"},"leaving_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Leaving Date"},"is_loan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Loan","default":false},"from_team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"From Team Id"},"from_team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Team Name"},"transfer_fee_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transfer Fee Label"},"market_value_at_transfer":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Value At Transfer"},"transfer_fee":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Transfer Fee"},"transfer_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transfer Type"}},"type":"object","required":["id","player_id"],"title":"PlayerTransferHistoryPublic","description":"Fichajes / historial de clubes desde v_player_history_api (sin URLs ni external_id)."},"StadiumPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"}},"type":"object","required":["id","name"],"title":"StadiumPublic","description":"Estadio desde v_stadiums_api."},"TeamPatch":{"properties":{"parent_team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Team Id"}},"type":"object","title":"TeamPatch","description":"Actualización parcial de equipo (tabla `teams`)."},"TeamPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"club_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Club Id"},"parent_team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Team Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"team_type":{"type":"string","title":"Team Type"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"secondary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Color"},"jersey_pattern":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jersey Pattern"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["id","name","team_type"],"title":"TeamPublic","description":"Equipo desde v_teams_api (sin external_id)."},"TransferFeedItemPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"player_id":{"type":"string","format":"uuid","title":"Player Id"},"team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"season_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Season Id"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"joining_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Joining Date"},"leaving_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Leaving Date"},"is_loan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Loan","default":false},"from_team_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"From Team Id"},"from_team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Team Name"},"transfer_fee_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transfer Fee Label"},"market_value_at_transfer":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Value At Transfer"},"transfer_fee":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Transfer Fee"},"transfer_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transfer Type"},"player_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Name"}},"type":"object","required":["id","player_id"],"title":"TransferFeedItemPublic","description":"Fila del feed global de fichajes (incluye nombre del jugador)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}