API de marque

Sommaire — 11 sections
  1. 01À quoi ça sert
  2. 02Les fichiers
  3. 03brands.json
  4. 04tokens.json et tokens.css
  5. 05logos.json
  6. 06rules.json
  7. 07llms.txt et llms-full.txt
  8. 08Exemples d'usage
  9. 09Versionnage
  10. 10Explorateur
  11. 11Limites

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 [?].

28marques, trois piliers, un groupe
128paires de contraste WCAG 2.1 calculées
123fichiers de logo au registre, vérifiés sur disque
110règles opposables structurées

À quoi ça sert

Consommateurs de l'API de marque
QuiLitProduit
Koen, collaborateur IA de Tero Digitalllms.txt → llms-full.txt → la marque dans brands.json → tokens.json → logos.jsonune 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 exactle 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.jsondes 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.jsonla 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

Fichiers de l'API de marque
RessourceContenuType
/brand/brands.jsonle 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 fonctionInterneapplication/json
/brand/tokens.jsonjetons 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 logosapplication/json
/brand/tokens.cssles mêmes jetons en variables CSS : clair et sombre, [data-pillar], un bloc [data-brand] par marque, état de focus A3text/css
/brand/logos.jsonregistre des fichiers de logo réellement servis : tero (mot-symbole, monogramme, déclinaisons, icônes), Koen (5 fichiers), marques ; viewBox, ratio, octets, fond, usage, interditsapplication/json
/brand/rules.jsonles règles de regles.html 1.1.0 une par objet : id, section, etiquette (MESURÉ · RÈGLE · À VALIDER CLIENT), enonceapplication/json
/brand/openapi.jsondescription OpenAPI 3.1 de ces ressourcesapplication/json
/llms.txt · /llms-full.txtla carte du site pour les agents · la charte entière en Markdowntext/plain
/brand/README.mdle mode d'emploi en Markdowntext/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

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