{"openapi":"3.1.0","info":{"title":"Pokékipe Public API","description":"Read-only competitive Pokémon analytics derived from Smogon's monthly public usage statistics. Public endpoints under /api/v1/{formats,meta,pokemon,compare,pokedata,entities,ladder,timeline,profiles,tournaments,champions,pokemon-of-the-day} require no authentication. Authenticated endpoints (/api/v1/account, /api/v1/box, /api/v1/notifications, etc.) are visible for completeness but are intended for the website itself ; third parties typically integrate against the public surface only. An optional API key bumps the rate-limit ceiling and can be generated from /account/settings.","version":"1.0.0","x-logo":{"url":"/icon.svg","altText":"Pokékipe"},"contact":{"name":"Pokékipe Team","url":"https://discord.gg/ek4qFYkK6w"},"license":{"name":"Public data, CC BY 4.0","url":"https://creativecommons.org/licenses/by/4.0/"}},"paths":{"/api/v1/formats":{"get":{"tags":["Public","formats"],"summary":"List Formats","operationId":"list_formats_api_formats_get","parameters":[{"name":"elo_cutoff","in":"query","required":false,"schema":{"type":"integer","description":"ELO cutoff bucket used for trend calculations. Pass 0 for the unfiltered bucket (all players); 1500/1630/1695/1825 are the canonical Smogon cutoffs.","default":1695,"title":"Elo Cutoff"},"description":"ELO cutoff bucket used for trend calculations. Pass 0 for the unfiltered bucket (all players); 1500/1630/1695/1825 are the canonical Smogon cutoffs."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FormatResponse"},"title":"Response List Formats Api Formats Get"},"example":[{"format_id":"gen9ou","nom_affiche":"Gen 9 OU","generation":9,"tier":"OU","gen_number":9,"tier_name":"OU","label":"Gen 9 OU","format_kind":"singles","dernier_snapshot":{"annee":2026,"mois":4,"elo_cutoff":1695},"premier_snapshot":{"annee":2022,"mois":12,"elo_cutoff":0},"nb_snapshots":41,"dernieres_batailles":184239,"batailles_mois_precedent":192104,"available_elos":[0,1500,1630,1695,1825]}]}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/formats/last-ingestion":{"get":{"tags":["Public","formats"],"summary":"Last Ingestion","description":"Latest Smogon ingestion timestamp across the most recent month's snapshots. Use this to know when the data was last refreshed.","operationId":"last_ingestion_api_formats_last_ingestion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Last Ingestion Api Formats Last Ingestion Get"},"example":{"annee":2026,"mois":4,"date_ingestion":"2026-05-01T08:14:23Z"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/formats/grouped":{"get":{"tags":["Public","formats"],"summary":"List Formats Grouped","description":"Formats grouped by generation, with aggregated battle counts and snapshot freshness per group.","operationId":"list_formats_grouped_api_formats_grouped_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Formats Grouped Api Formats Grouped Get"},"example":{"generations":[{"gen":9,"gen_label":"Gen 9","tiers":[{"format_id":"gen9ou","nom_affiche":"Gen 9 OU","generation":9,"tier":"OU","gen_number":9,"tier_name":"OU","label":"Gen 9 OU","format_kind":"singles","nb_snapshots":41,"dernieres_batailles":184239,"available_elos":[0,1500,1630,1695,1825],"dernier_snapshot":{"annee":2026,"mois":4,"elo_cutoff":1695},"premier_snapshot":{"annee":2022,"mois":12,"elo_cutoff":0}}],"total_snapshots":482,"total_batailles":1984521,"dernier_mois":{"annee":2026,"mois":4}}]}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/meta/{format_id}/history":{"get":{"tags":["Public","meta"],"summary":"Get Meta History","description":"Batched usage history for the top N Pokémon in a format.\n\nReturns a matrix of (Pokémon × month) with usage rate and rank for each\ncell. Single SQL query under the hood, so this is fast even for the\nfull top-30 over 12 months.","operationId":"get_meta_history_api_meta__format_id__history_get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":48,"title":"Months"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Meta History Api Meta  Format Id  History Get"},"example":{"format_id":"gen9ou","elo_cutoff":1695,"history":[{"annee":2026,"mois":1,"battles":165882,"snapshot_count":1},{"annee":2026,"mois":2,"battles":178412,"snapshot_count":1},{"annee":2026,"mois":3,"battles":192104,"snapshot_count":1},{"annee":2026,"mois":4,"battles":184239,"snapshot_count":1}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/meta/{format_id}/metagame":{"get":{"tags":["Public","meta"],"summary":"Get Metagame","description":"Metagame breakdown for a format: playstyle archetype shares (offense / balance / stall / etc.) plus the stalliness distribution histogram. Powers the format-overview bubbles.","operationId":"get_metagame_api_meta__format_id__metagame_get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Format YYYY-MM","title":"Month"},"description":"Format YYYY-MM"},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Metagame Api Meta  Format Id  Metagame Get"},"example":{"format_id":"gen9ou","annee":2026,"mois":4,"elo_cutoff":1695,"metagame":[{"category":"stall","share":14.2},{"category":"balance","share":41.6},{"category":"offense","share":28.1},{"category":"hyper-offense","share":16.1}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/meta/{format_id}/tier-maxstats":{"get":{"tags":["Public","meta"],"summary":"Get Tier Max Stats","description":"Returns the max base stat for each stat across all Pokémon in the latest snapshot.","operationId":"get_tier_max_stats_api_meta__format_id__tier_maxstats_get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Tier Max Stats Api Meta  Format Id  Tier Maxstats Get"},"example":{"format_id":"gen9ou","annee":2026,"mois":4,"elo_cutoff":1695,"max_stats":{"hp":502,"atk":416,"def":394,"spa":405,"spd":387,"spe":410}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/meta/{format_id}/median-basestats":{"get":{"tags":["Public","meta"],"summary":"Get Median Base Stats","description":"Median base stat per stat across the top 50 played Pokémon in the latest snapshot.","operationId":"get_median_base_stats_api_meta__format_id__median_basestats_get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Median Base Stats Api Meta  Format Id  Median Basestats Get"},"example":{"format_id":"gen9ou","annee":2026,"mois":4,"elo_cutoff":1695,"median_base_stats":{"hp":89,"atk":110,"def":95,"spa":100,"spd":90,"spe":102},"sample_size":50}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/meta/{format_id}":{"get":{"tags":["Public","meta"],"summary":"Get Meta Overview","operationId":"get_meta_overview_api_meta__format_id__get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Format YYYY-MM","title":"Month"},"description":"Format YYYY-MM"},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":30,"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":{"$ref":"#/components/schemas/MetaOverviewResponse"},"example":{"format_id":"gen9ou","elo_cutoff":1695,"annee":2026,"mois":4,"total_battles":184239,"pokemon":[{"name":"great-tusk","showdown_id":"greattusk","rank":1,"usage":41.82,"raw_usage":35.21,"real":39.1,"dex_number":984,"types":["ground","fighting"]},{"name":"kingambit","showdown_id":"kingambit","rank":2,"usage":38.94,"raw_usage":33.55,"real":36.72,"dex_number":983,"types":["dark","steel"]}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/meta/{format_id}/vr":{"get":{"tags":["Public","meta"],"summary":"Get Format Vr","description":"Returns the VR metadata for a format (thread URL, last update).","operationId":"get_format_vr_api_meta__format_id__vr_get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Format Vr Api Meta  Format Id  Vr Get"},"example":{"format_id":"gen9ou","vr":[{"name":"great-tusk","tier":"S","rank_in_tier":1},{"name":"kingambit","tier":"S","rank_in_tier":2},{"name":"gholdas","tier":"A+","rank_in_tier":1}],"snapshot_date":"2026-04-15","source":"smogon-vr"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/compare":{"get":{"tags":["Public","compare"],"summary":"Compare Pokemon","operationId":"compare_pokemon_api_compare_get","parameters":[{"name":"a","in":"query","required":true,"schema":{"type":"string","title":"A"}},{"name":"b","in":"query","required":true,"schema":{"type":"string","title":"B"}},{"name":"format","in":"query","required":true,"schema":{"type":"string","title":"Format"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Month"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"type":"integer","default":1695,"title":"Elo Cutoff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"},"example":{"format_id":"gen9ou","elo_cutoff":1695,"annee":2026,"mois":4,"left":{"name":"great-tusk","usage":41.82,"rank":1,"matchup_score":62.4},"right":{"name":"kingambit","usage":38.94,"rank":2,"matchup_score":37.6},"shared_teammates":["gholdas","iron-valiant"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/compare/teams":{"post":{"tags":["Public","compare"],"summary":"Compare Teams","operationId":"compare_teams_api_compare_teams_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamVsTeamRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamVsTeamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/compare/{a_slug}/vs/{b_slug}/narrative":{"get":{"tags":["Public","compare"],"summary":"Get Narrative","description":"Return 1-3 short English sentences justifying the head-to-head verdict.\n\nCache key is `(a_slug, b_slug, format, elo_cutoff)` ordered as given —\nthe inverse direction (B vs A) is cached separately because the narrative\nvoice flips (\"X outspeeds Y\" → \"Y outspeeds X\").","operationId":"get_narrative_api_compare__a_slug__vs__b_slug__narrative_get","parameters":[{"name":"a_slug","in":"path","required":true,"schema":{"type":"string","title":"A Slug"}},{"name":"b_slug","in":"path","required":true,"schema":{"type":"string","title":"B Slug"}},{"name":"format","in":"query","required":true,"schema":{"type":"string","title":"Format"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Narrative Api Compare  A Slug  Vs  B Slug  Narrative Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokemon/search":{"get":{"tags":["Public","search"],"summary":"Search Pokemon","description":"Search Pokémon by partial name. Each result lists the formats it\nhas data in, ordered by battle volume.\n\n`lang` (optional, default \"en\"): when non-English, the search also\nmatches localized Pokémon names from `pokemon_translations` and the\nreturned `display_name` is in that locale. The canonical\n`pokemon_name` (English) is always returned for stable linking.\n\n`gen` (optional): filters the per-result `formats` list to the\nrequested generation. Used by calc/compare to keep cross-format\nfallback within consistent mechanics — a\nPokémon joué OU en gen 5 ne doit pas servir de fallback pour un\nPokémon A en gen 9 (Tera/abilities/items différents).","operationId":"search_pokemon_api_pokemon_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":50,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":8,"default":"en","title":"Lang"}},{"name":"gen","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":99,"minimum":1},{"type":"null"}],"description":"Restrict the `formats` list of each result to formats matching this generation (e.g. `gen=9` only keeps gen9ou / gen9uu / gen9vgc). Used by Calculator + Compare to find a same-gen fallback format when the user's picked Pokémon has 0% usage in the selected format but is played in another tier of the same gen.","title":"Gen"},"description":"Restrict the `formats` list of each result to formats matching this generation (e.g. `gen=9` only keeps gen9ou / gen9uu / gen9vgc). Used by Calculator + Compare to find a same-gen fallback format when the user's picked Pokémon has 0% usage in the selected format but is played in another tier of the same gen."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response Search Pokemon Api Pokemon Search Get"},"example":{"query":"great","results":[{"name":"great-tusk","showdown_id":"greattusk","dex_number":984}],"took_ms":3}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/move/{name}":{"get":{"tags":["Public","pokedata"],"summary":"Get Move","operationId":"get_move_api_pokedata_move__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)","default":"en","title":"Lang"},"description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Move Api Pokedata Move  Name  Get"},"example":{"name":"earthquake","display_name":"Earthquake","type":"ground","category":"physical","power":100,"accuracy":100,"pp":10,"priority":0,"description":"Hits all adjacent Pokémon. Damage doubled in Dig."}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/item/{name}":{"get":{"tags":["Public","pokedata"],"summary":"Get Item","operationId":"get_item_api_pokedata_item__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)","default":"en","title":"Lang"},"description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Item Api Pokedata Item  Name  Get"},"example":{"name":"heavy-duty-boots","display_name":"Heavy-Duty Boots","category":"held","description":"Holder is unaffected by entry hazards.","fling_power":0}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/ability/{name}":{"get":{"tags":["Public","pokedata"],"summary":"Get Ability","operationId":"get_ability_api_pokedata_ability__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)","default":"en","title":"Lang"},"description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Ability Api Pokedata Ability  Name  Get"},"example":{"name":"protosynthesis","display_name":"Protosynthesis","description":"Boosts the holder's highest stat in harsh sunlight or while holding Booster Energy.","is_hidden":false}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/search":{"get":{"tags":["Public","pokedata"],"summary":"Search Pokedata","description":"Search moves, items and abilities by partial name match.\nWhen lang != en, also searches translated display_name.","operationId":"search_pokedata_api_pokedata_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":50,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Limit"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code","default":"en","title":"Lang"},"description":"Language code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object"}},"title":"Response Search Pokedata Api Pokedata Search Get"},"example":{"query":"great","results":[{"kind":"pokemon","name":"great-tusk","display_name":"Great Tusk"},{"kind":"move","name":"great-rage","display_name":"Great Rage"}],"took_ms":4}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/moves":{"get":{"tags":["Public","pokedata"],"summary":"Get Moves Batch","description":"Return a map {smogon_name: move_data} for all requested names.","operationId":"get_moves_batch_api_pokedata_moves_get","parameters":[{"name":"names","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated list of move names","title":"Names"},"description":"Comma-separated list of move names"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code","default":"en","title":"Lang"},"description":"Language code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"object"},{"type":"null"}]},"title":"Response Get Moves Batch Api Pokedata Moves Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/items":{"get":{"tags":["Public","pokedata"],"summary":"Get Items Batch","operationId":"get_items_batch_api_pokedata_items_get","parameters":[{"name":"names","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated list of item names","title":"Names"},"description":"Comma-separated list of item names"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code","default":"en","title":"Lang"},"description":"Language code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"object"},{"type":"null"}]},"title":"Response Get Items Batch Api Pokedata Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/abilities":{"get":{"tags":["Public","pokedata"],"summary":"Get Abilities Batch","operationId":"get_abilities_batch_api_pokedata_abilities_get","parameters":[{"name":"names","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated list of ability names","title":"Names"},"description":"Comma-separated list of ability names"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code","default":"en","title":"Lang"},"description":"Language code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"object"},{"type":"null"}]},"title":"Response Get Abilities Batch Api Pokedata Abilities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokedata/pokemon-names":{"get":{"tags":["Public","pokedata"],"summary":"Get Pokemon Names Batch","description":"Return a map {smogon_name: translated_display_name} for all requested names.\nReturns the original name as fallback when no translation exists.","operationId":"get_pokemon_names_batch_api_pokedata_pokemon_names_get","parameters":[{"name":"names","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated list of Smogon Pokemon names","title":"Names"},"description":"Comma-separated list of Smogon Pokemon names"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code","default":"en","title":"Lang"},"description":"Language code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Get Pokemon Names Batch Api Pokedata Pokemon Names Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/events/{source}/{slug}":{"get":{"tags":["Public","timeline"],"summary":"Get Event Detail","description":"Public detail for any timeline event, regardless of source (official:\nVGC, Champions, pokedata, play_pokemon — or Smogon: tournaments and\ntiering). The endpoint hits three tables in parallel and normalizes\nthe result into the EventDetail schema. Fields that don't apply\n(e.g. stream_url for a Smogon tournament) come back as null.\n\nTables consulted:\n  - official_events            (VGC, Champions, mixed sources)\n  - smogon_tournaments         (source = 'smogon')\n  - smogon_tiering_events      (source = 'smogon')\n\n`source` sert à router la requête :\n  - 'smogon' → cherche dans smogon_tournaments PUIS smogon_tiering_events\n  - autre    → cherche dans official_events","operationId":"get_event_detail_api_timeline_events__source___slug__get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/events/limitless/{slug}/standings":{"get":{"tags":["Public","timeline"],"summary":"Get Limitless Standings","description":"Standings and decklists for a community-run Champions tournament.\n\nSlug = `official_events.id` prefixed with `limitless_` by the scraper.\nResponse carries every player with their placing, win/loss/tie record,\ncountry, and parsed decklist. The website renders three sub-views from\nthis payload (Top Teams = top 16 sliced, Standings = full, Meta =\naggregate of decklists).\n\nNo auth — public data. Served with `no-store` cache hint because\nstandings can change mid-tournament.","operationId":"get_limitless_standings_api_timeline_events_limitless__slug__standings_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__timeline_standings__StandingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/events/limitless/{slug}/meta":{"get":{"tags":["Public","timeline"],"summary":"Get Limitless Meta","description":"Agrégat meta d'un tournoi : top combinaisons (1, 2, 3 ou 4 Pokémon)\navec leur usage rate, win rate, et record cumulé.\n\nCalcul à la volée (pas de cache table) :\n  1. Charge les standings de scope (all = tous, top16 = placing <= 16)\n  2. Pour chaque équipe, génère les C(team_size, k) combinaisons (k = 1/2/3/4)\n  3. Agrège par combo : count, somme W/L/T\n  4. Compute seen_pct = count / total_teams, win_pct = wins / matches\n\nCoût : pour 67 teams × C(6,2)=15 = 1005 paires à comptabiliser. Trivial,\n<50 ms même sans cache. Si jamais on a un Worlds à 800 joueurs en M-A,\non cachera (1005 → 12 000 paires, toujours OK).","operationId":"get_limitless_meta_api_timeline_events_limitless__slug__meta_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"grouping","in":"query","required":false,"schema":{"enum":["single","duos","trios","quads"],"type":"string","default":"single","title":"Grouping"}},{"name":"scope","in":"query","required":false,"schema":{"enum":["all","top16"],"type":"string","default":"all","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/events/pokedata/{slug}/standings":{"get":{"tags":["Public","timeline"],"summary":"Get Pokedata Standings","description":"Standings + décklists Masters d'un VGC officiel pokedata.\n\nSlug = `official_events.id` (préfixé `pokedata_` ou autre hash). Réponse\nnormalisée vers le même schéma que `/limitless/{slug}/standings` pour\nque le frontend puisse réutiliser les mêmes composants.","operationId":"get_pokedata_standings_api_timeline_events_pokedata__slug__standings_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__timeline_standings__StandingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/events/pokedata/{slug}/meta":{"get":{"tags":["Public","timeline"],"summary":"Get Pokedata Meta","description":"Agrégat meta d'un tournoi pokedata. Logique identique à\n/limitless/{slug}/meta — calcule les combinaisons (Single/Duos/Trios/\nQuads) sur tous les joueurs (All) ou seulement le top 16, avec count,\nseen %, win %, record cumulé.","operationId":"get_pokedata_meta_api_timeline_events_pokedata__slug__meta_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"grouping","in":"query","required":false,"schema":{"enum":["single","duos","trios","quads"],"type":"string","default":"single","title":"Grouping"}},{"name":"scope","in":"query","required":false,"schema":{"enum":["all","top16"],"type":"string","default":"all","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/events/{source}/{slug}/bracket":{"get":{"tags":["Public","timeline"],"summary":"Get Event Bracket","description":"Reconstruit le bracket élim d'un event externe.\n\npokedata : on lit `elim_rounds_json` de chaque joueur, on déduplique\nles matches (chaque match apparaît côté A ET côté B), on ré-indexe les\nrounds (round 13 du JSON → round 1 du bracket élim, round 14 → 2, ...).\nLe seed des matches sur l'arbre vient de l'ordre des placings :\nles meilleurs placés sont en haut.\n\nlimitless : on lit `phase=2` du `/pairings` endpoint upstream (déjà\nrécupéré par le scraper et stocké dans... on doit le fetch à la volée\npour l'instant — on n'a pas encore de table dédiée pour les pairings).\n\nPour la v1 on supporte uniquement pokedata. Limitless bracket = TODO\n(nécessite ajout d'une mig + scrape des pairings).","operationId":"get_event_bracket_api_timeline_events__source___slug__bracket_get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BracketResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/recap/{year}/{month}":{"get":{"tags":["Public","timeline"],"summary":"Get Monthly Recap","description":"Notable events aggregated for a given month. Data is pulled from\nfour sources: user-hosted tournaments finished in window, official\nVGC and Champions events by start_date, Smogon tiering events\n(suspects/drops), and broadcast notifications (top-1 changes,\nmeta hype, tier shifts).\n\nWhen fewer than three items are found, `is_sparse=true` so the\nconsumer can render a \"quiet month\" placeholder instead of an empty\nstate.","operationId":"get_monthly_recap_api_timeline_recap__year___month__get","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"path","required":true,"schema":{"type":"integer","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlyRecapResponse"},"example":{"year":2026,"month":4,"highlights":[{"kind":"ladder_swing","summary":"Great Tusk overtakes Kingambit in OU."},{"kind":"tournament","summary":"Wolfe Glick wins Seattle Regional with Restricted Calyrex-Shadow."}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/entities/{entity_type}/{slug}":{"get":{"tags":["Public","entities"],"summary":"Get Entity Detail","operationId":"get_entity_detail_api_entities__entity_type___slug__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"format_id","in":"query","required":false,"schema":{"type":"string","default":"gen9ou","title":"Format Id"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"type":"integer","default":1695,"title":"Elo Cutoff"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Format YYYY-MM. Omit for latest snapshot.","title":"Month"},"description":"Format YYYY-MM. Omit for latest snapshot."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)","default":"en","title":"Lang"},"description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDetailResponse"},"example":{"entity_type":"move","slug":"earthquake","name":"Earthquake","format_id":"gen9ou","annee":2026,"mois":4,"usage":41.2,"rank":1,"carried_by":[{"name":"great-tusk","usage":88.4},{"name":"garchomp","usage":72.1}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/entities/{entity_type}/{slug}/history":{"get":{"tags":["Public","entities"],"summary":"Get Entity History Endpoint","operationId":"get_entity_history_endpoint_api_entities__entity_type___slug__history_get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"format_id","in":"query","required":false,"schema":{"type":"string","default":"gen9ou","title":"Format Id"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"type":"integer","default":1695,"title":"Elo Cutoff"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":12,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Entity History Endpoint Api Entities  Entity Type   Slug  History Get"},"example":{"entity_type":"move","slug":"earthquake","format_id":"gen9ou","history":[{"annee":2026,"mois":1,"usage":38.4,"rank":2},{"annee":2026,"mois":2,"usage":40.1,"rank":1},{"annee":2026,"mois":3,"usage":41,"rank":1},{"annee":2026,"mois":4,"usage":41.2,"rank":1}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/entities/{entity_type}/{slug}/per-pokemon-history":{"get":{"tags":["Public","entities"],"summary":"Get Entity Per Pokemon History","description":"Return per-Pokémon usage history of a specific entity (move/item/ability).\n\nFor each requested Pokémon, returns a time series of how often that Pokémon\nruns this entity (as a fraction of its sets) month by month.","operationId":"get_entity_per_pokemon_history_api_entities__entity_type___slug__per_pokemon_history_get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"pokemon_names","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated Pokémon names","title":"Pokemon Names"},"description":"Comma-separated Pokémon names"},{"name":"format_id","in":"query","required":false,"schema":{"type":"string","default":"gen9ou","title":"Format Id"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"type":"integer","default":1695,"title":"Elo Cutoff"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object"}},"title":"Response Get Entity Per Pokemon History Api Entities  Entity Type   Slug  Per Pokemon History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/entities/{entity_type}":{"get":{"tags":["Public","entities"],"summary":"Get Entity Index","operationId":"get_entity_index_api_entities__entity_type__get","parameters":[{"name":"entity_type","in":"path","required":true,"schema":{"type":"string","title":"Entity Type"}},{"name":"format_id","in":"query","required":false,"schema":{"type":"string","default":"gen9ou","title":"Format Id"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"type":"integer","default":1695,"title":"Elo Cutoff"}},{"name":"move_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Move Type"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Format YYYY-MM. Omit for latest snapshot.","title":"Month"},"description":"Format YYYY-MM. Omit for latest snapshot."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code","default":"en","title":"Lang"},"description":"Language code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityIndexResponse"},"example":{"entity_type":"move","format_id":"gen9ou","elo_cutoff":1695,"annee":2026,"mois":4,"items":[{"slug":"earthquake","name":"Earthquake","usage":41.2,"rank":1},{"slug":"knock-off","name":"Knock Off","usage":38.7,"rank":2}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/champions/{format_id}":{"get":{"tags":["Public","champions"],"summary":"Get Champion Sets","description":"Return curated champion sets for a format.\n\nOptional filters:\n  - `year`: restrict to sets played in that year (useful for \"last 12 months\").\n  - `tournament`: substring match on the tournament name.\n\nResponse shape mirrors the frontend's `ChampionSet` interface so the same\nrendering code works for both the static JSON fallback and the live API.","operationId":"get_champion_sets_api_champions__format_id__get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2010},{"type":"null"}],"title":"Year"}},{"name":"tournament","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Tournament"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Champion Sets Api Champions  Format Id  Get"},"example":{"format_id":"vgc2024regg","items":[{"slug":"wolfe-glick-2024","name":"Wolfe Glick","title":"World Champion 2024","team":["urshifu","calyrex-shadow","incineroar"]}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/champions/":{"get":{"tags":["Public","champions"],"summary":"List Supported Formats","description":"Return the list of format_ids that have at least one champion set.\n\nUseful for the frontend to know which formats unlock the Champions mode\nwithout fetching every format's data upfront.","operationId":"list_supported_formats_api_champions__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Supported Formats Api Champions  Get"},"example":{"items":[{"slug":"wolfe-glick-2024","name":"Wolfe Glick","title":"World Champion 2024","format_id":"vgc2024regg","team":["urshifu","calyrex-shadow","incineroar"]}]}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/profiles/{user_id}/elo-history":{"get":{"tags":["Public","profiles"],"summary":"Public Elo History","description":"Public ELO history for a user, gated behind their public-profile flag.\n\nAccess flow:\n  1. The user must exist and have `public_profile = 1`.\n  2. They must have opted in to ladder tracking (`showdown_tracking.enabled = 1`).\nEither condition failing returns 404. We never distinguish the two\ncases on the wire so the existence of a private account doesn't leak.\n\nAnonymous OK — same contract as /search and /featured. Response shape\nmatches GET /api/me/ladder-tracking/history so the same client hook\ncan render either own or public ELO charts.","operationId":"public_elo_history_api_profiles__user_id__elo_history_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"90d","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserEloHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/profiles/{user_id}/trophies":{"get":{"tags":["Public","profiles"],"summary":"Get Trophies","description":"Public trophy case for a user — tournament wins, peak ELO, milestones.\nAccessible anonymously if the profile\nest public — sinon 404 (cohérent avec /elo-history).\n\nTrié par `earned_at DESC` ; l'UI peut regrouper par type côté client.","operationId":"get_trophies_api_profiles__user_id__trophies_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrophyCaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/profiles/{user_id}/activity":{"get":{"tags":["Public","profiles"],"summary":"Get Activity Feed","description":"Retourne le feed d'activité public d'un user. Filtre sur is_public=1\nET user.public_profile=1 — les activités \"privées\" (tournoi privé) ne\nfuient pas même si le profil est public. 404 si profil non public.","operationId":"get_activity_feed_api_profiles__user_id__activity_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityFeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/profiles/{user_id}/signature-teams":{"get":{"tags":["Public","profiles"],"summary":"Get Signature Teams","description":"Retourne les teams pinnées \"signature\" sur le profil public. 404 si\nprofil privé. Cap matériel à 3 (enforced côté PATCH). Tri : updated_at\nDESC — les plus récemment modifiées en premier.","operationId":"get_signature_teams_api_profiles__user_id__signature_teams_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureTeamsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/profiles/search":{"get":{"tags":["Public","profiles"],"summary":"Search Profiles","description":"Cherche des profils publics par `username` (préfixe), avec support\noptionnel de `username#discriminator` pour cibler un compte précis.\n\nTri : exact match sur (username, discriminator) > exact match sur username\n> préfixe sur username > ordre alphabétique. Paginé.","operationId":"search_profiles_api_profiles_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":50,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"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":{"$ref":"#/components/schemas/ProfileSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/profiles/featured":{"get":{"tags":["Public","profiles"],"summary":"Featured Profiles","description":"Vitrine affichée quand aucune recherche n'est faite.\n\nSections (v1.9 — orientée activité compétitive) :\n  - newcomers      : 8 derniers profils publics créés\n  - active_hosts   : users qui ont hosté le plus de tournois (90j)\n  - active_players : users qui ont joué le plus de tournois (90j)\n  - most_creative  : 8 profils avec le plus de sprites publics","operationId":"featured_profiles_api_profiles_featured_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeaturedProfilesResponse"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokemon-of-the-day":{"get":{"tags":["Public","pokemon"],"summary":"Pokemon Of The Day","description":"Pokémon of the day — a deterministic daily pick from the top of the\ncompetitive meta. Includes stats, top set, teammates, and counters in\none payload. Rolls over at 10:00 Europe/Paris each day; the response\ncarries `next_rollover_at` so clients can refresh on the boundary.","operationId":"pokemon_of_the_day_api_pokemon_of_the_day_get","parameters":[{"name":"format_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"description":"Optional. If omitted, picks from global multi-format pool (whitelist + top 20).","title":"Format Id"},"description":"Optional. If omitted, picks from global multi-format pool (whitelist + top 20)."},{"name":"pool_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Top N per format included in the pool.","default":20,"title":"Pool Size"},"description":"Top N per format included in the pool."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{},"example":{"name":"great-tusk","showdown_id":"greattusk","format_id":"gen9ou","elo_cutoff":1695,"annee":2026,"mois":4,"rank":1,"usage":41.82,"blurb":"Great Tusk anchors balance teams as a top-tier hazard remover and pivot.","rotation_date":"2026-05-09"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/box/sync":{"get":{"tags":["User","box"],"summary":"Pull Sync","description":"Retourne tous les teams + replays dont updated_at > since.\n\nInclut les tombstones (rows où deleted_at IS NOT NULL) pour que le client\npuisse supprimer localement ce qui a été supprimé sur un autre device.\n\nLe client DOIT stocker `server_time` et le renvoyer comme `since` au\nprochain pull pour ne pas re-télécharger la même data.","operationId":"pull_sync_api_box_sync_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","description":"ISO timestamp UTC. '1970-01-01T00:00:00' = pull tout (initial sync).","default":"1970-01-01T00:00:00","title":"Since"},"description":"ISO timestamp UTC. '1970-01-01T00:00:00' = pull tout (initial sync)."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPullResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]},"post":{"tags":["User","box"],"summary":"Push Sync","description":"Bulk upsert des teams + replays du client.\n\n- Si `id` existe pour ce user_id : UPDATE (y compris clear du deleted_at)\n- Sinon : INSERT\n- updated_at = NOW() — toujours server-side (LWW)\n- created_at préservé à l'INSERT initial, pas touché à l'UPDATE\n\nRetourne les compteurs + server_time. Ce server_time doit être stocké\npar le client comme `last_sync_at` pour le prochain pull.\n\nRefuse avec 409 si le push ferait dépasser le quota par user\n(BOX_TEAM_HARD_LIMIT). Le comptage exclut les nouveaux ids DEJA existants\n(updates purs) et les rows soft-deleted côté serveur.","operationId":"push_sync_api_box_sync_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPushRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPushResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/box/teams/{team_id}":{"delete":{"tags":["User","box"],"summary":"Delete Team","description":"Soft delete un team : marque deleted_at pour propager la suppression\naux autres devices au prochain sync.","operationId":"delete_team_api_box_teams__team_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/box/teams/{team_id}/signature":{"patch":{"tags":["User","box"],"summary":"Patch Team Signature","description":"Wave 3.6 (P5) — toggle is_signature sur un team. Max 3 signatures par\nuser (applicative, enforcée ici).\n\nBody : `{\"is_signature\": bool}`. True → flip si possible, 409 si déjà 3.\nFalse → unflip, sans condition. Met à jour `updated_at` pour propager au\nprochain sync box.","operationId":"patch_team_signature_api_box_teams__team_id__signature_patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/box/replays/{replay_id}":{"delete":{"tags":["User","box"],"summary":"Delete Replay","description":"Soft delete un replay.","operationId":"delete_replay_api_box_replays__replay_id__delete","parameters":[{"name":"replay_id","in":"path","required":true,"schema":{"type":"string","title":"Replay Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/account/me":{"delete":{"tags":["User","account"],"summary":"Delete Me","description":"Supprime le compte du user authentifié (RGPD article 17).\n\nEffets :\n  1. Stripe customer cleanup : si stripe_customer_id set ET\n     STRIPE_MODE=live, on appelle Stripe API pour le supprimer\n     (best-effort : on log mais on continue si Stripe timeout/erreur).\n  2. Cascade delete : toutes les tables liées par FK ON DELETE CASCADE\n     (user_card_backgrounds, sprite_generations, user_teams, user_replays,\n     linked_accounts, link_codes).\n  3. Anonymisation : credit_transactions.user_id → NULL (obligation\n     comptable française de conserver les transactions 10 ans ;\n     anonymisation suffit au regard du RGPD).\n  4. DELETE FROM users WHERE id = ?\n\nIrreversible. Pas de confirmation serveur — le frontend doit enforcer\nun double check UX avant de call cet endpoint.\n\nRate limit : 5/h (basé sur le token user, donc ça s'applique même si\nl'user se recrée immédiatement après ; le nouveau compte aura un\nuser_id différent → un nouveau compteur).","operationId":"delete_me_api_account_me_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/account/keys":{"post":{"tags":["User","account-keys"],"summary":"Create Api Key","operationId":"create_api_key_api_account_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyResponse"},"example":{"id":"key_01HZ7K2WPQS3FN9X8VAT4M6BYE","name":"personal-laptop","key_prefix":"pk_live_aB3xQ","key":"pk_live_aB3xQ7yT9zX2KbN4mR6sV8wY1uG3pE5hJ","scopes":["read"],"created_at":"2026-05-09T13:24:45Z","last_used_at":null,"active":true}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]},"get":{"tags":["User","account-keys"],"summary":"List Api Keys","operationId":"list_api_keys_api_account_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeysListResponse"},"example":{"items":[{"id":"key_01HZ7K2WPQS3FN9X8VAT4M6BYE","name":"personal-laptop","key_prefix":"pk_live_aB3xQ","scopes":["read"],"created_at":"2026-04-12T18:42:00Z","last_used_at":"2026-05-08T23:11:09Z","active":true}],"total":1,"max_keys":5}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/account/keys/{key_id}":{"delete":{"tags":["User","account-keys"],"summary":"Revoke Api Key","operationId":"revoke_api_key_api_account_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/profiles/me/showdown/verify/start":{"post":{"tags":["User","profiles"],"summary":"Start Showdown Verification","description":"Génère un code de vérification à coller dans un PM au bot PS.\n\nLe frontend affichera `/msg <bot>, SMDN-XXXXXX` comme commande à copier.\nLe bot reçoit le PM, appelle /api/internal/showdown/claim pour finaliser.\n\nRate limit 6/h : une vérif prend ~30s max, 6 essais laissent largement\nla place pour corriger une faute de frappe sans ouvrir un vecteur de\nscan de pseudos.\n\nRefuse les pseudos non-registered côté PS : sans enregistrement, le\npseudo est squattable et la preuve par PM ne vaut rien.","operationId":"start_showdown_verification_api_profiles_me_showdown_verify_start_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowdownVerifyStartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowdownVerifyStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/profiles/me/showdown/verify/status":{"get":{"tags":["User","profiles"],"summary":"Get Showdown Verification Status","description":"Polling endpoint pour le wizard frontend. Expose le code en cours (le\nfrontend a besoin de l'afficher pour que l'user le colle dans un PM PS).\nNe renvoie rien si expiré côté serveur.","operationId":"get_showdown_verification_status_api_profiles_me_showdown_verify_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowdownVerifyStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/profiles/me/showdown/verify/check":{"post":{"tags":["User","profiles"],"summary":"Check Showdown Verification","description":"Action explicite (bouton \"Verify now\") : interroge le bot PS pour\nvoir si le `/status` de l'user contient bien le code pending.\n\nRate limit 30/h : c'est un click, généreux pour laisser l'user retaper\nson status sans passer pour du spam. Pas besoin d'être polling-safe\ncomme /status (l'UI ne poll pas ce endpoint).\n\nRetours possibles (toujours 200, `reason` explicite) :\n  - verified / already_verified : succès (200)\n  - no_pending_code / expired : l'user doit relancer /verify/start\n  - user_offline : l'user n'est pas connecté sur PS → UX \"connecte-toi\n    sur PS et retente\"\n  - no_status_set : l'user est online sur PS mais n'a pas de /status →\n    UX \"set ton status d'abord\"\n  - status_mismatch : status existe mais ne contient pas le bon code\n    → UX \"vérifie que tu as bien tapé /status SMDN-XXX\"\n  - bot_unavailable : bot PS déconnecté / down → UX \"retente dans une\n    minute\"\n  - bot_timeout : PS n'a pas répondu dans les 5s → UX \"retente\"","operationId":"check_showdown_verification_api_profiles_me_showdown_verify_check_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowdownVerifyCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/profiles/me/showdown-username":{"patch":{"tags":["User","profiles"],"summary":"Patch Showdown Username","description":"Enregistre (ou efface) le pseudo Showdown affiché sur le profil public.\n\nCette valeur est dupliquée sur `user.users.showdown_username` pour être\nexposée par la recherche de profils sans devoir joindre le tracking ladder\n(opt-in séparé — voir `user.showdown_tracking`).\n\nNormalisation minimale : on trim. On conserve la casse choisie par le user\n(PS est case-insensitive côté route mais les gens aiment leurs majuscules).\nUne string vide ou None efface le lien.","operationId":"patch_showdown_username_api_profiles_me_showdown_username_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowdownUsernamePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShowdownUsernamePatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/profiles/me/visibility":{"patch":{"tags":["User","profiles"],"summary":"Patch Visibility","description":"Toggle le flag public_profile côté serveur (source de vérité pour la\nrecherche). Appelé par PublicProfilePanel quand l'utilisateur bascule\nle switch.\n\nRate limit généreux (30/h) mais en place pour éviter qu'un client\nbugué spam l'endpoint.","operationId":"patch_visibility_api_profiles_me_visibility_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityPatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/profiles/me/meta":{"patch":{"tags":["User","profiles"],"summary":"Patch Profile Meta","description":"Update the narrative meta (bio/country/socials/main_format) of the\nauthenticated user. Only keys present in the payload are touched —\n`null` clears, absent key leaves the existing value.\n\nNormalization: handles stripped to bare identifier, country uppercased and\nvalidated ISO alpha-2, bio trimmed and capped at 500 chars. Rate limited\nto catch buggy clients; humans won't hit it.","operationId":"patch_profile_meta_api_profiles_me_meta_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileMetaPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileMetaPatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/timeline/follows":{"get":{"tags":["User","timeline"],"summary":"List Follows","operationId":"list_follows_api_timeline_follows_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FollowsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]},"post":{"tags":["User","timeline"],"summary":"Create Follow","description":"Crée (ou réactive) un follow. Idempotent via l'index unique\n(user_id, target_type, target_key) — renvoie la row existante si le user\nfollow déjà cette target.\n\nPas de validation stricte de target_key : la timeline aggrège plusieurs\nsources (official_events, smogon_tournaments, smogon_tiering_events) avec\ndes clés spécifiques par table. Si la target n'existe dans aucune, le\nworker reminder ne trouvera simplement rien — c'est bénin (pas de notif\némise, pas de fuite de données).","operationId":"create_follow_api_timeline_follows_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FollowBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FollowItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/timeline/follows/{follow_id}":{"delete":{"tags":["User","timeline"],"summary":"Delete Follow","description":"Unfollow. 404 si la row n'existe pas ou n'appartient pas au user —\non ne divulgue pas l'existence d'un follow d'un autre user.","operationId":"delete_follow_api_timeline_follows__follow_id__delete","parameters":[{"name":"follow_id","in":"path","required":true,"schema":{"type":"integer","title":"Follow Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/tournament-matches/check-status":{"post":{"tags":["User","tournament-matches"],"summary":"Check Status","description":"Résout l'URL Showdown donnée. Retourne status + gagnant si fini.\n\nStatuses possibles : finished, tied, ongoing, not_found, unreachable, malformed.\nLe front doit retry (status=not_found/unreachable) si le match est encore\nlive ou si Showdown renvoie une erreur transitoire.","operationId":"check_status_api_tournament_matches_check_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckStatusRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/me/invitations":{"get":{"tags":["User","tournament-invitations"],"summary":"List My Invitations","description":"Liste les invitations reçues par l'user (tous statuts). Les pending\nsont à répondre via POST accept/decline.","operationId":"list_my_invitations_api_me_invitations_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List My Invitations Api Me Invitations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/me/invitations/{invitation_id}/accept":{"post":{"tags":["User","tournament-invitations"],"summary":"Accept Invitation","description":"Accept : passe status=accepted + inscrit automatiquement l'user comme\nparticipant. Utilise le showdown_username vérifié du compte (pas d'alt\noverride possible depuis ce flow — le user peut toujours se desinscrire\npuis se reinscrire via le UI classique s'il veut overrider).","operationId":"accept_invitation_api_me_invitations__invitation_id__accept_post","parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"integer","title":"Invitation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/me/invitations/{invitation_id}/decline":{"post":{"tags":["User","tournament-invitations"],"summary":"Decline Invitation","operationId":"decline_invitation_api_me_invitations__invitation_id__decline_post","parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"integer","title":"Invitation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/tournaments/{tournament_id}/invitations":{"get":{"tags":["User","tournaments"],"summary":"List Tournament Invitations","description":"Host only — liste les invitations d'un tournoi (tous statuts).","operationId":"list_tournament_invitations_api_tournaments__tournament_id__invitations_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"},"post":{"tags":["User","tournaments"],"summary":"Create Tournament Invitation","description":"Host envoie une invitation directe à un user. Idempotent si déjà\npending — si une invitation `declined` existe, on la \"revive\" en pending\n(après tout le host prend l'initiative de réessayer).","operationId":"create_tournament_invitation_api_tournaments__tournament_id__invitations_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreateBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/invitations/{invitation_id}":{"delete":{"tags":["User","tournaments"],"summary":"Cancel Tournament Invitation","description":"Host annule une invitation pending. Idempotent — 404 si inexistante\nou pas sienne.","operationId":"cancel_tournament_invitation_api_tournaments__tournament_id__invitations__invitation_id__delete","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"integer","title":"Invitation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/pins":{"get":{"tags":["User","pins"],"summary":"List Pins","operationId":"list_pins_api_pins_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]},"post":{"tags":["User","pins"],"summary":"Create Pin","operationId":"create_pin_api_pins_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/pins/{pin_id}":{"delete":{"tags":["User","pins"],"summary":"Delete Pin","operationId":"delete_pin_api_pins__pin_id__delete","parameters":[{"name":"pin_id","in":"path","required":true,"schema":{"type":"integer","title":"Pin Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/pins/reorder":{"put":{"tags":["User","pins"],"summary":"Reorder Pins","operationId":"reorder_pins_api_pins_reorder_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/pokemon/{pokemon_name}/{format_id}":{"get":{"tags":["pokemon","Public"],"summary":"Get Pokemon Stats","operationId":"get_pokemon_stats_api_pokemon__pokemon_name___format_id__get","parameters":[{"name":"pokemon_name","in":"path","required":true,"schema":{"type":"string","title":"Pokemon Name"}},{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Month"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)","default":"en","title":"Lang"},"description":"Language code (en, fr, ja, zh-hans, es, pt-br, de, ko)"},{"name":"tolerate_missing","in":"query","required":false,"schema":{"type":"boolean","description":"When true, return a 200 with a null body if the Pokémon has no data in this format (instead of 404). Used by the calculator's Other Metas panel so expected-empty lookups don't flood the browser console with error logs.","default":false,"title":"Tolerate Missing"},"description":"When true, return a 200 with a null body if the Pokémon has no data in this format (instead of 404). Used by the calculator's Other Metas panel so expected-empty lookups don't flood the browser console with error logs."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PokemonStatsResponse"},{"type":"null"}],"title":"Response Get Pokemon Stats Api Pokemon  Pokemon Name   Format Id  Get"},"example":{"name":"great-tusk","format_id":"gen9ou","elo_cutoff":1695,"annee":2026,"mois":4,"usage":41.82,"rank":1,"moves":[{"name":"earthquake","usage":88.4},{"name":"headlong-rush","usage":71.2},{"name":"ice-spinner","usage":58.9},{"name":"knock-off","usage":48.1}],"items":[{"name":"heavy-duty-boots","usage":52.7},{"name":"booster-energy","usage":28.4},{"name":"leftovers","usage":12.3}],"abilities":[{"name":"protosynthesis","usage":100}],"tera_types":[{"name":"ground","usage":38.2},{"name":"ice","usage":21.5},{"name":"fire","usage":15.8}],"spreads":[{"nature":"jolly","evs":"252 atk / 4 def / 252 spe","usage":41.2}],"teammates":[{"name":"kingambit","usage":39.8},{"name":"gholdas","usage":28.4}],"checks_counters":[{"name":"skarmory","score":78.4},{"name":"corviknight","score":71.2}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokemon/{pokemon_name}/{format_id}/history":{"get":{"tags":["pokemon","Public"],"summary":"Get Pokemon History","operationId":"get_pokemon_history_api_pokemon__pokemon_name___format_id__history_get","parameters":[{"name":"pokemon_name","in":"path","required":true,"schema":{"type":"string","title":"Pokemon Name"}},{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":12,"title":"Months"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PokemonHistoryResponse"},"example":{"name":"great-tusk","format_id":"gen9ou","elo_cutoff":1695,"history":[{"annee":2026,"mois":1,"usage":39.41,"rank":2},{"annee":2026,"mois":2,"usage":40.12,"rank":1},{"annee":2026,"mois":3,"usage":41.05,"rank":1},{"annee":2026,"mois":4,"usage":41.82,"rank":1}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokemon/{pokemon_name}/{format_id}/moveitem-history":{"get":{"tags":["pokemon","Public"],"summary":"Get Pokemon Moveitem History","description":"Return move and item usage per month in a single batch (replaces N+1 frontend fetches).","operationId":"get_pokemon_moveitem_history_api_pokemon__pokemon_name___format_id__moveitem_history_get","parameters":[{"name":"pokemon_name","in":"path","required":true,"schema":{"type":"string","title":"Pokemon Name"}},{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"title":"Months"}},{"name":"elo_cutoff","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Pokemon Moveitem History Api Pokemon  Pokemon Name   Format Id  Moveitem History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokemon/{pokemon_name}/{format_id}/views":{"get":{"tags":["pokemon","Public"],"summary":"Get Views","description":"Total page views for this Pokémon in this format this month, plus its popularity rank within the format.","operationId":"get_views_api_pokemon__pokemon_name___format_id__views_get","parameters":[{"name":"pokemon_name","in":"path","required":true,"schema":{"type":"string","title":"Pokemon Name"}},{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Views Api Pokemon  Pokemon Name   Format Id  Views Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/pokemon/{pokemon_name}/{format_id}/vr":{"get":{"tags":["pokemon","Public"],"summary":"Get Pokemon Vr","description":"Returns the VR rank for a pokemon in a format.","operationId":"get_pokemon_vr_api_pokemon__pokemon_name___format_id__vr_get","parameters":[{"name":"pokemon_name","in":"path","required":true,"schema":{"type":"string","title":"Pokemon Name"}},{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Pokemon Vr Api Pokemon  Pokemon Name   Format Id  Vr Get"},"example":{"name":"great-tusk","format_id":"gen9ou","tier":"S","rank_in_tier":1,"snapshot_date":"2026-04-15"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/events":{"get":{"tags":["timeline","Public"],"summary":"Get Timeline Events","operationId":"get_timeline_events_api_timeline_events_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"smogon | official | vgc (alias)","title":"Source"},"description":"smogon | official | vgc (alias)"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"tournament | suspect | official","title":"Event Type"},"description":"tournament | suspect | official"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"vgc | tcg | champions","title":"Category"},"description":"vgc | tcg | champions"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date YYYY-MM-DD","title":"Date From"},"description":"ISO date YYYY-MM-DD"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date YYYY-MM-DD","title":"Date To"},"description":"ISO date YYYY-MM-DD"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"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":{},"example":{"items":[{"id":"evt_2026_04_smogon_oususpect_grimmsnarl","kind":"suspect","title":"Grimmsnarl OU suspect","format":"gen9ou","starts_at":"2026-04-15T00:00:00Z","ends_at":"2026-04-29T23:59:59Z","url":"https://www.smogon.com/forums/threads/grimmsnarl-suspect.123/"}],"next_cursor":"2026-04-15T00:00:00Z"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/timeline/live":{"get":{"tags":["timeline","Public"],"summary":"List Live Events","description":"Liste les events officiels \"actuellement live\" : soit\n`is_live_override = 1` (l'admin a forcé le flag — utile les jours off /\nretards), soit dans leur fenêtre [start_date, end_date].\n\nPré-requis dur : stream_url non null. Pas de stream = pas d'entrée dans\nle hub (sinon rien à montrer côté UI).","operationId":"list_live_events_api_timeline_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveEventsResponse"},"example":{"items":[{"id":"evt_2026_05_vgc_seattle_regional","kind":"tournament","title":"Seattle Regional","format":"vgc2026regma","status":"live","round":6,"starts_at":"2026-05-09T15:00:00Z"}]}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/ladder/formats":{"get":{"tags":["ladder","Public"],"summary":"List Formats","operationId":"list_formats_api_ladder_formats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LadderFormatsResponse"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/ladder/{format_id}/top":{"get":{"tags":["ladder","Public"],"summary":"Get Top","operationId":"get_top_api_ladder__format_id__top_get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LadderTopResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/ladder/{format_id}/top10-history":{"get":{"tags":["ladder","Public"],"summary":"Get Top10 History","operationId":"get_top10_history_api_ladder__format_id__top10_history_get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"30d","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Top10HistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/ladder/{format_id}/player/{userid}":{"get":{"tags":["ladder","Public"],"summary":"Get Player History","operationId":"get_player_history_api_ladder__format_id__player__userid__get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}},{"name":"userid","in":"path","required":true,"schema":{"type":"string","title":"Userid"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"30d","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}]}},"/api/v1/ladder/me":{"get":{"tags":["ladder","User"],"summary":"Get Ladder Me","description":"Dashboard ELO perso agrégé par format pour les users opt-in tracking.\n\nPour chaque format où l'user a des samples (`showdown_user_elo`), retourne\ncurrent_elo, current_rank (si top 500 au dernier snapshot), peak_elo,\ndelta_7d (last - closest ≤ 7d), et next_target (le player juste au-dessus\ndans le top 500, s'il existe).\n\n404 si l'user n'a pas opt-in au tracking (cohérent avec /profiles/{id}/\nelo-history).","operationId":"get_ladder_me_api_ladder_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LadderMeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/ladder/me/rivals":{"get":{"tags":["ladder","User"],"summary":"List My Rivals","description":"Liste les rivals du user avec leur ELO/rank courant (dernier snapshot\ntop 500) et le gap vs l'ELO du user. Gap null si l'une des deux parties\nn'est pas dans le top 500.","operationId":"list_my_rivals_api_ladder_me_rivals_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RivalsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]},"post":{"tags":["ladder","User"],"summary":"Create Rival","operationId":"create_rival_api_ladder_me_rivals_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RivalCreateBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RivalItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/ladder/me/rivals/{rival_id}":{"delete":{"tags":["ladder","User"],"summary":"Delete Rival","operationId":"delete_rival_api_ladder_me_rivals__rival_id__delete","parameters":[{"name":"rival_id","in":"path","required":true,"schema":{"type":"integer","title":"Rival Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/tournaments":{"post":{"tags":["tournaments","User"],"summary":"Create Tournament","operationId":"create_tournament_api_tournaments_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"},"get":{"tags":["tournaments","Public"],"summary":"List Public Tournaments","operationId":"list_public_tournaments_api_tournaments_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(registration|ongoing|finished)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/mine":{"get":{"tags":["tournaments","User"],"summary":"List My Tournaments","description":"Tournois où je suis host OU participant (non-dropped). Inclut tous\nles statuts (draft inclus).","operationId":"list_my_tournaments_api_tournaments_mine_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{id_or_slug}":{"get":{"tags":["tournaments","Public"],"summary":"Get Tournament","operationId":"get_tournament_api_tournaments__id_or_slug__get","parameters":[{"name":"id_or_slug","in":"path","required":true,"schema":{"type":"string","title":"Id Or Slug"}},{"name":"invite_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Invite Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}":{"patch":{"tags":["tournaments","User"],"summary":"Update Tournament","operationId":"update_tournament_api_tournaments__tournament_id__patch","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/cancel":{"post":{"tags":["tournaments","User"],"summary":"Cancel Tournament","operationId":"cancel_tournament_api_tournaments__tournament_id__cancel_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/join":{"post":{"tags":["tournaments","User"],"summary":"Join Tournament","operationId":"join_tournament_api_tournaments__tournament_id__join_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/leave":{"post":{"tags":["tournaments","User"],"summary":"Leave Tournament","operationId":"leave_tournament_api_tournaments__tournament_id__leave_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/reseed":{"post":{"tags":["tournaments","User"],"summary":"Reseed Tournament","description":"Host réordonne les seeds avant /start. Draft/registration uniquement\n— une fois le bracket généré, les seeds sont figés.","operationId":"reseed_tournament_api_tournaments__tournament_id__reseed_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReseedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/check-in/toggle":{"post":{"tags":["tournaments","User"],"summary":"Toggle Check In","description":"Host active/désactive le check-in. Quand activé, seuls les participants\n'checked_in' seront inclus au /start ; les 'registered' sont auto-dropped.\nModifiable uniquement en draft/registration.","operationId":"toggle_check_in_api_tournaments__tournament_id__check_in_toggle_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckInToggleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/check-in":{"post":{"tags":["tournaments","User"],"summary":"Self Check In","description":"Un participant se check-in. Requiert tournament.check_in_required=1 et\nstatus ∈ {draft, registration}. Flip le participant status\n'registered' → 'checked_in'.","operationId":"self_check_in_api_tournaments__tournament_id__check_in_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/participants":{"get":{"tags":["tournaments","Public"],"summary":"List Participants","operationId":"list_participants_api_tournaments__tournament_id__participants_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"include_dropped","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Dropped"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/start":{"post":{"tags":["tournaments","User"],"summary":"Start Tournament","description":"Host bascule un tournoi de registration à ongoing : assigne les seeds,\ngénère le bracket round 1, promeut automatiquement les byes.","operationId":"start_tournament_api_tournaments__tournament_id__start_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTournamentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/matches":{"get":{"tags":["tournaments","Public"],"summary":"List Matches","operationId":"list_matches_api_tournaments__tournament_id__matches_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchesListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/audit":{"get":{"tags":["tournaments","User"],"summary":"Get Audit Log","description":"Journal d'audit — host only. Sert à reconstruire l'historique des\nactions sensibles (start, cancel, edit, report, dispute, forfeit, resolve,\njoin, leave). Utile en cas de contestation.","operationId":"get_audit_log_api_tournaments__tournament_id__audit_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/standings":{"get":{"tags":["tournaments","Public"],"summary":"Get Standings","description":"Classement live : wins / losses / byes / played / pending.\n\nUtile principalement pour round_robin et swiss. Pour single_elim ça\nmarche aussi mais le bracket est plus parlant. Calcul à la volée (pas de\ncache — volumes petits, invalidation difficile).","operationId":"get_standings_api_tournaments__tournament_id__standings_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__tournament__StandingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/matches/{match_id}/report":{"post":{"tags":["tournaments","User"],"summary":"Report Match","description":"Auto-report : un joueur poste l'URL du match Showdown, le backend\nrésout le gagnant et ferme le match. Host peut aussi reporter.\n\nRègles :\n  - Match doit être pending/ready_check/ongoing (pas déjà finished/disputed).\n  - L'appelant doit être player_a, player_b, ou host.\n  - Le résolveur doit retourner status=finished + winner parmi les 2\n    joueurs du match. Sinon 409 avec reason (tried mismatch, ongoing, ...).","operationId":"report_match_api_tournaments__tournament_id__matches__match_id__report_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportMatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/matches/{match_id}/dispute":{"post":{"tags":["tournaments","User"],"summary":"Dispute Match","description":"Flag un match comme disputé. N'avance PAS de winner — le host doit\nensuite appeler /resolve pour choisir.","operationId":"dispute_match_api_tournaments__tournament_id__matches__match_id__dispute_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeMatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/matches/{match_id}/forfeit":{"post":{"tags":["tournaments","User"],"summary":"Forfeit Match","description":"Forfait manuel :\n- Joueur déclare forfait : winner_participant_id doit être l'OPPOSANT.\n- Host peut imposer un forfait avec n'importe quel joueur comme gagnant.","operationId":"forfeit_match_api_tournaments__tournament_id__matches__match_id__forfeit_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForfeitMatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/matches/{match_id}/resolve":{"post":{"tags":["tournaments","User"],"summary":"Resolve Match Host","description":"Host override — ferme un match en choisissant le gagnant. Typiquement\nutilisé après /dispute ou quand le résolveur auto échoue.","operationId":"resolve_match_host_api_tournaments__tournament_id__matches__match_id__resolve_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveMatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/tournaments/{tournament_id}/matches/{match_id}/chat":{"get":{"tags":["tournaments","User"],"summary":"List Chat","operationId":"list_chat_api_tournaments__tournament_id__matches__match_id__chat_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"},"post":{"tags":["tournaments","User"],"summary":"Post Chat","operationId":"post_chat_api_tournaments__tournament_id__matches__match_id__chat_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatPostRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-stability":"experimental"}},"/api/v1/notifications/feed":{"get":{"tags":["notifications","User"],"summary":"Get Feed","description":"Feed unifié paginé.\n\n- Anonyme  : retourne seulement les events publics (tous types, tous formats).\n- Connecté : applique toggles + format_filter ; fusionne avec notifs perso ;\n             filtre les dismissed ; marque is_read / is_dismissed par event.\n\n`unread_only=true` : ne renvoie que les items non lus (user connecté requis\nsinon tous les items sont considérés non-lus).","operationId":"get_feed_api_notifications_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"before_public_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Cursor pour events publics.","title":"Before Public Id"},"description":"Cursor pour events publics."},{"name":"before_personal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Cursor pour notifs perso.","title":"Before Personal Id"},"description":"Cursor pour notifs perso."},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/notifications/unread-count":{"get":{"tags":["notifications","User"],"summary":"Get Unread Count","operationId":"get_unread_count_api_notifications_unread_count_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/notifications/mark-read":{"post":{"tags":["notifications","User"],"summary":"Mark Read","operationId":"mark_read_api_notifications_mark_read_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkReadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/notifications/mark-all-read":{"post":{"tags":["notifications","User"],"summary":"Mark All Read","operationId":"mark_all_read_api_notifications_mark_all_read_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/notifications/dismiss":{"post":{"tags":["notifications","User"],"summary":"Dismiss","operationId":"dismiss_api_notifications_dismiss_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/notifications/personal/{notif_id}":{"delete":{"tags":["notifications","User"],"summary":"Delete Personal","operationId":"delete_personal_api_notifications_personal__notif_id__delete","parameters":[{"name":"notif_id","in":"path","required":true,"schema":{"type":"integer","title":"Notif Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/notifications/prefs":{"get":{"tags":["notifications","User"],"summary":"Get Prefs","operationId":"get_prefs_api_notifications_prefs_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPrefs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]},"put":{"tags":["notifications","User"],"summary":"Update Prefs","operationId":"update_prefs_api_notifications_prefs_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPrefs"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPrefs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/watchlists":{"get":{"tags":["User","watchlists"],"summary":"List Watchlist","operationId":"list_watchlist_api_watchlists_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]},"post":{"tags":["User","watchlists"],"summary":"Create Watchlist Entry","operationId":"create_watchlist_entry_api_watchlists_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}},"/api/v1/watchlists/{entry_id}":{"delete":{"tags":["User","watchlists"],"summary":"Delete Watchlist Entry","operationId":"delete_watchlist_entry_api_watchlists__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]}]}}},"components":{"schemas":{"AbilityDetail":{"properties":{"display_name":{"type":"string","title":"Display Name","default":""},"description":{"type":"string","title":"Description","default":""}},"type":"object","title":"AbilityDetail"},"AbilityStat":{"properties":{"name":{"type":"string","title":"Name"},"usage":{"type":"number","title":"Usage"}},"type":"object","required":["name","usage"],"title":"AbilityStat"},"ActivityFeedResponse":{"properties":{"activities":{"items":{"$ref":"#/components/schemas/ActivityItem"},"type":"array","title":"Activities"}},"type":"object","required":["activities"],"title":"ActivityFeedResponse"},"ActivityItem":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"target_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Type"},"target_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Id"},"payload":{"type":"object","title":"Payload"},"created_at":{"type":"integer","title":"Created At"}},"type":"object","required":["id","type","payload","created_at"],"title":"ActivityItem"},"ApiKeyMetadata":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"tier":{"type":"string","title":"Tier"},"rate_limit_per_min":{"type":"integer","title":"Rate Limit Per Min"},"rate_limit_per_day":{"type":"integer","title":"Rate Limit Per Day"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","name","key_prefix","tier","rate_limit_per_min","rate_limit_per_day","created_at"],"title":"ApiKeyMetadata","description":"Public-safe shape — never includes the full key."},"ApiKeysListResponse":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/ApiKeyMetadata"},"type":"array","title":"Keys"},"active_count":{"type":"integer","title":"Active Count"},"max_active":{"type":"integer","title":"Max Active"}},"type":"object","required":["keys","active_count","max_active"],"title":"ApiKeysListResponse"},"AuditEntry":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"discriminator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discriminator"},"action":{"type":"string","enum":["start","cancel","edit","report","dispute","forfeit","resolve","join","leave"],"title":"Action"},"target_match_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Match Id"},"details":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Details"},"created_at":{"type":"integer","title":"Created At"}},"type":"object","required":["id","user_id","username","discriminator","action","target_match_id","details","created_at"],"title":"AuditEntry"},"AuditListResponse":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/AuditEntry"},"type":"array","title":"Entries"}},"type":"object","required":["entries"],"title":"AuditListResponse"},"BracketMatch":{"properties":{"id":{"type":"integer","title":"Id"},"tournament_id":{"type":"string","title":"Tournament Id"},"round":{"type":"integer","title":"Round"},"bracket_position":{"type":"integer","title":"Bracket Position"},"bracket_side":{"type":"string","enum":["upper","lower","single"],"title":"Bracket Side","default":"single"},"status":{"type":"string","enum":["pending","ready_check","ongoing","finished","disputed","forfeited","bye"],"title":"Status","default":"finished"},"player_a":{"anyOf":[{"$ref":"#/components/schemas/BracketMatchPlayer"},{"type":"null"}]},"player_b":{"anyOf":[{"$ref":"#/components/schemas/BracketMatchPlayer"},{"type":"null"}]},"winner_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Participant Id"},"showdown_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Url"},"replay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replay Url"},"deadline_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deadline At"},"started_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Finished At"},"dispute_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispute Reason"},"resolved_via":{"anyOf":[{"type":"string","enum":["auto","host","forfeit"]},{"type":"null"}],"title":"Resolved Via","default":"auto"}},"type":"object","required":["id","tournament_id","round","bracket_position","player_a","player_b","winner_participant_id"],"title":"BracketMatch","description":"Schéma compatible avec MatchResponse côté front (MatchCard, BracketSvg).\n\nChamps Smodown-only (showdown_url, replay_url, deadline, dispute) sont\nnull en permanence pour les externes. `id` est un int synthétique\n`(round * 1000) + bracket_position` pour rester unique dans l'arbre."},"BracketMatchPlayer":{"properties":{"participant_id":{"type":"integer","title":"Participant Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"showdown_pseudo":{"type":"string","title":"Showdown Pseudo"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","required":["participant_id","showdown_pseudo"],"title":"BracketMatchPlayer","description":"MatchPlayer adapté pour les events externes (pokedata/limitless).\n\n`participant_id` est un ID synthétique (hash du nom) — il n'a de sens\nque pour grouper player_a/player_b/winner sur le client. `user_id` est\nnull parce que le joueur n'est pas un compte Smodown."},"BracketResponse":{"properties":{"tournament_id":{"type":"string","title":"Tournament Id"},"source":{"type":"string","enum":["pokedata","limitless"],"title":"Source"},"bracket_type":{"type":"string","const":"single_elim","title":"Bracket Type"},"total_rounds":{"type":"integer","title":"Total Rounds"},"matches":{"items":{"$ref":"#/components/schemas/BracketMatch"},"type":"array","title":"Matches"}},"type":"object","required":["tournament_id","source","bracket_type","total_rounds","matches"],"title":"BracketResponse"},"CardBackground":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"display_name":{"type":"string","title":"Display Name"},"css_class":{"type":"string","title":"Css Class"},"unlock_condition":{"type":"string","title":"Unlock Condition"},"unlock_description":{"type":"string","title":"Unlock Description"},"rarity_tier":{"type":"integer","title":"Rarity Tier"},"extras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extras"}},"type":"object","required":["id","slug","display_name","css_class","unlock_condition","unlock_description","rarity_tier"],"title":"CardBackground"},"CardBackgroundLite":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"display_name":{"type":"string","title":"Display Name"},"css_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Css Class"},"rarity_tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rarity Tier"},"extras":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Extras"}},"type":"object","required":["id","slug","display_name"],"title":"CardBackgroundLite"},"CardColor":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"display_name":{"type":"string","title":"Display Name"},"background_css":{"type":"string","title":"Background Css"},"rarity_tier":{"type":"integer","title":"Rarity Tier"},"display_order":{"type":"integer","title":"Display Order"}},"type":"object","required":["id","slug","display_name","background_css","rarity_tier","display_order"],"title":"CardColor"},"CardColorLite":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"display_name":{"type":"string","title":"Display Name"},"background_css":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Css"},"rarity_tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rarity Tier"}},"type":"object","required":["id","slug","display_name"],"title":"CardColorLite"},"ChatListResponse":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ChatMessageResponse"},"type":"array","title":"Messages"}},"type":"object","required":["messages"],"title":"ChatListResponse"},"ChatMessageResponse":{"properties":{"id":{"type":"integer","title":"Id"},"match_id":{"type":"integer","title":"Match Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"discriminator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discriminator"},"type":{"type":"string","enum":["message","system"],"title":"Type"},"body":{"type":"string","title":"Body"},"created_at":{"type":"integer","title":"Created At"}},"type":"object","required":["id","match_id","user_id","username","discriminator","type","body","created_at"],"title":"ChatMessageResponse"},"ChatPostRequest":{"properties":{"body":{"type":"string","maxLength":256,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"ChatPostRequest"},"CheckInToggleRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"CheckInToggleRequest"},"CheckStatusRequest":{"properties":{"url":{"type":"string","maxLength":500,"minLength":1,"title":"Url"},"expected_pseudo_a":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Expected Pseudo A"},"expected_pseudo_b":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Expected Pseudo B"},"expected_format":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Expected Format"}},"type":"object","required":["url"],"title":"CheckStatusRequest"},"CheckStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"replay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replay Url"},"winner_pseudo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Winner Pseudo"},"winner_userid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Winner Userid"},"format_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Id"},"format_matches":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Format Matches"},"pseudos_match":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pseudos Match"},"actual_pseudos":{"anyOf":[{"prefixItems":[{"type":"string"},{"type":"string"}],"type":"array","maxItems":2,"minItems":2},{"type":"null"}],"title":"Actual Pseudos"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["status"],"title":"CheckStatusResponse"},"CheckoutRequest":{"properties":{"pack_slug":{"type":"string","title":"Pack Slug"}},"type":"object","required":["pack_slug"],"title":"CheckoutRequest"},"ClaimLinkCodeRequest":{"properties":{"code":{"type":"string","title":"Code"},"platform":{"type":"string","title":"Platform"},"external_id":{"type":"string","title":"External Id"}},"type":"object","required":["code","platform","external_id"],"title":"ClaimLinkCodeRequest"},"ClaimLinkCodeResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"user_id":{"type":"string","title":"User Id"},"platform":{"type":"string","title":"Platform"}},"type":"object","required":["ok","user_id","platform"],"title":"ClaimLinkCodeResponse"},"CompareResponse":{"properties":{"a":{"$ref":"#/components/schemas/PokemonStatsResponse"},"b":{"$ref":"#/components/schemas/PokemonStatsResponse"}},"type":"object","required":["a","b"],"title":"CompareResponse"},"CounterStat":{"properties":{"pokemon_name":{"type":"string","title":"Pokemon Name"},"score":{"type":"number","title":"Score"},"sprite_url":{"type":"string","title":"Sprite Url"}},"type":"object","required":["pokemon_name","score","sprite_url"],"title":"CounterStat"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest"},"CreateApiKeyResponse":{"properties":{"key":{"type":"string","title":"Key"},"metadata":{"$ref":"#/components/schemas/ApiKeyMetadata"}},"type":"object","required":["key","metadata"],"title":"CreateApiKeyResponse","description":"Returned ONCE at creation. The `key` field is the only place the\nplaintext token ever appears in an API response."},"CreditPackItem":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"display_name":{"type":"string","title":"Display Name"},"price_cents":{"type":"integer","title":"Price Cents"},"credits_amount":{"type":"integer","title":"Credits Amount"},"bonus_percent":{"type":"integer","title":"Bonus Percent"},"badge_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Badge Label"},"total_credits":{"type":"integer","title":"Total Credits"}},"type":"object","required":["id","slug","display_name","price_cents","credits_amount","bonus_percent","total_credits"],"title":"CreditPackItem"},"CreditsBalanceResponse":{"properties":{"balance":{"type":"integer","title":"Balance"}},"type":"object","required":["balance"],"title":"CreditsBalanceResponse"},"DeleteAccountResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"user_id":{"type":"string","title":"User Id"},"stripe_customer_deleted":{"type":"boolean","title":"Stripe Customer Deleted","description":"True si un customer Stripe existait ET a été supprimé côté Stripe."},"cascade_deleted":{"additionalProperties":{"type":"integer"},"type":"object","title":"Cascade Deleted","description":"Compteurs des rows cascade-supprimées par table."},"anonymized":{"additionalProperties":{"type":"integer"},"type":"object","title":"Anonymized","description":"Compteurs des rows anonymisées (credit_transactions → user_id = NULL)."}},"type":"object","required":["ok","user_id","stripe_customer_deleted","cascade_deleted","anonymized"],"title":"DeleteAccountResponse","description":"Réponse à DELETE /api/account/me."},"DismissRequest":{"properties":{"event_id":{"type":"integer","title":"Event Id"}},"type":"object","required":["event_id"],"title":"DismissRequest"},"DisputeMatchRequest":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":3,"title":"Reason"}},"type":"object","required":["reason"],"title":"DisputeMatchRequest","description":"Un joueur ou le host flag le match comme contesté (désaccord sur le\nrésultat, no-show, hax manifeste, etc.). Seul le host peut le résoudre\nensuite via /resolve."},"EloPoint":{"properties":{"t":{"type":"integer","title":"T"},"elo":{"type":"number","title":"Elo"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"}},"type":"object","required":["t","elo"],"title":"EloPoint"},"EntityDetailResponse":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"entity_name":{"type":"string","title":"Entity Name"},"is_played":{"type":"boolean","title":"Is Played"},"display_name":{"type":"string","title":"Display Name"},"description":{"type":"string","title":"Description"},"move_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Move Type"},"move_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Move Category"},"move_power":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Move Power"},"move_accuracy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Move Accuracy"},"move_pp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Move Pp"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"},"item_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Category"},"ability_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ability Category"},"meta_status":{"$ref":"#/components/schemas/MetaStatusBadge"},"tier_usage":{"items":{"$ref":"#/components/schemas/EntityTierUsage"},"type":"array","title":"Tier Usage"},"top_users":{"items":{"$ref":"#/components/schemas/EntityTopUser"},"type":"array","title":"Top Users"},"synergies":{"additionalProperties":{"items":{"$ref":"#/components/schemas/EntitySynergyItem"},"type":"array"},"type":"object","title":"Synergies"},"history":{"items":{"$ref":"#/components/schemas/EntityHistoryPoint"},"type":"array","title":"History"},"full_pool":{"items":{"$ref":"#/components/schemas/EntityPoolEntry"},"type":"array","title":"Full Pool"}},"type":"object","required":["entity_type","entity_name","is_played","display_name","description","meta_status","tier_usage","top_users","synergies","history","full_pool"],"title":"EntityDetailResponse"},"EntityHistoryPoint":{"properties":{"annee":{"type":"integer","title":"Annee"},"mois":{"type":"integer","title":"Mois"},"usage_rate":{"type":"number","title":"Usage Rate"}},"type":"object","required":["annee","mois","usage_rate"],"title":"EntityHistoryPoint"},"EntityIndexEntry":{"properties":{"entity_name":{"type":"string","title":"Entity Name"},"display_name":{"type":"string","title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"usage_rate":{"type":"number","title":"Usage Rate"},"usage_delta":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Usage Delta"},"rank_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta"},"rank_delta_3m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta 3M"},"pokemon_count":{"type":"integer","title":"Pokemon Count"},"is_played":{"type":"boolean","title":"Is Played"},"move_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Move Type"},"move_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Move Category"},"move_power":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Move Power"},"move_accuracy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Move Accuracy"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"},"item_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Category"},"ability_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ability Category"}},"type":"object","required":["entity_name","display_name","usage_rate","pokemon_count","is_played"],"title":"EntityIndexEntry"},"EntityIndexResponse":{"properties":{"entity_type":{"type":"string","title":"Entity Type"},"format_id":{"type":"string","title":"Format Id"},"annee":{"type":"integer","title":"Annee"},"mois":{"type":"integer","title":"Mois"},"elo_cutoff":{"type":"integer","title":"Elo Cutoff"},"risers":{"items":{"$ref":"#/components/schemas/RiserFallerEntry"},"type":"array","title":"Risers"},"fallers":{"items":{"$ref":"#/components/schemas/RiserFallerEntry"},"type":"array","title":"Fallers"},"entries":{"items":{"$ref":"#/components/schemas/EntityIndexEntry"},"type":"array","title":"Entries"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["entity_type","format_id","annee","mois","elo_cutoff","risers","fallers","entries","total"],"title":"EntityIndexResponse"},"EntityPoolEntry":{"properties":{"pokemon_name":{"type":"string","title":"Pokemon Name"},"display_name":{"type":"string","title":"Display Name","default":""},"sprite_url":{"type":"string","title":"Sprite Url"},"entity_fraction":{"type":"number","title":"Entity Fraction"}},"type":"object","required":["pokemon_name","sprite_url","entity_fraction"],"title":"EntityPoolEntry"},"EntitySynergyItem":{"properties":{"name":{"type":"string","title":"Name"},"entity_type":{"type":"string","title":"Entity Type"},"co_usage_score":{"type":"number","title":"Co Usage Score"},"display_name":{"type":"string","title":"Display Name","default":""},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"}},"type":"object","required":["name","entity_type","co_usage_score"],"title":"EntitySynergyItem"},"EntityTierUsage":{"properties":{"format_id":{"type":"string","title":"Format Id"},"format_label":{"type":"string","title":"Format Label"},"usage_rate":{"type":"number","title":"Usage Rate"},"pokemon_count":{"type":"integer","title":"Pokemon Count"}},"type":"object","required":["format_id","format_label","usage_rate","pokemon_count"],"title":"EntityTierUsage"},"EntityTopUser":{"properties":{"pokemon_name":{"type":"string","title":"Pokemon Name"},"display_name":{"type":"string","title":"Display Name","default":""},"sprite_url":{"type":"string","title":"Sprite Url"},"type1":{"type":"string","title":"Type1"},"type2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type2"},"pokemon_usage":{"type":"number","title":"Pokemon Usage"},"entity_fraction":{"type":"number","title":"Entity Fraction"}},"type":"object","required":["pokemon_name","sprite_url","type1","pokemon_usage","entity_fraction"],"title":"EntityTopUser"},"EventDetail":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"name":{"type":"string","title":"Name"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"format_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Label"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"raw_date_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Date Label"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"player_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Count"},"stream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stream Url"},"is_live_override":{"type":"boolean","title":"Is Live Override","default":false},"preview_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Text"},"featured_participants":{"items":{"$ref":"#/components/schemas/FeaturedParticipant"},"type":"array","title":"Featured Participants","default":[]},"organizer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organizer Name"},"follow_count":{"type":"integer","title":"Follow Count","default":0},"is_following":{"type":"boolean","title":"Is Following","default":false},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"subject_is_pokemon":{"type":"boolean","title":"Subject Is Pokemon","default":false},"round_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Round Label"},"verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict"},"winner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Winner"},"tournament_threads":{"items":{"$ref":"#/components/schemas/TournamentThread"},"type":"array","title":"Tournament Threads","default":[]}},"type":"object","required":["id","source","name"],"title":"EventDetail"},"EventEnrichmentPatch":{"properties":{"stream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stream Url"},"is_live_override":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Live Override"},"preview_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Text"},"featured_participants":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Featured Participants"}},"type":"object","title":"EventEnrichmentPatch","description":"Partial patch : omettre un champ le laisse intact. `null` l'efface.\nLe distinguo null/absent se fait via model_fields_set (exclude_unset)."},"FeaturedParticipant":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"discriminator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discriminator"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"}},"type":"object","required":["user_id","username"],"title":"FeaturedParticipant","description":"Un user Smodown mis en avant sur la page event detail.\nRésolu côté backend à partir du JSON `featured_participants` (liste de user_ids)."},"FeaturedProfilesResponse":{"properties":{"newcomers":{"items":{"$ref":"#/components/schemas/ProfileCard"},"type":"array","title":"Newcomers"},"active_hosts":{"items":{"$ref":"#/components/schemas/ProfileCard"},"type":"array","title":"Active Hosts"},"active_players":{"items":{"$ref":"#/components/schemas/ProfileCard"},"type":"array","title":"Active Players"},"most_creative":{"items":{"$ref":"#/components/schemas/ProfileCard"},"type":"array","title":"Most Creative"}},"type":"object","required":["newcomers","active_hosts","active_players","most_creative"],"title":"FeaturedProfilesResponse"},"FeedItem":{"properties":{"kind":{"type":"string","enum":["public","personal"],"title":"Kind"},"id":{"type":"integer","title":"Id"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"format_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Id"},"i18n_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"I18N Key"},"link_url":{"type":"string","title":"Link Url"},"payload":{"type":"object","title":"Payload"},"severity":{"type":"string","enum":["info","notable","major"],"title":"Severity"},"published_at":{"type":"string","title":"Published At"},"is_read":{"type":"boolean","title":"Is Read","default":false},"is_dismissed":{"type":"boolean","title":"Is Dismissed","default":false}},"type":"object","required":["kind","id","link_url","payload","severity","published_at"],"title":"FeedItem","description":"Item unifié retourné par /feed — public event OU notif perso."},"FeedResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FeedItem"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Cursor","description":"Cursor (id du dernier item) à passer en `before_id` pour la page suivante. null si fin."}},"type":"object","required":["items"],"title":"FeedResponse"},"FollowBody":{"properties":{"target_type":{"type":"string","enum":["event","series","tier"],"title":"Target Type"},"target_key":{"type":"string","maxLength":128,"minLength":1,"title":"Target Key"}},"type":"object","required":["target_type","target_key"],"title":"FollowBody"},"FollowItem":{"properties":{"id":{"type":"integer","title":"Id"},"target_type":{"type":"string","title":"Target Type"},"target_key":{"type":"string","title":"Target Key"},"created_at":{"type":"integer","title":"Created At"}},"type":"object","required":["id","target_type","target_key","created_at"],"title":"FollowItem"},"FollowsResponse":{"properties":{"follows":{"items":{"$ref":"#/components/schemas/FollowItem"},"type":"array","title":"Follows"}},"type":"object","required":["follows"],"title":"FollowsResponse"},"ForfeitMatchRequest":{"properties":{"winner_participant_id":{"type":"integer","title":"Winner Participant Id"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","required":["winner_participant_id"],"title":"ForfeitMatchRequest","description":"Forfeit manuel :\n- Si l'appelant est joueur : il déclare forfait, `winner_participant_id`\n  doit pointer vers l'autre joueur.\n- Si l'appelant est host : peut imposer un forfait avec n'importe quel\n  joueur comme gagnant (ex: un joueur DQ pour règle enfreinte)."},"FormatResponse":{"properties":{"format_id":{"type":"string","title":"Format Id"},"nom_affiche":{"type":"string","title":"Nom Affiche"},"generation":{"type":"integer","title":"Generation"},"tier":{"type":"string","title":"Tier"},"gen_number":{"type":"integer","title":"Gen Number"},"tier_name":{"type":"string","title":"Tier Name"},"label":{"type":"string","title":"Label"},"format_kind":{"type":"string","enum":["singles","doubles","vgc"],"title":"Format Kind","default":"singles"},"dernier_snapshot":{"anyOf":[{"$ref":"#/components/schemas/SnapshotMeta"},{"type":"null"}]},"premier_snapshot":{"anyOf":[{"$ref":"#/components/schemas/SnapshotMeta"},{"type":"null"}]},"nb_snapshots":{"type":"integer","title":"Nb Snapshots"},"dernieres_batailles":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dernieres Batailles"},"batailles_mois_precedent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Batailles Mois Precedent"},"available_elos":{"items":{"type":"integer"},"type":"array","title":"Available Elos"}},"type":"object","required":["format_id","nom_affiche","generation","tier","gen_number","tier_name","label","dernier_snapshot","nb_snapshots"],"title":"FormatResponse"},"GalleryItem":{"properties":{"id":{"type":"integer","title":"Id"},"image_url":{"type":"string","title":"Image Url"},"prompt_subject":{"type":"string","title":"Prompt Subject"},"prompt_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Action"},"prompt_final":{"type":"string","title":"Prompt Final"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"style_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Tag"},"pokemon_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pokemon Tag"},"source":{"type":"string","enum":["seed","community"],"title":"Source"}},"type":"object","required":["id","image_url","prompt_subject","prompt_final","source"],"title":"GalleryItem"},"GenerateLinkCodeResponse":{"properties":{"code":{"type":"string","title":"Code"},"expires_at":{"type":"string","title":"Expires At"}},"type":"object","required":["code","expires_at"],"title":"GenerateLinkCodeResponse"},"GenerateRequest":{"properties":{"subject":{"type":"string","maxLength":200,"minLength":1,"title":"Subject"},"action":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Action"}},"type":"object","required":["subject"],"title":"GenerateRequest"},"GenerateResponse":{"properties":{"generation_id":{"type":"integer","title":"Generation Id"},"prompt_final":{"type":"string","title":"Prompt Final"},"variation_a_url":{"type":"string","title":"Variation A Url"},"variation_b_url":{"type":"string","title":"Variation B Url"},"credits_remaining":{"type":"integer","title":"Credits Remaining"}},"type":"object","required":["generation_id","prompt_final","variation_a_url","variation_b_url","credits_remaining"],"title":"GenerateResponse"},"GenerationRecord":{"properties":{"id":{"type":"integer","title":"Id"},"prompt_subject":{"type":"string","title":"Prompt Subject"},"prompt_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Action"},"prompt_final":{"type":"string","title":"Prompt Final"},"variation_a_url":{"type":"string","title":"Variation A Url"},"variation_b_url":{"type":"string","title":"Variation B Url"},"chosen_variation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chosen Variation"},"parent_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Generation Id"},"parent_variation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Variation"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","prompt_subject","prompt_final","variation_a_url","variation_b_url","created_at"],"title":"GenerationRecord"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HallOfFameItem":{"properties":{"id":{"type":"integer","title":"Id"},"avatar_name":{"type":"string","title":"Avatar Name"},"category":{"type":"string","title":"Category"},"artist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artist"},"artist2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artist2"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"cdn_url":{"type":"string","title":"Cdn Url"}},"type":"object","required":["id","avatar_name","category","cdn_url"],"title":"HallOfFameItem"},"HistoryPoint":{"properties":{"annee":{"type":"integer","title":"Annee"},"mois":{"type":"integer","title":"Mois"},"usage_rate":{"type":"number","title":"Usage Rate"},"rank":{"type":"integer","title":"Rank"}},"type":"object","required":["annee","mois","usage_rate","rank"],"title":"HistoryPoint"},"InvitationCreateBody":{"properties":{"invitee_user_id":{"type":"string","maxLength":64,"minLength":1,"title":"Invitee User Id"}},"type":"object","required":["invitee_user_id"],"title":"InvitationCreateBody"},"InvitationItem":{"properties":{"id":{"type":"integer","title":"Id"},"tournament_id":{"type":"string","title":"Tournament Id"},"tournament_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tournament Name"},"tournament_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tournament Slug"},"inviter_user_id":{"type":"string","title":"Inviter User Id"},"inviter_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Username"},"invitee_user_id":{"type":"string","title":"Invitee User Id"},"invitee_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invitee Username"},"status":{"type":"string","title":"Status"},"created_at":{"type":"integer","title":"Created At"},"responded_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Responded At"}},"type":"object","required":["id","tournament_id","inviter_user_id","invitee_user_id","status","created_at"],"title":"InvitationItem"},"InvitationListResponse":{"properties":{"invitations":{"items":{"$ref":"#/components/schemas/InvitationItem"},"type":"array","title":"Invitations"}},"type":"object","required":["invitations"],"title":"InvitationListResponse"},"ItemDetail":{"properties":{"display_name":{"type":"string","title":"Display Name","default":""},"sprite_url":{"type":"string","title":"Sprite Url","default":""},"description":{"type":"string","title":"Description","default":""}},"type":"object","title":"ItemDetail"},"ItemStat":{"properties":{"name":{"type":"string","title":"Name"},"usage":{"type":"number","title":"Usage"}},"type":"object","required":["name","usage"],"title":"ItemStat"},"IterateRequest":{"properties":{"parent_generation_id":{"type":"integer","title":"Parent Generation Id"},"parent_variation":{"type":"string","enum":["a","b"],"title":"Parent Variation"},"subject":{"type":"string","maxLength":200,"minLength":1,"title":"Subject"},"action":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Action"}},"type":"object","required":["parent_generation_id","parent_variation","subject"],"title":"IterateRequest"},"JoinRequest":{"properties":{"showdown_pseudo":{"anyOf":[{"type":"string","maxLength":32,"minLength":1},{"type":"null"}],"title":"Showdown Pseudo"},"invite_code":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Invite Code"}},"type":"object","title":"JoinRequest","description":"Inscription d'un participant à un tournoi. Le pseudo utilisé par défaut\nest le showdown_username vérifié du compte — l'override ici permet\nexplicitement d'utiliser un alt (toujours le même compte Smodown)."},"LadderEntry":{"properties":{"rank":{"type":"integer","title":"Rank"},"userid":{"type":"string","title":"Userid"},"username":{"type":"string","title":"Username"},"elo":{"type":"number","title":"Elo"},"gxe":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gxe"},"r":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"R"},"rd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rd"},"w":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"W"},"l":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"L"},"t":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"T"},"first_played":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First Played"},"last_played":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Played"},"past_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Past Rank"},"past_elo":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Past Elo"},"delta_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delta Rank"},"delta_elo":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Elo"},"smodown_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smodown User Id"}},"type":"object","required":["rank","userid","username","elo"],"title":"LadderEntry"},"LadderFormat":{"properties":{"format_id":{"type":"string","title":"Format Id"},"display_name":{"type":"string","title":"Display Name"},"generation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"has_snapshots":{"type":"boolean","title":"Has Snapshots","default":false}},"type":"object","required":["format_id","display_name"],"title":"LadderFormat"},"LadderFormatsResponse":{"properties":{"formats":{"items":{"$ref":"#/components/schemas/LadderFormat"},"type":"array","title":"Formats"}},"type":"object","required":["formats"],"title":"LadderFormatsResponse"},"LadderMeFormatStats":{"properties":{"format_id":{"type":"string","title":"Format Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"generation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation"},"current_elo":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Elo"},"current_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Rank"},"peak_elo":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Peak Elo"},"last_played":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Played"},"delta_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta 7D"},"w":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"W"},"l":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"L"},"gxe":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gxe"},"next_target":{"anyOf":[{"$ref":"#/components/schemas/NextTarget"},{"type":"null"}]}},"type":"object","required":["format_id"],"title":"LadderMeFormatStats"},"LadderMeResponse":{"properties":{"showdown_userid":{"type":"string","title":"Showdown Userid"},"formats":{"items":{"$ref":"#/components/schemas/LadderMeFormatStats"},"type":"array","title":"Formats"}},"type":"object","required":["showdown_userid","formats"],"title":"LadderMeResponse"},"LadderTopResponse":{"properties":{"format_id":{"type":"string","title":"Format Id"},"captured_at":{"type":"integer","title":"Captured At"},"count":{"type":"integer","title":"Count"},"entries":{"items":{"$ref":"#/components/schemas/LadderEntry"},"type":"array","title":"Entries"}},"type":"object","required":["format_id","captured_at","count","entries"],"title":"LadderTopResponse"},"LeadStat":{"properties":{"rank":{"type":"integer","title":"Rank"},"pokemon_name":{"type":"string","title":"Pokemon Name"},"lead_usage_rate":{"type":"number","title":"Lead Usage Rate"},"sprite_url":{"type":"string","title":"Sprite Url"}},"type":"object","required":["rank","pokemon_name","lead_usage_rate","sprite_url"],"title":"LeadStat"},"LeaveResponse":{"properties":{"dropped":{"type":"boolean","title":"Dropped"}},"type":"object","required":["dropped"],"title":"LeaveResponse"},"LiveEventItem":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"name":{"type":"string","title":"Name"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"format_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Label"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"stream_url":{"type":"string","title":"Stream Url"},"is_live_override":{"type":"boolean","title":"Is Live Override","default":false},"preview_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Text"}},"type":"object","required":["id","source","name","stream_url"],"title":"LiveEventItem"},"LiveEventsResponse":{"properties":{"events":{"items":{"$ref":"#/components/schemas/LiveEventItem"},"type":"array","title":"Events"},"as_of":{"type":"string","title":"As Of"}},"type":"object","required":["events","as_of"],"title":"LiveEventsResponse"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":1,"title":"Password"},"client":{"type":"string","enum":["web","mobile"],"title":"Client","default":"web"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Connexion existante."},"MarkReadRequest":{"properties":{"event_ids":{"items":{"type":"integer"},"type":"array","title":"Event Ids","description":"Events publics à marquer lus."},"notif_ids":{"items":{"type":"integer"},"type":"array","title":"Notif Ids","description":"Notifs perso à marquer lues."}},"type":"object","title":"MarkReadRequest"},"MarkReadResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"events_marked":{"type":"integer","title":"Events Marked"},"notifs_marked":{"type":"integer","title":"Notifs Marked"}},"type":"object","required":["ok","events_marked","notifs_marked"],"title":"MarkReadResponse"},"MatchPlayer":{"properties":{"participant_id":{"type":"integer","title":"Participant Id"},"user_id":{"type":"string","title":"User Id"},"showdown_pseudo":{"type":"string","title":"Showdown Pseudo"}},"type":"object","required":["participant_id","user_id","showdown_pseudo"],"title":"MatchPlayer"},"MatchResponse":{"properties":{"id":{"type":"integer","title":"Id"},"tournament_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tournament Id"},"round":{"type":"integer","title":"Round"},"bracket_position":{"type":"integer","title":"Bracket Position"},"bracket_side":{"type":"string","enum":["main","lower","grand","reset"],"title":"Bracket Side","default":"main"},"status":{"type":"string","enum":["pending","ready_check","ongoing","finished","disputed","forfeited","bye"],"title":"Status"},"player_a":{"anyOf":[{"$ref":"#/components/schemas/MatchPlayer"},{"type":"null"}]},"player_b":{"anyOf":[{"$ref":"#/components/schemas/MatchPlayer"},{"type":"null"}]},"winner_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Participant Id"},"showdown_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Url"},"replay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replay Url"},"deadline_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deadline At"},"started_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Finished At"},"dispute_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispute Reason"},"resolved_via":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Via"}},"type":"object","required":["id","round","bracket_position","status","player_a","player_b","winner_participant_id","showdown_url","replay_url","deadline_at","started_at","finished_at","dispute_reason"],"title":"MatchResponse"},"MatchesListResponse":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/MatchResponse"},"type":"array","title":"Matches"},"total_rounds":{"type":"integer","title":"Total Rounds"}},"type":"object","required":["matches","total_rounds"],"title":"MatchesListResponse"},"MatchupCell":{"properties":{"a_name":{"type":"string","title":"A Name"},"b_name":{"type":"string","title":"B Name"},"score":{"type":"number","title":"Score"},"label":{"type":"string","title":"Label"},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons"}},"type":"object","required":["a_name","b_name","score","label","reasons"],"title":"MatchupCell","description":"One cell of the 6x6 matchup matrix — team_a[row] vs team_b[col]."},"MetaOverviewResponse":{"properties":{"format_id":{"type":"string","title":"Format Id"},"annee":{"type":"integer","title":"Annee"},"mois":{"type":"integer","title":"Mois"},"elo_cutoff":{"type":"integer","title":"Elo Cutoff"},"available_elos":{"items":{"type":"integer"},"type":"array","title":"Available Elos"},"nb_batailles":{"type":"integer","title":"Nb Batailles"},"batailles_mois_precedent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Batailles Mois Precedent"},"pokemon":{"items":{"$ref":"#/components/schemas/PokemonUsageSummary"},"type":"array","title":"Pokemon"},"playstyles":{"items":{"$ref":"#/components/schemas/PlaystyleStat"},"type":"array","title":"Playstyles"},"leads":{"items":{"$ref":"#/components/schemas/LeadStat"},"type":"array","title":"Leads"}},"type":"object","required":["format_id","annee","mois","elo_cutoff","nb_batailles","pokemon","playstyles","leads"],"title":"MetaOverviewResponse"},"MetaResponse":{"properties":{"tournament_id":{"type":"string","title":"Tournament Id"},"grouping":{"type":"string","enum":["single","duos","trios","quads"],"title":"Grouping"},"scope":{"type":"string","enum":["all","top16"],"title":"Scope"},"total_teams":{"type":"integer","title":"Total Teams"},"items":{"items":{"$ref":"#/components/schemas/MetaTeamRow"},"type":"array","title":"Items"}},"type":"object","required":["tournament_id","grouping","scope","total_teams","items"],"title":"MetaResponse"},"MetaStatusBadge":{"properties":{"badge":{"type":"string","title":"Badge"},"label":{"type":"string","title":"Label"}},"type":"object","required":["badge","label"],"title":"MetaStatusBadge"},"MetaTeamRow":{"properties":{"team":{"items":{"type":"string"},"type":"array","title":"Team"},"count":{"type":"integer","title":"Count"},"seen_pct":{"type":"number","title":"Seen Pct"},"win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Pct"},"record":{"type":"string","title":"Record"}},"type":"object","required":["team","count","seen_pct","win_pct","record"],"title":"MetaTeamRow","description":"Un row du tableau Meta : combo de 1, 2, 3 ou 4 Pokémon avec leurs\nstats agrégés sur l'ensemble des teams qui les contiennent toutes."},"MetricEventIn":{"properties":{"rule_key":{"type":"string","maxLength":80,"minLength":1,"title":"Rule Key"},"event_type":{"type":"string","enum":["shown","dismissed","clicked"],"title":"Event Type"},"ts":{"type":"integer","title":"Ts","description":"Unix millis client-side (indicatif)"}},"type":"object","required":["rule_key","event_type","ts"],"title":"MetricEventIn","description":"Un event individuel émis par le client."},"MetricsBatchIn":{"properties":{"events":{"items":{"$ref":"#/components/schemas/MetricEventIn"},"type":"array","maxItems":50,"minItems":1,"title":"Events"}},"type":"object","required":["events"],"title":"MetricsBatchIn"},"MetricsBatchOut":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"rejected":{"type":"integer","title":"Rejected"}},"type":"object","required":["accepted","rejected"],"title":"MetricsBatchOut"},"MonthlyRecapResponse":{"properties":{"year":{"type":"integer","title":"Year"},"month":{"type":"integer","title":"Month"},"month_label":{"type":"string","title":"Month Label"},"is_sparse":{"type":"boolean","title":"Is Sparse"},"tournaments_finished":{"type":"integer","title":"Tournaments Finished"},"top_tournaments":{"items":{"$ref":"#/components/schemas/RecapTournament"},"type":"array","title":"Top Tournaments"},"smogon_t1_count":{"type":"integer","title":"Smogon T1 Count"},"smogon_t2_count":{"type":"integer","title":"Smogon T2 Count"},"top_smogon_tournaments":{"items":{"$ref":"#/components/schemas/RecapSmogonTournament"},"type":"array","title":"Top Smogon Tournaments"},"official_events_count":{"type":"integer","title":"Official Events Count"},"vgc_count":{"type":"integer","title":"Vgc Count"},"champions_count":{"type":"integer","title":"Champions Count"},"top_official_events":{"items":{"$ref":"#/components/schemas/RecapOfficialEvent"},"type":"array","title":"Top Official Events"},"smogon_tiering":{"items":{"$ref":"#/components/schemas/RecapTieringEvent"},"type":"array","title":"Smogon Tiering"},"notable_events":{"items":{"$ref":"#/components/schemas/RecapNotableEvent"},"type":"array","title":"Notable Events"},"rookies_of_the_month":{"items":{"$ref":"#/components/schemas/RecapRookie"},"type":"array","title":"Rookies Of The Month"}},"type":"object","required":["year","month","month_label","is_sparse","tournaments_finished","top_tournaments","smogon_t1_count","smogon_t2_count","top_smogon_tournaments","official_events_count","vgc_count","champions_count","top_official_events","smogon_tiering","notable_events","rookies_of_the_month"],"title":"MonthlyRecapResponse"},"MoveDetail":{"properties":{"display_name":{"type":"string","title":"Display Name","default":""},"type":{"type":"string","title":"Type","default":"Normal"},"category":{"type":"string","title":"Category","default":"Status"},"power":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Power"},"accuracy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Accuracy"},"pp":{"type":"integer","title":"Pp","default":0},"description":{"type":"string","title":"Description","default":""}},"type":"object","title":"MoveDetail"},"MoveStat":{"properties":{"name":{"type":"string","title":"Name"},"usage":{"type":"number","title":"Usage"}},"type":"object","required":["name","usage"],"title":"MoveStat"},"NextTarget":{"properties":{"rank":{"type":"integer","title":"Rank"},"username":{"type":"string","title":"Username"},"elo":{"type":"number","title":"Elo"},"elo_gap":{"type":"number","title":"Elo Gap"}},"type":"object","required":["rank","username","elo","elo_gap"],"title":"NextTarget"},"NotificationPrefs":{"properties":{"toggles":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Toggles"},"format_filter":{"items":{"type":"string"},"type":"array","title":"Format Filter","description":"Liste blanche de format_ids. Vide = pas de filtre (tous formats)."}},"type":"object","required":["toggles"],"title":"NotificationPrefs","description":"Toggles granulaires par event_type. format_filter vide = tous formats."},"OfficialTrainerItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"base_name":{"type":"string","title":"Base Name"},"generation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation"},"series":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series"},"artist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artist"},"cdn_url":{"type":"string","title":"Cdn Url"}},"type":"object","required":["id","name","base_name","cdn_url"],"title":"OfficialTrainerItem"},"ParticipantResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"discriminator":{"type":"string","title":"Discriminator"},"showdown_pseudo":{"type":"string","title":"Showdown Pseudo"},"showdown_userid":{"type":"string","title":"Showdown Userid"},"status":{"type":"string","enum":["registered","checked_in","dropped","disqualified"],"title":"Status"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"registered_at":{"type":"integer","title":"Registered At"}},"type":"object","required":["id","user_id","username","discriminator","showdown_pseudo","showdown_userid","status","seed","registered_at"],"title":"ParticipantResponse"},"ParticipantsListResponse":{"properties":{"participants":{"items":{"$ref":"#/components/schemas/ParticipantResponse"},"type":"array","title":"Participants"}},"type":"object","required":["participants"],"title":"ParticipantsListResponse"},"PinCreateRequest":{"properties":{"kind":{"type":"string","enum":["format","pokemon","view"],"title":"Kind"},"target_id":{"type":"string","maxLength":120,"minLength":1,"title":"Target Id"},"view_url":{"type":"string","maxLength":500,"minLength":1,"title":"View Url"},"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Label"}},"type":"object","required":["kind","target_id","view_url"],"title":"PinCreateRequest"},"PinEntry":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","enum":["format","pokemon","view"],"title":"Kind"},"target_id":{"type":"string","title":"Target Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"view_url":{"type":"string","title":"View Url"},"sort_order":{"type":"integer","title":"Sort Order"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","kind","target_id","label","view_url","sort_order","created_at"],"title":"PinEntry"},"PinListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PinEntry"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"max":{"type":"integer","title":"Max"}},"type":"object","required":["items","total","max"],"title":"PinListResponse"},"PinReorderRequest":{"properties":{"ordered_ids":{"items":{"type":"integer"},"type":"array","maxItems":50,"title":"Ordered Ids"}},"type":"object","required":["ordered_ids"],"title":"PinReorderRequest"},"PlayerHistoryResponse":{"properties":{"format_id":{"type":"string","title":"Format Id"},"userid":{"type":"string","title":"Userid"},"username":{"type":"string","title":"Username"},"period_seconds":{"type":"integer","title":"Period Seconds"},"points":{"items":{"$ref":"#/components/schemas/EloPoint"},"type":"array","title":"Points"}},"type":"object","required":["format_id","userid","username","period_seconds","points"],"title":"PlayerHistoryResponse"},"PlayerSeries":{"properties":{"userid":{"type":"string","title":"Userid"},"username":{"type":"string","title":"Username"},"points":{"items":{"$ref":"#/components/schemas/EloPoint"},"type":"array","title":"Points"}},"type":"object","required":["userid","username","points"],"title":"PlayerSeries"},"PlaystyleStat":{"properties":{"playstyle":{"type":"string","title":"Playstyle"},"usage_rate":{"type":"number","title":"Usage Rate"}},"type":"object","required":["playstyle","usage_rate"],"title":"PlaystyleStat"},"PokeData":{"properties":{"moves":{"additionalProperties":{"$ref":"#/components/schemas/MoveDetail"},"type":"object","title":"Moves","default":{}},"items":{"additionalProperties":{"$ref":"#/components/schemas/ItemDetail"},"type":"object","title":"Items","default":{}},"abilities":{"additionalProperties":{"$ref":"#/components/schemas/AbilityDetail"},"type":"object","title":"Abilities","default":{}}},"type":"object","title":"PokeData"},"PokemonHistoryResponse":{"properties":{"pokemon_name":{"type":"string","title":"Pokemon Name"},"format_id":{"type":"string","title":"Format Id"},"history":{"items":{"$ref":"#/components/schemas/HistoryPoint"},"type":"array","title":"History"}},"type":"object","required":["pokemon_name","format_id","history"],"title":"PokemonHistoryResponse"},"PokemonReference":{"properties":{"type1":{"type":"string","title":"Type1"},"type2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type2"},"bst":{"type":"integer","title":"Bst"},"sprite_url":{"type":"string","title":"Sprite Url"},"sprite_shiny_url":{"type":"string","title":"Sprite Shiny Url"},"base_stat_hp":{"type":"integer","title":"Base Stat Hp","default":0},"base_stat_atk":{"type":"integer","title":"Base Stat Atk","default":0},"base_stat_def":{"type":"integer","title":"Base Stat Def","default":0},"base_stat_spa":{"type":"integer","title":"Base Stat Spa","default":0},"base_stat_spd":{"type":"integer","title":"Base Stat Spd","default":0},"base_stat_spe":{"type":"integer","title":"Base Stat Spe","default":0}},"type":"object","required":["type1","type2","bst","sprite_url","sprite_shiny_url"],"title":"PokemonReference"},"PokemonStatsResponse":{"properties":{"pokemon_name":{"type":"string","title":"Pokemon Name"},"format_id":{"type":"string","title":"Format Id"},"annee":{"type":"integer","title":"Annee"},"mois":{"type":"integer","title":"Mois"},"rank":{"type":"integer","title":"Rank"},"usage_rate":{"type":"number","title":"Usage Rate"},"usage_delta":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Usage Delta"},"rank_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta"},"rank_delta_3m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta 3M"},"raw_count":{"type":"integer","title":"Raw Count"},"reference":{"$ref":"#/components/schemas/PokemonReference"},"abilities":{"items":{"$ref":"#/components/schemas/AbilityStat"},"type":"array","title":"Abilities"},"items":{"items":{"$ref":"#/components/schemas/ItemStat"},"type":"array","title":"Items"},"moves":{"items":{"$ref":"#/components/schemas/MoveStat"},"type":"array","title":"Moves"},"spreads":{"items":{"$ref":"#/components/schemas/SpreadStat"},"type":"array","title":"Spreads"},"teammates":{"items":{"$ref":"#/components/schemas/TeammateStat"},"type":"array","title":"Teammates"},"checks_counters":{"items":{"$ref":"#/components/schemas/CounterStat"},"type":"array","title":"Checks Counters"},"teratypes":{"items":{"$ref":"#/components/schemas/TeraTypeStat"},"type":"array","title":"Teratypes"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"pokedata":{"$ref":"#/components/schemas/PokeData"},"smogon_sets":{"items":{"$ref":"#/components/schemas/SmogonSet"},"type":"array","title":"Smogon Sets"}},"type":"object","required":["pokemon_name","format_id","annee","mois","rank","usage_rate","usage_delta","raw_count","reference","abilities","items","moves","spreads","teammates","checks_counters"],"title":"PokemonStatsResponse"},"PokemonUsageSummary":{"properties":{"rank":{"type":"integer","title":"Rank"},"pokemon_name":{"type":"string","title":"Pokemon Name"},"usage_rate":{"type":"number","title":"Usage Rate"},"usage_delta":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Usage Delta"},"rank_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta"},"rank_delta_3m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta 3M"},"raw_count":{"type":"integer","title":"Raw Count"},"sprite_url":{"type":"string","title":"Sprite Url"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"type1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type1"},"type2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type2"},"base_stat_hp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Stat Hp"},"base_stat_atk":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Stat Atk"},"base_stat_def":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Stat Def"},"base_stat_spa":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Stat Spa"},"base_stat_spd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Stat Spd"},"base_stat_spe":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Base Stat Spe"}},"type":"object","required":["rank","pokemon_name","usage_rate","usage_delta","raw_count","sprite_url"],"title":"PokemonUsageSummary"},"PortalResponse":{"properties":{"url":{"type":"string","title":"Url"},"stub":{"type":"boolean","title":"Stub","default":false}},"type":"object","required":["url"],"title":"PortalResponse"},"PremiumStatusResponse":{"properties":{"premium":{"type":"boolean","title":"Premium"},"premium_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Premium Until"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"linked":{"type":"boolean","title":"Linked"}},"type":"object","required":["premium","linked"],"title":"PremiumStatusResponse"},"ProducerFlag":{"properties":{"event_type":{"type":"string","title":"Event Type"},"enabled":{"type":"boolean","title":"Enabled"},"updated_at":{"type":"string","title":"Updated At"},"updated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["event_type","enabled","updated_at"],"title":"ProducerFlag"},"ProducerFlagsResponse":{"properties":{"flags":{"items":{"$ref":"#/components/schemas/ProducerFlag"},"type":"array","title":"Flags"}},"type":"object","required":["flags"],"title":"ProducerFlagsResponse"},"ProfileCard":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"discriminator":{"type":"string","title":"Discriminator"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"created_at":{"type":"string","title":"Created At"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"},"sprite_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Type"},"active_background":{"anyOf":[{"$ref":"#/components/schemas/CardBackgroundLite"},{"type":"null"}]},"active_color":{"anyOf":[{"$ref":"#/components/schemas/CardColorLite"},{"type":"null"}]},"public_generations_count":{"type":"integer","title":"Public Generations Count","default":0},"showdown_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Username"},"showdown_verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Verified At"}},"type":"object","required":["id","username","discriminator","created_at"],"title":"ProfileCard"},"ProfileMetaPatchRequest":{"properties":{"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"main_format_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Main Format Id"},"twitter_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Handle"},"youtube_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Handle"},"twitch_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitch Handle"},"discord_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Handle"}},"type":"object","title":"ProfileMetaPatchRequest","description":"Fields are all optional — only present keys are updated (PATCH semantic).\nA null (or empty string) value clears the field. Un-set key leaves it\nunchanged.\n\nNB: Pydantic v2 distingue \"clé absente\" de \"clé=null\" uniquement si on\nutilise `model_fields_set` (ou `exclude_unset=True`). On s'appuie dessus\ncôté handler pour savoir quels champs patcher."},"ProfileMetaPatchResponse":{"properties":{"id":{"type":"string","title":"Id"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"main_format_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Main Format Id"},"twitter_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Handle"},"youtube_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Handle"},"twitch_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitch Handle"},"discord_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Handle"}},"type":"object","required":["id"],"title":"ProfileMetaPatchResponse"},"ProfileSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ProfileCard"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["results","total","limit","offset"],"title":"ProfileSearchResponse"},"ProfileSpriteRequest":{"properties":{"source":{"type":"string","enum":["official","community"],"title":"Source"},"id":{"type":"integer","title":"Id"}},"type":"object","required":["source","id"],"title":"ProfileSpriteRequest"},"PublicGeneration":{"properties":{"id":{"type":"integer","title":"Id"},"image_url":{"type":"string","title":"Image Url"},"prompt_final":{"type":"string","title":"Prompt Final"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","image_url","prompt_final","created_at"],"title":"PublicGeneration"},"PublicProfileResponse":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"discriminator":{"type":"string","title":"Discriminator","default":""},"public_profile":{"type":"boolean","title":"Public Profile","default":false},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"created_at":{"type":"string","title":"Created At"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"},"sprite_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Type"},"sprite_artist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Artist"},"sprite_artist2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Artist2"},"showdown_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Username"},"showdown_verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Verified At"},"active_background":{"anyOf":[{"$ref":"#/components/schemas/CardBackground"},{"type":"null"}]},"active_color":{"anyOf":[{"$ref":"#/components/schemas/CardColor"},{"type":"null"}]},"public_generations":{"items":{"$ref":"#/components/schemas/PublicGeneration"},"type":"array","title":"Public Generations"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"main_format_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Main Format Id"},"twitter_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Handle"},"youtube_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Handle"},"twitch_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitch Handle"},"discord_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Handle"}},"type":"object","required":["id","username","created_at","public_generations"],"title":"PublicProfileResponse"},"RecapNotableEvent":{"properties":{"event_type":{"type":"string","title":"Event Type"},"format_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Id"},"payload":{"type":"object","title":"Payload"},"published_at":{"type":"string","title":"Published At"}},"type":"object","required":["event_type","payload","published_at"],"title":"RecapNotableEvent"},"RecapOfficialEvent":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"name":{"type":"string","title":"Name"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},"type":"object","required":["id","source","name"],"title":"RecapOfficialEvent"},"RecapRookie":{"properties":{"format_id":{"type":"string","title":"Format Id"},"pokemon_name":{"type":"string","title":"Pokemon Name"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"},"new_rank":{"type":"integer","title":"New Rank"},"prev_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prev Rank"},"usage_rate":{"type":"number","title":"Usage Rate"}},"type":"object","required":["format_id","pokemon_name","new_rank","prev_rank","usage_rate"],"title":"RecapRookie","description":"A Pokémon that newly entered the top 10 in a whitelisted format\nduring the recap month (vs. the previous month), at ELITE ELO only.\nThe \"Rookie of the Month\" Spotify-Wrapped style block on the recap UI."},"RecapSmogonTournament":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"tier":{"type":"string","title":"Tier"},"name":{"type":"string","title":"Name"},"series":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["id","source","tier","name"],"title":"RecapSmogonTournament"},"RecapTieringEvent":{"properties":{"id":{"type":"string","title":"Id"},"tier_code":{"type":"string","title":"Tier Code"},"title":{"type":"string","title":"Title"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","tier_code","title"],"title":"RecapTieringEvent"},"RecapTournament":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"format_id":{"type":"string","title":"Format Id"},"participants_count":{"type":"integer","title":"Participants Count"},"champion_pseudo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Champion Pseudo"}},"type":"object","required":["id","slug","name","format_id","participants_count"],"title":"RecapTournament"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"username":{"type":"string","maxLength":32,"minLength":2,"title":"Username"},"client":{"type":"string","enum":["web","mobile"],"title":"Client","default":"web"}},"type":"object","required":["email","password","username"],"title":"RegisterRequest","description":"Inscription avec email + mot de passe."},"ReplayConflict":{"properties":{"submitted_id":{"type":"string","title":"Submitted Id"},"existing_id":{"type":"string","title":"Existing Id"},"replay_url":{"type":"string","title":"Replay Url"}},"type":"object","required":["submitted_id","existing_id","replay_url"],"title":"ReplayConflict","description":"A replay the client tried to push but was blocked because the same\n`replay_url` is already on file under a different active id. The client\nshould either (a) drop its local copy and adopt `existing_id`, or\n(b) soft-delete the existing one first if the new payload should win."},"ReplayRecord":{"properties":{"id":{"type":"string","title":"Id"},"replay_url":{"type":"string","title":"Replay Url"},"data":{"type":"object","title":"Data"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted At"}},"type":"object","required":["id","replay_url","data","created_at","updated_at"],"title":"ReplayRecord"},"ReplayUpsert":{"properties":{"id":{"type":"string","maxLength":64,"minLength":1,"title":"Id"},"replay_url":{"type":"string","maxLength":500,"minLength":1,"title":"Replay Url"},"data":{"type":"object","title":"Data","description":"Replay metadata blob"}},"type":"object","required":["id","replay_url"],"title":"ReplayUpsert"},"ReportMatchRequest":{"properties":{"showdown_url":{"type":"string","maxLength":500,"minLength":5,"title":"Showdown Url"}},"type":"object","required":["showdown_url"],"title":"ReportMatchRequest","description":"L'un des joueurs poste l'URL du match Showdown pour auto-report."},"ReseedRequest":{"properties":{"participant_ids":{"items":{"type":"integer"},"type":"array","minItems":2,"title":"Participant Ids"}},"type":"object","required":["participant_ids"],"title":"ReseedRequest","description":"Host impose l'ordre des seeds avant /start. `participant_ids` est la\nliste complète des ids participants actifs, dans l'ordre seed 1 → N.\nLe backend valide que l'ensemble est exhaustif (tout le monde apparaît\nune et une seule fois)."},"ResolveMatchRequest":{"properties":{"winner_participant_id":{"type":"integer","title":"Winner Participant Id"},"replay_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Replay Url"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","required":["winner_participant_id"],"title":"ResolveMatchRequest","description":"Host override : ferme un match manuellement en choisissant le gagnant.\nTypiquement utilisé après un /dispute ou pour débloquer une situation."},"RiserFallerEntry":{"properties":{"entity_name":{"type":"string","title":"Entity Name"},"display_name":{"type":"string","title":"Display Name"},"current_usage":{"type":"number","title":"Current Usage"},"pct_change":{"type":"number","title":"Pct Change"},"rank_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta"},"rank_delta_3m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Delta 3M"},"move_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Move Type"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"}},"type":"object","required":["entity_name","display_name","current_usage","pct_change"],"title":"RiserFallerEntry"},"RivalCreateBody":{"properties":{"rival_showdown_userid":{"type":"string","title":"Rival Showdown Userid"},"format_id":{"type":"string","title":"Format Id"},"rival_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rival Label"}},"type":"object","required":["rival_showdown_userid","format_id"],"title":"RivalCreateBody"},"RivalItem":{"properties":{"id":{"type":"integer","title":"Id"},"rival_showdown_userid":{"type":"string","title":"Rival Showdown Userid"},"rival_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rival Label"},"rival_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rival Display"},"format_id":{"type":"string","title":"Format Id"},"created_at":{"type":"integer","title":"Created At"},"rival_current_elo":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rival Current Elo"},"rival_current_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rival Current Rank"},"elo_gap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elo Gap"}},"type":"object","required":["id","rival_showdown_userid","format_id","created_at"],"title":"RivalItem"},"RivalsListResponse":{"properties":{"rivals":{"items":{"$ref":"#/components/schemas/RivalItem"},"type":"array","title":"Rivals"}},"type":"object","required":["rivals"],"title":"RivalsListResponse"},"SelectVariationRequest":{"properties":{"generation_id":{"type":"integer","title":"Generation Id"},"variation":{"type":"string","enum":["a","b"],"title":"Variation"}},"type":"object","required":["generation_id","variation"],"title":"SelectVariationRequest"},"SeriesBucket":{"properties":{"series":{"type":"string","title":"Series"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["series","count"],"title":"SeriesBucket"},"SetProducerFlagRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["enabled"],"title":"SetProducerFlagRequest"},"ShareTeamRequest":{"properties":{"format":{"type":"string","maxLength":50,"minLength":1,"title":"Format"},"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"showdown_text":{"type":"string","maxLength":20000,"minLength":1,"title":"Showdown Text"},"members":{"items":{"type":"string"},"type":"array","maxItems":6,"title":"Members"}},"type":"object","required":["format","showdown_text"],"title":"ShareTeamRequest","description":"Snapshot envoyé par le client pour créer un share.\n\nOn ne fait PAS confiance à l'id d'une team existante côté Box — le client\nenvoie directement les champs à afficher. Ça permet de partager :\n  - une team locale jamais synced avec le backend\n  - une team d'un user anonyme (pas de compte)\n  - une ancienne version d'une team que l'user a modifiée depuis"},"ShareTeamResponse":{"properties":{"token":{"type":"string","title":"Token"},"url":{"type":"string","title":"Url","description":"Relative path on the frontend, ex: /t/abc123"},"expires_at":{"type":"string","title":"Expires At","description":"ISO8601 UTC"}},"type":"object","required":["token","url","expires_at"],"title":"ShareTeamResponse"},"SharedTeamView":{"properties":{"token":{"type":"string","title":"Token"},"format":{"type":"string","title":"Format"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"showdown_text":{"type":"string","title":"Showdown Text"},"members":{"items":{"type":"string"},"type":"array","title":"Members"},"created_at":{"type":"string","title":"Created At"},"expires_at":{"type":"string","title":"Expires At"},"view_count":{"type":"integer","title":"View Count"}},"type":"object","required":["token","format","name","showdown_text","members","created_at","expires_at","view_count"],"title":"SharedTeamView","description":"Ce que le frontend reçoit pour rendre la page publique `/t/{token}`."},"ShowdownUsernamePatchRequest":{"properties":{"showdown_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Username"}},"type":"object","title":"ShowdownUsernamePatchRequest"},"ShowdownUsernamePatchResponse":{"properties":{"id":{"type":"string","title":"Id"},"showdown_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Username"}},"type":"object","required":["id"],"title":"ShowdownUsernamePatchResponse"},"ShowdownVerifyCheckResponse":{"properties":{"matched":{"type":"boolean","title":"Matched"},"reason":{"type":"string","title":"Reason"},"ps_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ps Status"},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified At"}},"type":"object","required":["matched","reason"],"title":"ShowdownVerifyCheckResponse"},"ShowdownVerifyStartRequest":{"properties":{"showdown_username":{"type":"string","title":"Showdown Username"}},"type":"object","required":["showdown_username"],"title":"ShowdownVerifyStartRequest"},"ShowdownVerifyStartResponse":{"properties":{"bot_name":{"type":"string","title":"Bot Name"},"code":{"type":"string","title":"Code"},"expires_at":{"type":"string","title":"Expires At"},"target_username":{"type":"string","title":"Target Username"}},"type":"object","required":["bot_name","code","expires_at","target_username"],"title":"ShowdownVerifyStartResponse"},"ShowdownVerifyStatusResponse":{"properties":{"showdown_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Username"},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified At"},"pending_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Target"},"pending_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Code"},"pending_code_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Code Expires At"}},"type":"object","title":"ShowdownVerifyStatusResponse"},"SignatureTeam":{"properties":{"id":{"type":"string","title":"Id"},"format":{"type":"string","title":"Format"},"data":{"type":"object","title":"Data"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","format","data","updated_at"],"title":"SignatureTeam"},"SignatureTeamsResponse":{"properties":{"teams":{"items":{"$ref":"#/components/schemas/SignatureTeam"},"type":"array","title":"Teams"}},"type":"object","required":["teams"],"title":"SignatureTeamsResponse"},"SmogonSet":{"properties":{"set_name":{"type":"string","title":"Set Name"},"item":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item"},"ability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ability"},"nature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nature"},"evs":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Evs"},"ivs":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Ivs"},"tera_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tera Type"},"moves":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Moves"},"source_url":{"type":"string","title":"Source Url"},"ingested_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingested At"}},"type":"object","required":["set_name","moves","source_url"],"title":"SmogonSet"},"SnapshotMeta":{"properties":{"annee":{"type":"integer","title":"Annee"},"mois":{"type":"integer","title":"Mois"},"elo_cutoff":{"type":"integer","title":"Elo Cutoff"}},"type":"object","required":["annee","mois","elo_cutoff"],"title":"SnapshotMeta"},"SpreadStat":{"properties":{"spread":{"type":"string","title":"Spread"},"usage":{"type":"number","title":"Usage"}},"type":"object","required":["spread","usage"],"title":"SpreadStat"},"StandingRow":{"properties":{"participant_id":{"type":"integer","title":"Participant Id"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"discriminator":{"type":"string","title":"Discriminator"},"showdown_pseudo":{"type":"string","title":"Showdown Pseudo"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"byes":{"type":"integer","title":"Byes"},"played":{"type":"integer","title":"Played"},"pending":{"type":"integer","title":"Pending"}},"type":"object","required":["participant_id","user_id","username","discriminator","showdown_pseudo","seed","wins","losses","byes","played","pending"],"title":"StandingRow"},"StandingsMon":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"item":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item"},"ability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ability"},"attacks":{"items":{"type":"string"},"type":"array","title":"Attacks"},"tera":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tera"}},"type":"object","title":"StandingsMon","description":"Un Pokémon dans une décklist Limitless. Tous les champs optionnels —\nLimitless n'impose pas que la team list soit complète."},"StandingsRecord":{"properties":{"wins":{"type":"integer","title":"Wins","default":0},"losses":{"type":"integer","title":"Losses","default":0},"ties":{"type":"integer","title":"Ties","default":0}},"type":"object","title":"StandingsRecord"},"StandingsRow":{"properties":{"placing":{"type":"integer","title":"Placing"},"player_name":{"type":"string","title":"Player Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"record":{"$ref":"#/components/schemas/StandingsRecord"},"dropped":{"type":"boolean","title":"Dropped","default":false},"decklist":{"items":{"$ref":"#/components/schemas/StandingsMon"},"type":"array","title":"Decklist"},"trainer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trainer Name"}},"type":"object","required":["placing","player_name","record"],"title":"StandingsRow"},"StartTournamentResponse":{"properties":{"tournament_id":{"type":"string","title":"Tournament Id"},"participants_count":{"type":"integer","title":"Participants Count"},"total_rounds":{"type":"integer","title":"Total Rounds"},"matches_created":{"type":"integer","title":"Matches Created"}},"type":"object","required":["tournament_id","participants_count","total_rounds","matches_created"],"title":"StartTournamentResponse"},"SyncPullResponse":{"properties":{"teams":{"items":{"$ref":"#/components/schemas/TeamRecord"},"type":"array","title":"Teams"},"replays":{"items":{"$ref":"#/components/schemas/ReplayRecord"},"type":"array","title":"Replays"},"server_time":{"type":"string","title":"Server Time","description":"ISO UTC — à stocker comme 'since' pour le prochain pull"}},"type":"object","required":["teams","replays","server_time"],"title":"SyncPullResponse","description":"Réponse à GET /api/box/sync?since=<iso>.\n\nRetourne toutes les rows (teams + replays) dont updated_at > since.\nInclut les tombstones (deleted_at != null) pour que les clients puissent\npropager les suppressions localement."},"SyncPushRequest":{"properties":{"teams":{"items":{"$ref":"#/components/schemas/TeamUpsert"},"type":"array","title":"Teams"},"replays":{"items":{"$ref":"#/components/schemas/ReplayUpsert"},"type":"array","title":"Replays"}},"type":"object","title":"SyncPushRequest","description":"Payload pour POST /api/box/sync.\n\nUpserts en bulk. Les ids sont matchés : id existant → UPDATE, sinon INSERT.\nPour supprimer, utiliser DELETE granulaire."},"SyncPushResponse":{"properties":{"teams_upserted":{"type":"integer","title":"Teams Upserted"},"replays_upserted":{"type":"integer","title":"Replays Upserted"},"replays_rejected":{"items":{"$ref":"#/components/schemas/ReplayConflict"},"type":"array","title":"Replays Rejected"},"server_time":{"type":"string","title":"Server Time"}},"type":"object","required":["teams_upserted","replays_upserted","server_time"],"title":"SyncPushResponse"},"TeamMemberSummary":{"properties":{"pokemon_name":{"type":"string","title":"Pokemon Name"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"},"type1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type1"},"type2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type2"},"usage_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Usage Rate"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"found_in_meta":{"type":"boolean","title":"Found In Meta","default":true}},"type":"object","required":["pokemon_name"],"title":"TeamMemberSummary","description":"Lightweight summary of a single Pokémon in a team-vs-team context."},"TeamRecord":{"properties":{"id":{"type":"string","title":"Id"},"format":{"type":"string","title":"Format"},"data":{"type":"object","title":"Data"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted At"},"is_signature":{"type":"boolean","title":"Is Signature","default":false}},"type":"object","required":["id","format","data","created_at","updated_at"],"title":"TeamRecord","description":"Team row tel que renvoyé par le serveur (avec timestamps)."},"TeamUpsert":{"properties":{"id":{"type":"string","maxLength":64,"minLength":1,"title":"Id"},"format":{"type":"string","maxLength":50,"minLength":1,"title":"Format"},"data":{"type":"object","title":"Data","description":"Full team blob (client-defined shape)"}},"type":"object","required":["id","format","data"],"title":"TeamUpsert","description":"Payload d'un team à créer ou mettre à jour.\n\n`id` est toujours fourni par le client (UUID).\n`format` est extrait pour requêtes analytics futures.\n`data` est un dict opaque (shape du BoxTeam côté frontend)."},"TeamVsTeamRequest":{"properties":{"team_a":{"items":{"type":"string"},"type":"array","title":"Team A"},"team_b":{"items":{"type":"string"},"type":"array","title":"Team B"},"format_id":{"type":"string","title":"Format Id"},"elo_cutoff":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elo Cutoff"}},"type":"object","required":["team_a","team_b","format_id"],"title":"TeamVsTeamRequest"},"TeamVsTeamResponse":{"properties":{"format_id":{"type":"string","title":"Format Id"},"elo_cutoff":{"type":"integer","title":"Elo Cutoff"},"team_a":{"items":{"$ref":"#/components/schemas/TeamMemberSummary"},"type":"array","title":"Team A"},"team_b":{"items":{"$ref":"#/components/schemas/TeamMemberSummary"},"type":"array","title":"Team B"},"matrix":{"items":{"items":{"$ref":"#/components/schemas/MatchupCell"},"type":"array"},"type":"array","title":"Matrix"},"a_score":{"type":"number","title":"A Score"},"b_score":{"type":"number","title":"B Score"},"verdict":{"type":"string","title":"Verdict"}},"type":"object","required":["format_id","elo_cutoff","team_a","team_b","matrix","a_score","b_score","verdict"],"title":"TeamVsTeamResponse"},"TeammateStat":{"properties":{"pokemon_name":{"type":"string","title":"Pokemon Name"},"usage":{"type":"number","title":"Usage"},"sprite_url":{"type":"string","title":"Sprite Url"}},"type":"object","required":["pokemon_name","usage","sprite_url"],"title":"TeammateStat"},"TeraTypeStat":{"properties":{"name":{"type":"string","title":"Name"},"usage":{"type":"number","title":"Usage"}},"type":"object","required":["name","usage"],"title":"TeraTypeStat"},"Top10HistoryResponse":{"properties":{"format_id":{"type":"string","title":"Format Id"},"period_seconds":{"type":"integer","title":"Period Seconds"},"players":{"items":{"$ref":"#/components/schemas/PlayerSeries"},"type":"array","title":"Players"}},"type":"object","required":["format_id","period_seconds","players"],"title":"Top10HistoryResponse"},"TournamentCreate":{"properties":{"name":{"type":"string","maxLength":80,"minLength":3,"title":"Name"},"slug":{"type":"string","maxLength":48,"minLength":3,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","title":"Slug"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"format_id":{"type":"string","maxLength":50,"minLength":2,"pattern":"^[a-z0-9]+$","title":"Format Id"},"custom_format_label":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Custom Format Label"},"visibility":{"type":"string","enum":["private","public"],"title":"Visibility","default":"private"},"bracket_type":{"type":"string","enum":["single_elim","double_elim","round_robin","swiss"],"title":"Bracket Type","default":"single_elim"},"team_lock":{"type":"boolean","title":"Team Lock","default":false},"max_players":{"anyOf":[{"type":"integer","maximum":512,"minimum":2},{"type":"null"}],"title":"Max Players"},"registration_open_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Registration Open At"},"registration_close_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Registration Close At"},"start_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start At"},"match_timer_minutes":{"anyOf":[{"type":"integer","maximum":1440,"minimum":5},{"type":"null"}],"title":"Match Timer Minutes"},"discord_webhook_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Discord Webhook Url"}},"type":"object","required":["name","slug","format_id"],"title":"TournamentCreate"},"TournamentHost":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"discriminator":{"type":"string","title":"Discriminator"}},"type":"object","required":["id","username","discriminator"],"title":"TournamentHost"},"TournamentListResponse":{"properties":{"tournaments":{"items":{"$ref":"#/components/schemas/TournamentResponse"},"type":"array","title":"Tournaments"}},"type":"object","required":["tournaments"],"title":"TournamentListResponse"},"TournamentResponse":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"format_id":{"type":"string","title":"Format Id"},"custom_format_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Format Label"},"visibility":{"type":"string","enum":["private","public"],"title":"Visibility"},"status":{"type":"string","enum":["draft","registration","ongoing","finished","cancelled"],"title":"Status"},"bracket_type":{"type":"string","enum":["single_elim","double_elim","round_robin","swiss"],"title":"Bracket Type"},"team_lock":{"type":"boolean","title":"Team Lock"},"max_players":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Players"},"registration_open_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Registration Open At"},"registration_close_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Registration Close At"},"start_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start At"},"match_timer_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Match Timer Minutes"},"invite_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Code"},"check_in_required":{"type":"boolean","title":"Check In Required"},"discord_webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Webhook Url"},"host":{"$ref":"#/components/schemas/TournamentHost"},"participants_count":{"type":"integer","title":"Participants Count"},"created_at":{"type":"integer","title":"Created At"},"updated_at":{"type":"integer","title":"Updated At"}},"type":"object","required":["id","slug","name","description","format_id","visibility","status","bracket_type","team_lock","max_players","registration_open_at","registration_close_at","start_at","match_timer_minutes","invite_code","check_in_required","host","participants_count","created_at","updated_at"],"title":"TournamentResponse"},"TournamentThread":{"properties":{"title":{"type":"string","title":"Title"},"thread_url":{"type":"string","title":"Thread Url"},"phase_kind":{"type":"string","title":"Phase Kind"},"phase_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase Label"},"sort_order":{"type":"integer","title":"Sort Order","default":50},"thread_created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Created At"}},"type":"object","required":["title","thread_url","phase_kind"],"title":"TournamentThread","description":"Thread Smogon T1/T2 rattaché à un tournoi (mig 088). Affiché en\nsection \"Rounds & Phases\" sur la page de détail tournament."},"TournamentUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80,"minLength":3},{"type":"null"}],"title":"Name"},"slug":{"anyOf":[{"type":"string","maxLength":48,"minLength":3,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"visibility":{"anyOf":[{"type":"string","enum":["private","public"]},{"type":"null"}],"title":"Visibility"},"bracket_type":{"anyOf":[{"type":"string","enum":["single_elim","double_elim","round_robin","swiss"]},{"type":"null"}],"title":"Bracket Type"},"team_lock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Team Lock"},"max_players":{"anyOf":[{"type":"integer","maximum":512,"minimum":2},{"type":"null"}],"title":"Max Players"},"registration_open_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Registration Open At"},"registration_close_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Registration Close At"},"start_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start At"},"match_timer_minutes":{"anyOf":[{"type":"integer","maximum":1440,"minimum":5},{"type":"null"}],"title":"Match Timer Minutes"},"discord_webhook_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Discord Webhook Url"}},"type":"object","title":"TournamentUpdate","description":"Tous les champs optionnels — PATCH partiel. Seul le host peut éditer,\nuniquement tant que status ∈ {draft, registration}."},"TrackingOptInBody":{"properties":{"showdown_username":{"type":"string","title":"Showdown Username"}},"type":"object","required":["showdown_username"],"title":"TrackingOptInBody"},"TrackingStatus":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"showdown_userid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Userid"},"showdown_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Showdown Display"},"opted_in_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opted In At"},"last_synced_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Synced At"},"last_sync_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sync Status"}},"type":"object","required":["enabled"],"title":"TrackingStatus","description":"État de tracking du user courant. `enabled=false` et les autres champs\nà None → pas encore opt-in."},"Trophy":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"title_key":{"type":"string","title":"Title Key"},"payload":{"type":"object","title":"Payload"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"earned_at":{"type":"integer","title":"Earned At"}},"type":"object","required":["id","type","title_key","payload","earned_at"],"title":"Trophy"},"TrophyCaseResponse":{"properties":{"trophies":{"items":{"$ref":"#/components/schemas/Trophy"},"type":"array","title":"Trophies"}},"type":"object","required":["trophies"],"title":"TrophyCaseResponse"},"UnlockRequest":{"properties":{"claim":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Claim"}},"type":"object","title":"UnlockRequest"},"UnreadCountResponse":{"properties":{"public":{"type":"integer","title":"Public"},"personal":{"type":"integer","title":"Personal"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["public","personal","total"],"title":"UnreadCountResponse"},"UserBackgroundsResponse":{"properties":{"unlocked_ids":{"items":{"type":"integer"},"type":"array","title":"Unlocked Ids"},"active_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Id"}},"type":"object","required":["unlocked_ids"],"title":"UserBackgroundsResponse"},"UserEloHistoryResponse":{"properties":{"showdown_userid":{"type":"string","title":"Showdown Userid"},"period_seconds":{"type":"integer","title":"Period Seconds"},"formats":{"items":{"$ref":"#/components/schemas/UserFormatSeries"},"type":"array","title":"Formats"}},"type":"object","required":["showdown_userid","period_seconds","formats"],"title":"UserEloHistoryResponse"},"UserEloPoint":{"properties":{"t":{"type":"integer","title":"T"},"elo":{"type":"number","title":"Elo"},"gxe":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gxe"},"w":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"W"},"l":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"L"}},"type":"object","required":["t","elo"],"title":"UserEloPoint"},"UserFormatSeries":{"properties":{"format_id":{"type":"string","title":"Format Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"generation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation"},"points":{"items":{"$ref":"#/components/schemas/UserEloPoint"},"type":"array","title":"Points"}},"type":"object","required":["format_id","points"],"title":"UserFormatSeries"},"UserPayload":{"properties":{"id":{"type":"string","title":"Id"},"provider":{"type":"string","title":"Provider"},"provider_id":{"type":"string","title":"Provider Id"},"username":{"type":"string","title":"Username"},"discriminator":{"type":"string","title":"Discriminator","default":""},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","provider","provider_id","username","created_at","updated_at"],"title":"UserPayload"},"UserSpriteResponse":{"properties":{"sprite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Url"},"sprite_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Type"},"sprite_artist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Artist"},"sprite_artist2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sprite Artist2"},"sprite_source_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sprite Source Generation Id"},"active_background_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Background Id"},"active_color_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Color Id"},"credits_balance":{"type":"integer","title":"Credits Balance"}},"type":"object","required":["credits_balance"],"title":"UserSpriteResponse"},"UserSyncRequest":{"properties":{"provider":{"type":"string","title":"Provider"},"provider_id":{"type":"string","title":"Provider Id"},"username":{"type":"string","title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"client":{"type":"string","enum":["web","mobile"],"title":"Client","default":"web"}},"type":"object","required":["provider","provider_id","username"],"title":"UserSyncRequest"},"UserSyncResponse":{"properties":{"user":{"$ref":"#/components/schemas/UserPayload"},"access_token":{"type":"string","title":"Access Token"},"expires_at":{"type":"integer","title":"Expires At"},"token_type":{"type":"string","const":"Bearer","title":"Token Type","default":"Bearer"},"is_new_user":{"type":"boolean","title":"Is New User","default":false}},"type":"object","required":["user","access_token","expires_at"],"title":"UserSyncResponse","description":"Retour de /api/auth/sync.\n\nLe frontend DOIT stocker `access_token` et l'envoyer en header\n`Authorization: Bearer <token>` sur toutes les requêtes suivantes.\n\n`is_new_user` est `True` quand cet appel a INSÉRÉ une nouvelle ligne\n`users` (= signup), `False` pour un UPDATE (= ré-login). Le frontend\ns'en sert pour déclencher l'onboarding une seule fois après création\nde compte. Source de vérité côté backend pour éviter de dépendre de\nlocalStorage (qui est par-browser donc unreliable au cross-device)."},"UsernameUpdateRequest":{"properties":{"username":{"type":"string","maxLength":32,"minLength":2,"title":"Username"}},"type":"object","required":["username"],"title":"UsernameUpdateRequest","description":"PATCH /api/auth/me/username — changer le pseudo (garde le discriminator)."},"UsernameUpdateResponse":{"properties":{"username":{"type":"string","title":"Username"},"discriminator":{"type":"string","title":"Discriminator"}},"type":"object","required":["username","discriminator"],"title":"UsernameUpdateResponse"},"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"},"VisibilityPatchRequest":{"properties":{"public_profile":{"type":"boolean","title":"Public Profile"}},"type":"object","required":["public_profile"],"title":"VisibilityPatchRequest"},"VisibilityPatchResponse":{"properties":{"id":{"type":"string","title":"Id"},"public_profile":{"type":"boolean","title":"Public Profile"}},"type":"object","required":["id","public_profile"],"title":"VisibilityPatchResponse"},"WatchlistCreateRequest":{"properties":{"target_type":{"type":"string","enum":["pokemon","format"],"title":"Target Type"},"target_id":{"type":"string","maxLength":100,"minLength":1,"title":"Target Id"},"format_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Format Id"},"trigger_type":{"type":"string","maxLength":40,"minLength":1,"title":"Trigger Type"},"threshold":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Threshold"}},"type":"object","required":["target_type","target_id","trigger_type"],"title":"WatchlistCreateRequest"},"WatchlistEntry":{"properties":{"id":{"type":"integer","title":"Id"},"target_type":{"type":"string","enum":["pokemon","format"],"title":"Target Type"},"target_id":{"type":"string","title":"Target Id"},"format_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Id"},"trigger_type":{"type":"string","title":"Trigger Type"},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","target_type","target_id","trigger_type","created_at"],"title":"WatchlistEntry"},"WatchlistListResponse":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/WatchlistEntry"},"type":"array","title":"Entries"}},"type":"object","required":["entries"],"title":"WatchlistListResponse"},"routers__timeline_standings__StandingsResponse":{"properties":{"tournament_id":{"type":"string","title":"Tournament Id"},"total_players":{"type":"integer","title":"Total Players"},"has_decklists":{"type":"boolean","title":"Has Decklists"},"standings":{"items":{"$ref":"#/components/schemas/StandingsRow"},"type":"array","title":"Standings"}},"type":"object","required":["tournament_id","total_players","has_decklists","standings"],"title":"StandingsResponse"},"schemas__custom_sprite__CheckoutResponse":{"properties":{"url":{"type":"string","title":"Url"},"stub":{"type":"boolean","title":"Stub"},"credits_granted":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Granted"}},"type":"object","required":["url","stub"],"title":"CheckoutResponse"},"schemas__subscription__CheckoutResponse":{"properties":{"url":{"type":"string","title":"Url"},"stub":{"type":"boolean","title":"Stub","default":false}},"type":"object","required":["url"],"title":"CheckoutResponse"},"schemas__tournament__StandingsResponse":{"properties":{"standings":{"items":{"$ref":"#/components/schemas/StandingRow"},"type":"array","title":"Standings"},"current_round":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Round"},"total_rounds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Rounds"}},"type":"object","required":["standings"],"title":"StandingsResponse"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Logged-in user session token, minted by the website's OAuth flow. Required for User-tier endpoints."},"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Personal API key (`pk_live_...`), generated from /account/settings. Optional for Public endpoints (lifts the per-IP rate-limit ceiling to a per-user one). Required only when listed alongside bearerAuth."}}},"servers":[{"url":"https://pokekipe.com","description":"Production"}]}