API de marque
Sommaire — 11 sections
Version 1.0.0 — 2026-10-21 · Base
https://charte.tero.be/brand/· Méthode GET, statique, sans authentification · Référence regles.html 1.1.0 gagne en cas d'écart.
La charte décrit la marque ; cette API la rend exécutable. Les mêmes valeurs que les pages du site — couleurs, contrastes, typographie, logos, endossement, règles, 28 marques — dans des fichiers qu'un programme, un site ou un agent lit sans interpréter. Aucune valeur n'est inventée : chaque fichier cite ses sources, et une information absente s'écrit [?].
À quoi ça sert
| Qui | Lit | Produit |
|---|---|---|
| Koen, collaborateur IA de Tero Digital | llms.txt → llms-full.txt → la marque dans brands.json → tokens.json → logos.json | une page, un visuel, un texte, un JSON-LD conformes, sans deviner ; [?] pour ce qui manque |
| Sites du groupe (tero.be, un domaine par marque) | tokens.css en feuille de style, brands.json pour la mention d'endossement et le pilier, logos.json pour le fichier exact | le thème de la marque par data-brand="<id>", le pied de page d'endossement, l'Organization avec parentOrganization |
| Outils IA externes (moteurs de réponse, agents de navigation) | llms.txt, llms-full.txt, openapi.json | des réponses avec les faits mesurés de la marque : noms exacts, piliers, adresses relevées |
| Conformité et Atelier (pages de ce site) | brands.json, tokens.json | la mesure de l'écart des 24 domaines ; signatures, avatars, lockups textuels fabriqués depuis les jetons |
Tableau plus large que l’écran : faites défiler horizontalement.
Les fichiers
| Ressource | Contenu | Type |
|---|---|---|
/brand/brands.json | le groupe, les 3 piliers, les 28 marques (nom exact, pilier, relation d'endossement, mention à afficher, domaines, type schema.org, adresse et téléphone relevés, accent en trois variables, logos, pages), Koen en fonctionInterne | application/json |
/brand/tokens.json | jetons DTCG : neutres, sept couleurs, paires de contraste WCAG 2.1 avec verdict, piliers, accents des 28 marques, typographie (familles, graisses livrées, rampe, interlignages, lettrages), espace, rayons, ombre, durées, focus, zone de protection et tailles minimales des logos | application/json |
/brand/tokens.css | les mêmes jetons en variables CSS : clair et sombre, [data-pillar], un bloc [data-brand] par marque, état de focus A3 | text/css |
/brand/logos.json | registre des fichiers de logo réellement servis : tero (mot-symbole, monogramme, déclinaisons, icônes), Koen (5 fichiers), marques ; viewBox, ratio, octets, fond, usage, interdits | application/json |
/brand/rules.json | les règles de regles.html 1.1.0 une par objet : id, section, etiquette (MESURÉ · RÈGLE · À VALIDER CLIENT), enonce | application/json |
/brand/openapi.json | description OpenAPI 3.1 de ces ressources | application/json |
/llms.txt · /llms-full.txt | la carte du site pour les agents · la charte entière en Markdown | text/plain |
/brand/README.md | le mode d'emploi en Markdown | text/markdown |
Tableau plus large que l’écran : faites défiler horizontalement.
brands.json
Une entrée par marque ; le groupe et les trois piliers à part ; Koen sous fonctionInterne, jamais dans marques[]. La relation d'endossement suit le modèle à quatre relations ; la mention est celle de la page de marque. Extrait réel (Immorun) :
{
"version": "1.0.0",
"date": "2026-10-21",
"marques": [
{
"id": "immorun",
"nom": "Immorun",
"alias": [],
"pilier": {
"id": "sport-events",
"nom": "Tero Sport Events"
},
"type": "Course entreprise",
"endossement": {
"relation": "co-marque-encadree",
"label": "Co-marque encadrée",
"forme": "Deux logos, filet vertical, hauteurs optiques égales, ordre fixé par contrat. Textuel tant que le lockup n'est pas dessiné.",
"mention": "un événement du groupe Tero + lien tero.be (en-tête ou pied de page, jamais les deux) ; lockup Immorun × IMMOBEL",
"statut": "RÈGLE",
"source": "docs/koen/ENDOSSEMENT.md (= regles.html § 1.4) (Immorun × IMMOBEL) ; statut d'IMMOBEL : À VALIDER CLIENT"
},
"coMarque": {
"partenaire": "IMMOBEL",
"regime": "co-marque d'événement — lockup encadré",
"statut": "À VALIDER CLIENT (sponsor, coproducteur ou propriétaire)"
},
"domaines": [
{
"hote": "immorun.be",
"role": "édition Belgique (lang en-GB)",
"source": "aeo-2026-10-21/fondations/raw/<domaine>.json (relevé UTC 2026-10-21)"
},
{
"hote": "immorun.lu",
"role": "édition Luxembourg",
"source": "aeo-2026-10-21/fondations/raw/<domaine>.json (relevé UTC 2026-10-21)"
},
{
"hote": "registration.sportero.be",
"role": "inscriptions (robots Disallow: /, contenu JS)",
"source": "aeo-2026-10-21/fondations/raw/<domaine>.json (relevé UTC 2026-10-21)"
}
],
"schemaOrg": {
"type": "SportsEvent",
"alternatif": "Organization (marque) ; une SportsEvent par édition",
…
tokens.json et tokens.css
tokens.json reprend intégralement harness/tokens.json 1.0.0 (format DTCG) et l'étend : paires de contraste calculées avec verdict, trois piliers, accents des 28 marques, polices livrées, focus (arbitrage A3), logos. Le fichier harness pointe désormais ici. Extrait réel :
{
"color": {
"primitive": {
"teal": {
"$value": "#007864",
"$description": "Accent institutionnel. 5,43:1 sur blanc. 2,97:1 sur #212121 : jamais en texte sur fond profond."
}
},
"contrast": {
"texte": [
{
"fg": "black",
"fgHex": "#000000",
"bg": "white",
"bgHex": "#FFFFFF",
"ratio": 21.0,
"aaTexte": true,
"aaGrandTexteUI": true,
"verdict": "AAA texte"
},
{
"fg": "black",
"fgHex": "#000000",
"bg": "surface",
"bgHex": "#F6F4F4",
"ratio": 19.17,
"aaTexte": true,
"aaGrandTexteUI": true,
"verdict": "AAA texte"
}
]
}
},
"theme": {
"brand": {
"tero-padel-club": {
"accent": {
"$type": "color",
"$value": "#FF2E82"
},
"accentOn": {
"$type": "color",
"$value": "#000000",
"$description": "5.97:1 sur l'aplat"
},
"accentText": {
"$type": "color",
"$value": null,
"$description": "NON FOURNI — repli : liens en encre soulignés"
},
"$description": "[MESURÉ] magenta signature, 3,52:1 sur blanc : aplats, filets, pastilles — jamais du texte ; accentText NON FOURNI → liens en encre soulignés ; second accent lime #E9F44E, aplat uniquement (regles.html 1.1.0 § 2.5)"
}
}
},
"focus": {
"ringWidth": {
"$type": "dimension",
"$value": {
"value": 2,
"unit": "px"
…
tokens.css est généré depuis le JSON ; on ne l'édite pas à la main. Extrait réel :
Noms alignés sur assets/css/charte.css (--bg, --fg, --accent…) et sur regles.html § 2 (--tero-*). */
:root {
/* neutres [MESURÉ] */
--tero-black: #000000;
--tero-white: #ffffff;
--tero-surface: #f6f4f4;
--tero-line: #d9d9d9;
--tero-line-soft: #e5e6e5;
--tero-ink-soft: #323232;
--tero-ink-deep: #212121;
--tero-muted: #b9b9b9;
--tero-ink-muted: #5f5f5f;
…
[data-brand="tero-studio"] { --brand-accent: #7c8f7a; --brand-accent-on: #000000; /* accent-text non fourni : liens en encre soulignés */ }
[data-brand="immorun"] { --brand-accent: #263062; --brand-accent-on: #ffffff; --brand-accent-text: #263062; }
logos.json
Le registre ne liste que des fichiers présents sur le serveur, mesurés sur disque (viewBox, ratio, octets). Une marque sans fichier porte statut : "[?] à documenter" — on ne fabrique pas de logo. Extrait réel :
{
"version": "1.0.0",
"tero": {
"motSymbole": {
"viewBox": "0 0 100 40",
"ratio": 2.535,
"tailleMin": {
"px": 88,
"mm": 25,
"traitLePlusFinPx": 5.7
},
"margeInterne": 0,
"zoneDeProtection": {
"X": "diamètre de l'anneau du o = 0,265 × largeur du mot-symbole",
"min": "0,5 X",
"conseille": "1 X",
"note": "la formule « hauteur du T » est abandonnée : le mot-symbole n'a aucune capitale"
},
"fichiers": [
{
"fichier": "/assets/logo/tero-logo-noir.svg",
"octets": 8063,
"format": "svg",
"viewBox": "0 0 100 40",
"ratio": 2.5,
"unites": {
"largeur": 100.0,
"hauteur": 40.0
},
"variante": "noir",
"fond": "fond clair (défaut)",
"usage": "mot-symbole officiel, 5 tracés",
"interdits": [
"redessiner, recolorer, recomposer, rogner",
"déformation horizontale ou écrasement vertical",
"teinte hors palette",
"ombre, contour, dégradé, animation",
"fond chargé sans voile",
"archives rasterisées 2023 (logo-tero-white.svg, logo-blue.svg, logo-green.svg, logo_yellow.svg)",
"le noir sur fond sombre",
"le monogramme comme Organization.logo",
"variante « sans barre » (n'existe pas)"
]
}
]
}
},
"koen": {
…
rules.json
Les règles de regles.html 1.1.0, découpées une par objet pour qu'un vérificateur puisse citer l'identifiant exact (2.3-2, 12.4-1…). Extrait réel :
{
"$schema": "https://charte.tero.be/brand/openapi.json#/components/schemas/Rules",
"version": "1.0.0",
"date": "2026-10-21",
"source": "regles.html 1.1.0 — 21 octobre 2026 (1.0.0 : 15 octobre 2026) · auteur clixite · https://charte.tero.be/regles.html. Les énoncés sont repris du texte opposable ; en cas d'écart, regles.html gagne.",
"etiquettes": {
"MESURÉ": "Relevé sur tero.be en production, valeur exacte, source citée. Opposable, on ne l'arrondit pas.",
"RÈGLE": "Décision de système prise pour rendre le groupe cohérent. Opposable, on ne la contourne pas sans arbitrage.",
"À VALIDER CLIENT": "Question ouverte. Le client tranche ; l'agent ne devine jamais."
},
"primauté": [
"La marque existe déjà. On ne l'invente pas, on ne l'interprète pas, on ne la « modernise » pas. Si une information manque, on demande au client — on ne devine jamais.",
"On mesure, on ne suppose pas. Toute affirmation porte une mesure.",
"Le groupe ne se dissout pas dans ses sous-marques. Toute production affiche l'appartenance au groupe Tero et respecte la hiérarchie maison mère → pilier → marque."
],
"sections": [
{
"id": "1",
"titre": "L'entité et l'architecture de marque",
"ancre": "/regles.html#1-l-entite-et-l-architecture-de-marque"
},
{
"id": "1.4",
"titre": "Endossement — maison mère → pilier → marque (quatre relations)",
"ancre": "/regles.html#endossement"
},
{
"id": "2",
"titre": "Couleurs",
"ancre": "/regles.html#2-couleurs"
…
llms.txt et llms-full.txt
/llms.txt est la carte : ce que le site contient et dans quel ordre le lire. /llms-full.txt est la charte entière en Markdown (environ 9 000 tokens), avec les 28 fiches marques générées depuis brands.json. Convention llms.txt (largement adoptée, pas un standard W3C). Extrait réel :
# Charte TERO GROUP — charte.tero.be
> Brand book en ligne du groupe Tero (tero.be) : la référence unique de la marque, édition 2026.6, règles opposables 1.1.0 du 21 octobre 2026. Ce site documente la marque, il ne vend rien. Il décrit la maison mère Tero Group, ses trois piliers (Tero Hospitality · Tero Leisure · Tero Sport Events), ses 28 marques et Koen, le collaborateur IA interne. Tout y est mesuré : couleurs, contrastes WCAG, typographie, logo, endossement, vocabulaire. Langue : français (FR). Les sites commerciaux sont ailleurs : https://tero.be/ (groupe), un domaine par marque.
## Pour un agent : lire d'abord
- [llms-full.txt](https://charte.tero.be/llms-full.txt): la charte entière en Markdown (règles, jetons, 28 fiches marques, Koen) — ~9 000 tokens, suffit pour produire sans ouvrir une page
- [brand/brands.json](https://charte.tero.be/brand/brands.json): les 28 marques, le groupe, les 3 piliers, Koen : nom exact, pilier, relation d'endossement, mention à afficher, domaines, type schema.org, adresse/téléphone relevés, accent (3 variables), logos
- [brand/tokens.json](https://charte.tero.be/brand/tokens.json): jetons DTCG : neutres, 7 couleurs, paires de contraste WCAG 2.1 avec verdict, typographie, rayons, durées, focus, tailles minimales des logos
- [brand/tokens.css](https://charte.tero.be/brand/tokens.css): les mêmes jetons en variables CSS, mode clair/sombre, un bloc `[data-brand]` par marque
- [brand/logos.json](https://charte.tero.be/brand/logos.json): registre des fichiers de logo réellement servis (tero, monogramme, Koen, marques) : viewBox, ratio, usage, interdits
- [brand/rules.json](https://charte.tero.be/brand/rules.json): les règles opposables de regles.html 1.1.0, une par objet : id, étiquette [MESURÉ] / [RÈGLE] / [À VALIDER CLIENT], énoncé, section
- [brand/openapi.json](https://charte.tero.be/brand/openapi.json): description OpenAPI 3.1 de ces fichiers (ressources GET statiques, pas d'authentification)
- [api.html](https://charte.tero.be/api.html): documentation humaine de l'API de marque, exemples fetch / Python / prompt d'agent, explorateur de marques
…
Exemples d'usage
JavaScript (navigateur ou Node 18+)
const brands = await (await fetch("https://charte.tero.be/brand/brands.json")).json();
const m = brands.marques.find(b => b.id === "teroir");
console.log(m.nom, m.pilier.nom, m.endossement.mention, m.accent.accent);
// thème : <html data-brand="teroir"> + <link rel="stylesheet" href="https://charte.tero.be/brand/tokens.css">
Python 3
import json, urllib.request
tokens = json.load(urllib.request.urlopen("https://charte.tero.be/brand/tokens.json"))
teal = tokens["color"]["primitive"]["teal"]["$value"]
pairs = [p for p in tokens["color"]["contrast"]["texte"] if p["fg"] == "teal"]
for p in pairs:
print(p["bg"], p["ratio"], p["verdict"])
Prompt d'agent
Lis https://charte.tero.be/llms.txt puis https://charte.tero.be/llms-full.txt avant de produire.
Pour la marque <id>, charge https://charte.tero.be/brand/brands.json et n'utilise que
son accent (trois variables), sa mention d'endossement et le fichier de logo listé dans
https://charte.tero.be/brand/logos.json. Chaque couple texte/fond doit figurer dans
tokens.json → color.contrast avec aaTexte = true. Toute donnée absente s'écrit [?].
Koen n'apparaît nulle part, sauf au colophon.
Pied de page d'endossement (HTML)
<p class="endossement">Un lieu du groupe <a href="https://tero.be/">Tero</a> — tero.be</p>
<!-- la mention exacte vient de brands.json → marques[].endossement.mention -->
Versionnage
- Chaque fichier porte
version,dateetsource(tokens.json: dans$extensions.org.tero.brand). - Sémantique : MAJOR structure incompatible · MINOR champ ou entrée ajoutés · PATCH correction de valeur. Les URL ne changent jamais ; un consommateur refuse une MAJOR qu'il ne connaît pas.
- Cadence : revue à chaque arbitrage client (un
À VALIDER CLIENTlevé = une PATCH ou une MINOR), à chaque relevé AEO, au minimum chaque trimestre. La date de relevé des faits (adresses, téléphones) est le 21 octobre 2026. - Historique : 1.0.0 — 21 octobre 2026, première publication : 28 marques, 3 piliers, Koen, règles 1.1.0.
Explorateur
La fiche est rendue depuis brand/brands.json et brand/logos.json, chargés par fetch relatif : ce que vous voyez est ce que l'API sert. Chaque jeton se copie en un clic.
Lecture de brand/brands.json…
Limites
- Les adresses, téléphones et dates d'édition ne couvrent que ce que l'audit AEO du 21 octobre 2026 a relevé sur les 24 domaines ; le reste est
[?]. Aucun NAP n'a été complété de mémoire. - Six relations d'endossement sont marquées
À VALIDER CLIENT(Hôtel La Malle Poste, Tero Padel Academy, Tero Trail, Bouwrun, Lime, Brussels Premier Padel) et le statut des partenaires (IMMOBEL, FRANKI, LIXON, Lotto/CBC, Justine Henin) attend un contrat. - Onze marques n'ont aucun fichier de logo au registre et Tero Lieux n'a qu'une plaque de présentation ; les lockups d'endossement n'existent pas encore : l'endossement reste textuel. Sept marques ont une adresse de rue relevée, six un téléphone.
rules.jsoncouvre les sections 1 à 10, 12, 14 et 21 de regles.html ; performance, contenu, langues, médias et QA ne sont pas encore découpés.- Les trois piliers suivent regles.html 1.1.0 ;
harness/tokens.json1.0.0 portait la fusion Leisure + Sport Events, qui reste à valider.