365scores n'a pas d'API publique. Les endpoints utilisés
(data.365scores.com/web/standings/,
webws.365scores.com/web/game/,
/web/games/results/,
/web/games/fixtures/)
ont été inspectés au devtools puis stabilisés derrière
SCORES365_HEADERS
— sans X-Domain: fr,
Referer
ligue-1-35 et User-Agent
réaliste, c'est HTTP 403.
IDs critiques : Ligue 1 = compétition 35,
OL = competitorId=465
côté 365scores et teamId=523
côté football-data.org. Le backend remappe 465 → 523 en sortie pour rester compatible
avec l'historique frontend.
Standings — défense en profondeur. 365scores publie déjà l'ordre LFP
officiel (différence générale → buts marqués → face-à-face), mais
standings.service.ts
re-trie localement après fetch, en cas de changement de format upstream. Pas de H2H
local reconstruit depuis football-data : déjà essayé, ne match jamais ligue1.com.
Round-complete check sur les snapshots
season-rankings.json :
la mise à jour ne se fait que si
MIN(played) === MAX(played)
(journée complète pour toutes les équipes), sinon on capture des positions instables
mid-journée.
Pour les logos clubs, l'app combine deux sources : Wikipedia FR via
/api/wiki-image?q=
(avec mapping statique ID → full wiki name pour les noms ambigus type "Reims" / "Brest"
qui retournent la ville plutôt que le club), et le CDN 365scores
(imagecache.365scores.com/.../Competitors/<id>)
pour les popups de la carte L1.