[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fumrEL2Ro0YifT_OOK8xa3_jFP2V9WvW884GPblnK5E0":3,"$fRSBIJvYsLF_TTld0tvXTehpaYEdOGF2bOsoI4TKfO58":25},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":23,"updatedAt":24},"6a1e720eaa6b273b0c11b618","entitymap-the-open-standard-that-gives-ai-systems-a-structured-view-of-your-business-via-sejournal-dixon-jones",0,"Equipe Seogard","Un fichier unique, hébergé à la racine de votre domaine, qui déclare aux systèmes d'IA l'ensemble des entités que votre organisation maîtrise, avec les preuves associées. C'est la proposition d'EntityMap, un standard ouvert porté par Dixon Jones et présenté en détail sur [Search Engine Journal](https://www.searchenginejournal.com/entitymap-the-open-standard-that-gives-ai-systems-a-structured-view-of-your-business/576146/). Au-delà du buzz, la question technique est sérieuse : comment structurer un graphe d'entités complet sans créer un monstre de maintenance, et surtout, quel impact réel sur la façon dont les LLM et les moteurs de réponse consomment votre contenu ?\n\n## Ce que propose EntityMap — et pourquoi c'est différent du schema.org classique\n\nLe schema.org embarqué dans vos pages HTML décrit le contenu *de cette page*. Un `Article`, un `Product`, un `LocalBusiness` — toujours contextuel, toujours fragmenté. Pour reconstituer la vue d'ensemble de ce qu'une organisation \"sait\", un crawler doit parcourir des milliers de pages, interpréter des centaines de blocs JSON-LD hétérogènes, et tenter de résoudre les co-références entre entités.\n\nEntityMap prend le problème à l'envers. Au lieu de distribuer les déclarations d'entités à travers le site, vous publiez un fichier centralisé — `/.well-known/entitymap.json` — qui expose un graphe d'entités complet avec, pour chaque entité, les URLs qui servent de preuve.\n\nLe modèle conceptuel est simple :\n\n- **Entity** : une chose identifiable (personne, concept, produit, lieu) avec un URI stable (idéalement un Wikidata QID, un DUNS, un ISNI, ou un URI interne).\n- **Claim** : une affirmation que votre organisation fait sur cette entité.\n- **Evidence** : l'URL de la page de votre site qui étaye cette affirmation.\n\nCe n'est pas un remplacement du schema.org inline. C'est une couche de méta-description au niveau du domaine entier, pensée pour les agents IA qui ont besoin de comprendre *l'expertise d'ensemble* d'une organisation avant de décider si elle est une source fiable sur un sujet donné.\n\nLa philosophie est comparable à celle de `robots.txt` (déclaratif, à la racine, convention de nommage) ou de `llms.txt` (un fichier texte qui guide les LLM), mais avec une ambition de granularité bien supérieure grâce au format JSON-LD et à l'ancrage dans le web sémantique.\n\n## Anatomie d'un fichier entitymap.json\n\nLa spécification (encore en draft au moment de l'écriture) s'appuie sur JSON-LD avec le vocabulaire schema.org étendu par des propriétés spécifiques. Voici un exemple concret pour un éditeur SaaS spécialisé en cybersécurité avec un catalogue de 3 000 articles de blog et 45 pages produit :\n\n```json\n{\n  \"@context\": [\n    \"https://schema.org\",\n    {\n      \"entitymap\": \"https://entitymap.org/ns/\",\n      \"claims\": \"entitymap:claims\",\n      \"evidence\": \"entitymap:evidence\",\n      \"confidence\": \"entitymap:confidence\",\n      \"topicAuthority\": \"entitymap:topicAuthority\"\n    }\n  ],\n  \"@type\": \"entitymap:EntityMap\",\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"@id\": \"https://cyberguard.io/#organization\",\n    \"name\": \"CyberGuard\",\n    \"url\": \"https://cyberguard.io\",\n    \"sameAs\": [\n      \"https://www.wikidata.org/wiki/Q119283746\",\n      \"https://www.linkedin.com/company/cyberguard-io\"\n    ]\n  },\n  \"dateModified\": \"2026-05-30T14:22:00Z\",\n  \"entities\": [\n    {\n      \"@type\": \"DefinedTerm\",\n      \"@id\": \"https://www.wikidata.org/wiki/Q3510521\",\n      \"name\": \"Zero Trust Architecture\",\n      \"topicAuthority\": \"expert\",\n      \"claims\": [\n        {\n          \"@type\": \"entitymap:Claim\",\n          \"text\": \"Zero Trust requires continuous verification of every access request regardless of network location\",\n          \"evidence\": [\n            {\n              \"url\": \"https://cyberguard.io/blog/zero-trust-architecture-complete-guide\",\n              \"datePublished\": \"2025-11-12\",\n              \"contentType\": \"Article\"\n            },\n            {\n              \"url\": \"https://cyberguard.io/whitepapers/nist-800-207-implementation\",\n              \"datePublished\": \"2026-01-08\",\n              \"contentType\": \"ScholarlyArticle\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"@type\": \"Product\",\n      \"@id\": \"https://cyberguard.io/products/sentinel-xdr/#product\",\n      \"name\": \"Sentinel XDR\",\n      \"claims\": [\n        {\n          \"@type\": \"entitymap:Claim\",\n          \"text\": \"Sentinel XDR correlates telemetry from endpoint, network, and cloud in under 200ms\",\n          \"evidence\": [\n            {\n              \"url\": \"https://cyberguard.io/products/sentinel-xdr\",\n              \"contentType\": \"ProductPage\"\n            },\n            {\n              \"url\": \"https://cyberguard.io/case-studies/fortune-500-soc-deployment\",\n              \"contentType\": \"Case Study\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n```\n\nQuelques points techniques à relever :\n\n- **L'ancrage sémantique via `@id`** : lier chaque entité à un identifiant Wikidata, DBpedia, ou un URI interne stable. C'est ce qui permet la désambiguïsation — \"Mercury\" n'est pas la même entité si le QID pointe vers la planète ou l'élément chimique.\n- **Le champ `topicAuthority`** : une auto-déclaration du niveau d'expertise. Les LLM pourront (ou non) en tenir compte. C'est un signal, pas une garantie.\n- **La séparation claim/evidence** : chaque affirmation est adossée à une ou plusieurs URLs vérifiables. Un LLM ou un agent peut aller vérifier la source, exactement comme un fact-checker humain.\n\n## Implémentation technique : déploiement et automatisation\n\n### Servir le fichier via .well-known\n\nLe standard utilise le répertoire `.well-known` ([RFC 8615](https://www.rfc-editor.org/rfc/rfc8615)) — le même mécanisme que `security.txt`, `change-password`, ou `assetlinks.json` pour Android. La configuration serveur est triviale.\n\nPour Nginx :\n\n```nginx\nlocation = /.well-known/entitymap.json {\n    root /var/www/cyberguard.io/public;\n    default_type application/ld+json;\n    add_header Cache-Control \"public, max-age=86400\";\n    add_header Access-Control-Allow-Origin \"*\";\n    add_header X-Robots-Tag \"noindex\";\n}\n```\n\nLe `Content-Type: application/ld+json` est critique. Sans lui, un parser JSON-LD strict pourrait refuser le fichier. Le header CORS est nécessaire si des outils tiers (validateurs, crawlers d'agence) doivent pouvoir fetch le fichier cross-origin. Et le `X-Robots-Tag: noindex` évite que le fichier lui-même apparaisse dans les SERPs — ce n'est pas du contenu destiné aux humains.\n\n### Génération automatique à partir du CMS\n\nSur un site de 3 000 articles, maintenir un entitymap.json à la main est impensable. L'approche viable : un script de build qui extrait les entités depuis votre CMS ou votre base de données de contenu.\n\nVoici un exemple en TypeScript pour un site Next.js qui tire ses contenus d'un headless CMS (Strapi, Sanity, ou similaire) :\n\n```typescript\n// scripts/generate-entitymap.ts\nimport { getAllArticles, getAllProducts } from '../lib/cms-client';\nimport { writeFileSync } from 'fs';\nimport { resolve } from 'path';\n\ninterface EntityClaim {\n  '@type': string;\n  text: string;\n  evidence: Array\u003C{\n    url: string;\n    datePublished?: string;\n    contentType: string;\n  }>;\n}\n\ninterface Entity {\n  '@type': string;\n  '@id': string;\n  name: string;\n  topicAuthority?: string;\n  claims: EntityClaim[];\n}\n\nasync function buildEntityMap(): Promise\u003Cvoid> {\n  const articles = await getAllArticles(); // retourne ~3000 articles\n  const products = await getAllProducts(); // retourne ~45 produits\n\n  // Regrouper les articles par entité principale (tag/topic)\n  const entityIndex = new Map\u003Cstring, Entity>();\n\n  for (const article of articles) {\n    // Chaque article a un champ \"primaryEntity\" avec un wikidataId\n    const entityKey = article.primaryEntity?.wikidataId;\n    if (!entityKey) continue;\n\n    if (!entityIndex.has(entityKey)) {\n      entityIndex.set(entityKey, {\n        '@type': 'DefinedTerm',\n        '@id': `https://www.wikidata.org/wiki/${entityKey}`,\n        name: article.primaryEntity.label,\n        topicAuthority: computeAuthority(articles, entityKey),\n        claims: [],\n      });\n    }\n\n    const entity = entityIndex.get(entityKey)!;\n    entity.claims.push({\n      '@type': 'entitymap:Claim',\n      text: article.metaDescription || article.excerpt,\n      evidence: [\n        {\n          url: `https://cyberguard.io/blog/${article.slug}`,\n          datePublished: article.publishedAt,\n          contentType: 'Article',\n        },\n      ],\n    });\n  }\n\n  // Ajouter les produits comme entités distinctes\n  for (const product of products) {\n    entityIndex.set(product.sku, {\n      '@type': 'Product',\n      '@id': `https://cyberguard.io/products/${product.slug}/#product`,\n      name: product.name,\n      claims: [\n        {\n          '@type': 'entitymap:Claim',\n          text: product.valueProposition,\n          evidence: [\n            {\n              url: `https://cyberguard.io/products/${product.slug}`,\n              contentType: 'ProductPage',\n            },\n          ],\n        },\n      ],\n    });\n  }\n\n  const entityMap = {\n    '@context': [\n      'https://schema.org',\n      {\n        entitymap: 'https://entitymap.org/ns/',\n        claims: 'entitymap:claims',\n        evidence: 'entitymap:evidence',\n        confidence: 'entitymap:confidence',\n        topicAuthority: 'entitymap:topicAuthority',\n      },\n    ],\n    '@type': 'entitymap:EntityMap',\n    publisher: {\n      '@type': 'Organization',\n      '@id': 'https://cyberguard.io/#organization',\n      name: 'CyberGuard',\n      url: 'https://cyberguard.io',\n    },\n    dateModified: new Date().toISOString(),\n    entities: Array.from(entityIndex.values()),\n  };\n\n  const outputPath = resolve(process.cwd(), 'public/.well-known/entitymap.json');\n  writeFileSync(outputPath, JSON.stringify(entityMap, null, 2), 'utf-8');\n  console.log(`EntityMap generated: ${entityIndex.size} entities, written to ${outputPath}`);\n}\n\nfunction computeAuthority(\n  articles: Array\u003C{ primaryEntity?: { wikidataId: string } }>,\n  wikidataId: string\n): string {\n  const count = articles.filter(\n    (a) => a.primaryEntity?.wikidataId === wikidataId\n  ).length;\n  if (count >= 20) return 'expert';\n  if (count >= 5) return 'knowledgeable';\n  return 'familiar';\n}\n\nbuildEntityMap().catch(console.error);\n```\n\nCe script tourne dans le pipeline CI/CD (GitHub Actions, GitLab CI) à chaque déploiement. Le fichier est régénéré, versionné, et servi statiquement. Pas de runtime, pas de latence additionnelle.\n\n### Validation et debugging\n\nAvant de pousser en production, validez la structure JSON-LD. Le [JSON-LD Playground](https://json-ld.org/playground/) du W3C reste l'outil de référence pour vérifier l'expansion des contextes. Pour les gros fichiers (le nôtre pèse 2,4 Mo pour 3 000 articles), `jq` en CLI est plus adapté :\n\n```bash\n# Vérifier la structure de base\ncat public/.well-known/entitymap.json | jq '.entities | length'\n# => 847 (entités uniques après regroupement)\n\n# Lister les entités sans wikidataId (à corriger)\ncat public/.well-known/entitymap.json | jq '[.entities[] | select(.\"@id\" | startswith(\"https://www.wikidata.org\") | not)] | length'\n# => 45 (les produits — normal, ils ont des URIs internes)\n\n# Vérifier que toutes les URLs d'evidence sont en HTTPS\ncat public/.well-known/entitymap.json | jq '[.entities[].claims[].evidence[].url | select(startswith(\"https://\") | not)]'\n# => [] (aucune URL non-HTTPS — OK)\n```\n\n## Scénario concret : un média tech de 12 000 pages\n\nPrenons le cas de TechPulse, un média tech français avec 12 000 articles publiés depuis 2018, couvrant le cloud, la cybersécurité, et l'IA. Leur Knowledge Panel Google est instable — il apparaît sur certaines requêtes brandées mais pas d'autres. Les citations dans les AI Overviews de Google et dans les réponses de Perplexity sont incohérentes : parfois le média est attribué, souvent il est synthétisé sans attribution.\n\n**Avant EntityMap :**\n- 12 000 pages avec du schema.org `Article` en inline, mais sans `about` structuré sur 80% des articles (les anciens).\n- Aucun graphe d'entités centralisé. Le knowledge graph interne existe dans la tête du rédacteur en chef, pas dans les données.\n- Google Search Console montre 9 200 pages indexées — cohérent. Mais les rich results ne couvrent que 2 100 articles (ceux publiés après la refonte de 2023).\n- Screaming Frog détecte 3 400 articles sans aucune donnée structurée JSON-LD.\n\n**Implémentation EntityMap :**\n1. Export des 12 000 articles depuis WordPress headless (WPGraphQL).\n2. Enrichissement automatique : un script NLP (spaCy + Wikidata Lookup API) extrait les entités principales de chaque article et les lie à des QIDs. Taux de match automatique : 73%. Les 27% restants sont revus manuellement par la rédaction sur 3 semaines.\n3. Regroupement : les 12 000 articles se mappent sur 1 240 entités distinctes. TechPulse a 15+ articles sur 89 d'entre elles → `topicAuthority: \"expert\"`.\n4. Le fichier entitymap.json pèse 4,1 Mo. Servi avec gzip, il descend à 380 Ko.\n5. Déploiement en `.well-known/entitymap.json` avec les headers appropriés.\n\n**Résultat attendu (suivi sur 3 mois) :**\nCe standard étant encore en phase d'adoption, les résultats directs sur les rankings Google classiques sont nuls — Google n'a pas annoncé de support d'EntityMap. En revanche, l'exercice de structuration a un bénéfice collatéral massif : en mappant chaque article à une entité Wikidata, l'équipe de TechPulse a identifié 340 articles orphelins (sans lien interne thématique), 87 doublons sémantiques (deux articles couvrant la même entité sans canonical croisé), et 12 entités \"expert\" sans page pillar dédiée.\n\nCe qui compte ici, ce n'est pas que les LLM lisent le fichier demain. C'est que l'exercice de construire un EntityMap force une hygiène sémantique que la plupart des sites de cette taille n'ont jamais faite.\n\n## Relations avec les autres signaux machine-readable\n\nEntityMap ne vit pas dans le vide. Il s'inscrit dans un écosystème croissant de fichiers déclaratifs destinés aux agents IA et aux crawlers.\n\n### robots.txt, llms.txt, et maintenant entitymap.json\n\n`robots.txt` contrôle l'accès — qui peut crawler quoi. `llms.txt` (proposé par Jeremy Howard, co-fondateur de fast.ai) fournit un résumé textuel de votre site pour les LLM. EntityMap va plus loin : il structure le *savoir* de votre organisation, pas juste la permission d'accès ou un résumé narratif.\n\nCes trois fichiers sont complémentaires, pas concurrents :\n\n| Fichier | Fonction | Format | Consumer principal |\n|---------|----------|--------|--------------------|\n| `robots.txt` | Contrôle d'accès crawlers | Texte plat | Googlebot, Bingbot |\n| `llms.txt` | Résumé narratif pour LLM | Markdown | ChatGPT, Claude, etc. |\n| `entitymap.json` | Graphe d'entités + preuves | JSON-LD | Agents IA, knowledge graphs |\n\nL'article de Cloudflare sur l'Agent Readiness Score ([analysé ici](/blog/all-you-need-to-know-about-cloudflare-s-agent-readiness-score-via-sejournal-slobodanmanic)) montre que la capacité d'un site à communiquer avec les agents IA devient un critère de qualité technique mesurable. EntityMap s'inscrit directement dans cette tendance.\n\n### Le lien avec le schema.org inline\n\nEntityMap ne remplace pas votre JSON-LD inline. Il le complète. La bonne pratique : chaque page conserve son schema.org contextuel (`Article`, `Product`, etc.), et le fichier EntityMap fournit la vue d'ensemble qui relie toutes ces pages entre elles.\n\nUn pattern intéressant consiste à utiliser les mêmes `@id` dans les deux contextes. Si votre page produit contient :\n\n```html\n\u003Cscript type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Product\",\n  \"@id\": \"https://cyberguard.io/products/sentinel-xdr/#product\",\n  \"name\": \"Sentinel XDR\",\n  \"description\": \"Extended Detection and Response platform...\"\n}\n\u003C/script>\n```\n\n...et que votre EntityMap déclare la même entité avec le même `@id`, un agent IA peut faire le lien entre la déclaration centralisée et le contenu de la page. C'est du linked data classique, mais appliqué à un use case nouveau.\n\nCela rejoint directement les enjeux de lisibilité machine des marques que nous avons explorés dans l'article sur [ce qui rend une marque machine-readable pour l'AI search](/blog/what-makes-a-brand-machine-readable-in-ai-search).\n\n## Limites et trade-offs — ce qu'EntityMap ne résout pas\n\n### Aucun engagement de consommation côté LLM\n\nC'est le point critique. Aujourd'hui, aucun grand modèle de langage (GPT-4o, Claude, Gemini) n'a publiquement annoncé consommer le fichier `entitymap.json`. Google n'en fait pas mention dans sa documentation Search Central. Le standard est une *proposition*, portée par Dixon Jones (fondateur d'InLinks, figure reconnue du SEO sémantique), mais il n'a pas encore de RFC formelle ni d'adoption par un agent IA majeur.\n\nCela ne signifie pas que c'est inutile — la dynamique de `robots.txt` a suivi le même chemin (convention informelle avant d'être respectée par les crawlers). Mais il faut calibrer vos attentes : déployer EntityMap ne va pas, demain matin, améliorer vos citations dans les AI Overviews.\n\n### Le risque du fichier obèse\n\nPour un e-commerce de 50 000 SKUs, chacun mappé à des entités (marques, catégories, matériaux, normes), le fichier peut facilement dépasser 20 Mo. Même compressé, c'est un payload non trivial. La spécification ne prévoit pas de mécanisme de pagination ou de `Sitemap-style` split. C'est une lacune que la communauté devra adresser.\n\nUne solution pragmatique : segmenter par sous-domaines ou par section du site, avec un fichier index :\n\n```json\n{\n  \"@type\": \"entitymap:EntityMapIndex\",\n  \"maps\": [\n    { \"url\": \"https://cyberguard.io/.well-known/entitymap-blog.json\" },\n    { \"url\": \"https://cyberguard.io/.well-known/entitymap-products.json\" },\n    { \"url\": \"https://cyberguard.io/.well-known/entitymap-docs.json\" }\n  ]\n}\n```\n\nCe pattern n'est pas dans la spec actuelle, mais il est cohérent avec la logique des sitemaps index et sera probablement nécessaire pour les gros sites.\n\n### L'auto-déclaration d'expertise\n\nLe champ `topicAuthority` est une auto-déclaration. Rien n'empêche un site spam de se déclarer \"expert\" sur n'importe quel sujet. Les consommateurs du fichier devront croiser cette déclaration avec des signaux externes (backlinks, mentions, E-E-A-T classique). C'est un signal parmi d'autres, pas une preuve.\n\n### La maintenance continue\n\nUn EntityMap qui dérive de la réalité du site est pire que pas d'EntityMap du tout. Si vous supprimez 200 articles lors d'un content pruning et que les URLs d'evidence pointent toujours vers des 404, vous envoyez un signal de négligence aux agents qui vérifient les preuves.\n\nC'est exactement le type de régression silencieuse qu'un outil de monitoring comme Seogard peut détecter automatiquement : des URLs référencées dans vos données structurées qui retournent un 404 ou un soft 404, sans que personne dans l'équipe ne s'en rende compte.\n\n## Stratégie d'adoption : quand et comment déployer\n\n### Pour qui c'est pertinent maintenant\n\n- **Sites avec une forte couverture thématique** (médias, bases de connaissances, SaaS avec un blog éditorial conséquent) : l'exercice de structuration a une valeur intrinsèque, même sans consommation par les LLM.\n- **Organisations qui investissent déjà dans le knowledge graph interne** : si vous avez une taxonomie d'entités (via InLinks, WordLift, ou un système custom), la génération d'EntityMap est quasi-gratuite.\n- **Early adopters qui veulent être prêts** quand les agents IA commenceront à consommer ce type de fichier — et les signaux vont dans ce sens, comme le montrent les annonces de Google I/O 2026 sur [la convergence search/agents/tools](/blog/sundar-pichai-google-search-ai-agents-and-tools-will-become-one).\n\n### Pour qui c'est prématuré\n\n- **Sites de moins de 100 pages** : le ratio effort/bénéfice est défavorable. Concentrez-vous sur votre schema.org inline et vos bases.\n- **Sites sans taxonomie d'entités** : si vous ne savez pas quelles entités votre site couvre, commencez par ce travail de fond avant de penser au fichier de sortie.\n\n### Checklist de déploiement\n\n1. Inventorier vos entités principales via un crawl Screaming Frog + extraction des `about` et `mentions` dans votre JSON-LD existant.\n2. Enrichir avec des identifiants Wikidata (l'API Wikidata Search est gratuite et bien documentée : [https://www.wikidata.org/w/api.php](https://www.wikidata.org/w/api.php)).\n3. Regrouper les articles par entité et évaluer la couverture.\n4. Générer le fichier via un script de build intégré au CI/CD.\n5. Servir avec les bons headers (cf. config Nginx ci-dessus).\n6. Monitorer que les URLs d'evidence restent valides — un check hebdomadaire automatisé est le minimum.\n\n## Ce que cela signifie pour la visibilité IA en 2026\n\nEntityMap est un pari sur l'avenir de la découverte d'information. Le postulat sous-jacent : les agents IA vont de plus en plus chercher à comprendre *qui sait quoi* avant de décider *quelle source citer*. Ce n'est plus une question de ranking sur 10 liens bleus, mais de [visibilité dans un écosystème de réponses générées](/blog/the-new-rules-of-search-key-aeo-content-marketing-trends-for-2026-via-sejournal-hethr-campbell).\n\nLes démonstrations de Google I/O 2026 ([analysées ici](/blog/google-s-i-o-demos-reveal-the-new-business-visibility-problem-via-sejournal-mattgsouthern)) ont montré que le problème de visibilité des marques dans l'AI search est réel et croissant. Un fichier déclaratif qui dit \"voici nos entités, voici nos preuves\" ne résoudra pas tout, mais il pose les fondations d'une communication structurée entre votre site et les systèmes qui synthétisent l'information.\n\nLe standard est jeune, les consommateurs sont rares, et les bénéfices immédiats sont surtout collatéraux (hygiène sémantique, détection de lacunes éditoriales). Mais l'histoire du SEO technique nous enseigne que les standards déclaratifs finissent par s'imposer quand ils résolvent un vrai problème — et la question \"comment les agents IA découvrent-ils l'expertise d'un domaine ?\" est un vrai problème. Déployez EntityMap comme vous auriez déployé schema.org en 2014 : sans attendre la preuve de ROI immédiat, mais avec la rigueur technique qui garantit que le jour où les agents le lisent, votre fichier est irréprochable.","https://seogard.io/blog/entitymap-the-open-standard-that-gives-ai-systems-a-structured-view-of-your-business-via-sejournal-dixon-jones","Actualités SEO","2026-06-02T06:02:54.612Z","2026-06-02","Analyse technique d'EntityMap, le fichier JSON-LD qui expose vos entités aux LLM. Implémentation, déploiement, limites et monitoring.","\u003Cp>Un fichier unique, hébergé à la racine de votre domaine, qui déclare aux systèmes d'IA l'ensemble des entités que votre organisation maîtrise, avec les preuves associées. C'est la proposition d'EntityMap, un standard ouvert porté par Dixon Jones et présenté en détail sur \u003Ca href=\"https://www.searchenginejournal.com/entitymap-the-open-standard-that-gives-ai-systems-a-structured-view-of-your-business/576146/\">Search Engine Journal\u003C/a>. Au-delà du buzz, la question technique est sérieuse : comment structurer un graphe d'entités complet sans créer un monstre de maintenance, et surtout, quel impact réel sur la façon dont les LLM et les moteurs de réponse consomment votre contenu ?\u003C/p>\n\u003Ch2>Ce que propose EntityMap — et pourquoi c'est différent du schema.org classique\u003C/h2>\n\u003Cp>Le schema.org embarqué dans vos pages HTML décrit le contenu \u003Cem>de cette page\u003C/em>. Un \u003Ccode>Article\u003C/code>, un \u003Ccode>Product\u003C/code>, un \u003Ccode>LocalBusiness\u003C/code> — toujours contextuel, toujours fragmenté. Pour reconstituer la vue d'ensemble de ce qu'une organisation \"sait\", un crawler doit parcourir des milliers de pages, interpréter des centaines de blocs JSON-LD hétérogènes, et tenter de résoudre les co-références entre entités.\u003C/p>\n\u003Cp>EntityMap prend le problème à l'envers. Au lieu de distribuer les déclarations d'entités à travers le site, vous publiez un fichier centralisé — \u003Ccode>/.well-known/entitymap.json\u003C/code> — qui expose un graphe d'entités complet avec, pour chaque entité, les URLs qui servent de preuve.\u003C/p>\n\u003Cp>Le modèle conceptuel est simple :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Entity\u003C/strong> : une chose identifiable (personne, concept, produit, lieu) avec un URI stable (idéalement un Wikidata QID, un DUNS, un ISNI, ou un URI interne).\u003C/li>\n\u003Cli>\u003Cstrong>Claim\u003C/strong> : une affirmation que votre organisation fait sur cette entité.\u003C/li>\n\u003Cli>\u003Cstrong>Evidence\u003C/strong> : l'URL de la page de votre site qui étaye cette affirmation.\u003C/li>\n\u003C/ul>\n\u003Cp>Ce n'est pas un remplacement du schema.org inline. C'est une couche de méta-description au niveau du domaine entier, pensée pour les agents IA qui ont besoin de comprendre \u003Cem>l'expertise d'ensemble\u003C/em> d'une organisation avant de décider si elle est une source fiable sur un sujet donné.\u003C/p>\n\u003Cp>La philosophie est comparable à celle de \u003Ccode>robots.txt\u003C/code> (déclaratif, à la racine, convention de nommage) ou de \u003Ccode>llms.txt\u003C/code> (un fichier texte qui guide les LLM), mais avec une ambition de granularité bien supérieure grâce au format JSON-LD et à l'ancrage dans le web sémantique.\u003C/p>\n\u003Ch2>Anatomie d'un fichier entitymap.json\u003C/h2>\n\u003Cp>La spécification (encore en draft au moment de l'écriture) s'appuie sur JSON-LD avec le vocabulaire schema.org étendu par des propriétés spécifiques. Voici un exemple concret pour un éditeur SaaS spécialisé en cybersécurité avec un catalogue de 3 000 articles de blog et 45 pages produit :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"@context\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"https://schema.org\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"entitymap\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://entitymap.org/ns/\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"claims\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:claims\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"evidence\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:evidence\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"confidence\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:confidence\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"topicAuthority\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:topicAuthority\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:EntityMap\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"publisher\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Organization\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"@id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/#organization\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"CyberGuard\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"sameAs\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      \"https://www.wikidata.org/wiki/Q119283746\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      \"https://www.linkedin.com/company/cyberguard-io\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"dateModified\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2026-05-30T14:22:00Z\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"entities\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"DefinedTerm\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://www.wikidata.org/wiki/Q3510521\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Zero Trust Architecture\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"topicAuthority\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"expert\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"claims\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:Claim\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"text\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Zero Trust requires continuous verification of every access request regardless of network location\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"evidence\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/blog/zero-trust-architecture-complete-guide\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"datePublished\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2025-11-12\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"contentType\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Article\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/whitepapers/nist-800-207-implementation\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"datePublished\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2026-01-08\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"contentType\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"ScholarlyArticle\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Product\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"@id\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/products/sentinel-xdr/#product\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"name\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Sentinel XDR\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"claims\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:Claim\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"text\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Sentinel XDR correlates telemetry from endpoint, network, and cloud in under 200ms\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"evidence\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/products/sentinel-xdr\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"contentType\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"ProductPage\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/case-studies/fortune-500-soc-deployment\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">              \"contentType\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Case Study\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Quelques points techniques à relever :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>L'ancrage sémantique via \u003Ccode>@id\u003C/code>\u003C/strong> : lier chaque entité à un identifiant Wikidata, DBpedia, ou un URI interne stable. C'est ce qui permet la désambiguïsation — \"Mercury\" n'est pas la même entité si le QID pointe vers la planète ou l'élément chimique.\u003C/li>\n\u003Cli>\u003Cstrong>Le champ \u003Ccode>topicAuthority\u003C/code>\u003C/strong> : une auto-déclaration du niveau d'expertise. Les LLM pourront (ou non) en tenir compte. C'est un signal, pas une garantie.\u003C/li>\n\u003Cli>\u003Cstrong>La séparation claim/evidence\u003C/strong> : chaque affirmation est adossée à une ou plusieurs URLs vérifiables. Un LLM ou un agent peut aller vérifier la source, exactement comme un fact-checker humain.\u003C/li>\n\u003C/ul>\n\u003Ch2>Implémentation technique : déploiement et automatisation\u003C/h2>\n\u003Ch3>Servir le fichier via .well-known\u003C/h3>\n\u003Cp>Le standard utilise le répertoire \u003Ccode>.well-known\u003C/code> (\u003Ca href=\"https://www.rfc-editor.org/rfc/rfc8615\">RFC 8615\u003C/a>) — le même mécanisme que \u003Ccode>security.txt\u003C/code>, \u003Ccode>change-password\u003C/code>, ou \u003Ccode>assetlinks.json\u003C/code> pour Android. La configuration serveur est triviale.\u003C/p>\n\u003Cp>Pour Nginx :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">location\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#DBEDFF\"> /.well-known/entitymap.json \u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    root \u003C/span>\u003Cspan style=\"color:#E1E4E8\">/var/www/cyberguard.io/public;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    default_type \u003C/span>\u003Cspan style=\"color:#E1E4E8\">application/ld+json;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">Cache-Control \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"public, max-age=86400\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">Access-Control-Allow-Origin \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"*\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    add_header \u003C/span>\u003Cspan style=\"color:#E1E4E8\">X-Robots-Tag \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"noindex\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le \u003Ccode>Content-Type: application/ld+json\u003C/code> est critique. Sans lui, un parser JSON-LD strict pourrait refuser le fichier. Le header CORS est nécessaire si des outils tiers (validateurs, crawlers d'agence) doivent pouvoir fetch le fichier cross-origin. Et le \u003Ccode>X-Robots-Tag: noindex\u003C/code> évite que le fichier lui-même apparaisse dans les SERPs — ce n'est pas du contenu destiné aux humains.\u003C/p>\n\u003Ch3>Génération automatique à partir du CMS\u003C/h3>\n\u003Cp>Sur un site de 3 000 articles, maintenir un entitymap.json à la main est impensable. L'approche viable : un script de build qui extrait les entités depuis votre CMS ou votre base de données de contenu.\u003C/p>\n\u003Cp>Voici un exemple en TypeScript pour un site Next.js qui tire ses contenus d'un headless CMS (Strapi, Sanity, ou similaire) :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// scripts/generate-entitymap.ts\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { getAllArticles, getAllProducts } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '../lib/cms-client'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { writeFileSync } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'fs'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { resolve } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'path'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> EntityClaim\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  '@type'\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  text\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  evidence\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Array\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    url\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    datePublished\u003C/span>\u003Cspan style=\"color:#F97583\">?:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    contentType\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }>;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> Entity\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  '@type'\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  '@id'\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  name\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  topicAuthority\u003C/span>\u003Cspan style=\"color:#F97583\">?:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  claims\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> EntityClaim\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> buildEntityMap\u003C/span>\u003Cspan style=\"color:#E1E4E8\">()\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#79B8FF\">void\u003C/span>\u003Cspan style=\"color:#E1E4E8\">> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> articles\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getAllArticles\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(); \u003C/span>\u003Cspan style=\"color:#6A737D\">// retourne ~3000 articles\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> products\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> getAllProducts\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(); \u003C/span>\u003Cspan style=\"color:#6A737D\">// retourne ~45 produits\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Regrouper les articles par entité principale (tag/topic)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> entityIndex\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> Map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#79B8FF\">string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#B392F0\">Entity\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> article\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> articles) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Chaque article a un champ \"primaryEntity\" avec un wikidataId\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> entityKey\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> article.primaryEntity?.wikidataId;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">entityKey) \u003C/span>\u003Cspan style=\"color:#F97583\">continue\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">entityIndex.\u003C/span>\u003Cspan style=\"color:#B392F0\">has\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(entityKey)) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      entityIndex.\u003C/span>\u003Cspan style=\"color:#B392F0\">set\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(entityKey, {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'DefinedTerm'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        '@id'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`https://www.wikidata.org/wiki/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">entityKey\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        name: article.primaryEntity.label,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        topicAuthority: \u003C/span>\u003Cspan style=\"color:#B392F0\">computeAuthority\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(articles, entityKey),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        claims: [],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> entity\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> entityIndex.\u003C/span>\u003Cspan style=\"color:#B392F0\">get\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(entityKey)\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    entity.claims.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'entitymap:Claim'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      text: article.metaDescription \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> article.excerpt,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      evidence: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          url: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`https://cyberguard.io/blog/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">article\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">slug\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          datePublished: article.publishedAt,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          contentType: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Article'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Ajouter les produits comme entités distinctes\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> product\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> products) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    entityIndex.\u003C/span>\u003Cspan style=\"color:#B392F0\">set\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(product.sku, {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Product'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '@id'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`https://cyberguard.io/products/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">product\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">slug\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}/#product`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      name: product.name,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      claims: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">          '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'entitymap:Claim'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          text: product.valueProposition,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          evidence: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">              url: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`https://cyberguard.io/products/${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">product\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">slug\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">              contentType: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'ProductPage'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> entityMap\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    '@context'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      'https://schema.org'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        entitymap: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'https://entitymap.org/ns/'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        claims: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'entitymap:claims'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        evidence: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'entitymap:evidence'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        confidence: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'entitymap:confidence'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        topicAuthority: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'entitymap:topicAuthority'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'entitymap:EntityMap'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    publisher: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '@type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'Organization'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '@id'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'https://cyberguard.io/#organization'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      name: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'CyberGuard'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      url: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'https://cyberguard.io'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    dateModified: \u003C/span>\u003Cspan style=\"color:#F97583\">new\u003C/span>\u003Cspan style=\"color:#B392F0\"> Date\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">toISOString\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    entities: Array.\u003C/span>\u003Cspan style=\"color:#B392F0\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(entityIndex.\u003C/span>\u003Cspan style=\"color:#B392F0\">values\u003C/span>\u003Cspan style=\"color:#E1E4E8\">()),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> outputPath\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#B392F0\"> resolve\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(process.\u003C/span>\u003Cspan style=\"color:#B392F0\">cwd\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(), \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'public/.well-known/entitymap.json'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  writeFileSync\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(outputPath, \u003C/span>\u003Cspan style=\"color:#79B8FF\">JSON\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">stringify\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(entityMap, \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">), \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'utf-8'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`EntityMap generated: ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">entityIndex\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">size\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} entities, written to ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">outputPath\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#B392F0\"> computeAuthority\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  articles\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Array\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;{ \u003C/span>\u003Cspan style=\"color:#FFAB70\">primaryEntity\u003C/span>\u003Cspan style=\"color:#F97583\">?:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">wikidataId\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> } }>,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  wikidataId\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> count\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> articles.\u003C/span>\u003Cspan style=\"color:#B392F0\">filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    (\u003C/span>\u003Cspan style=\"color:#FFAB70\">a\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> a.primaryEntity?.wikidataId \u003C/span>\u003Cspan style=\"color:#F97583\">===\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> wikidataId\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ).\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (count \u003C/span>\u003Cspan style=\"color:#F97583\">>=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 20\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">return\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'expert'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (count \u003C/span>\u003Cspan style=\"color:#F97583\">>=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 5\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">return\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'knowledgeable'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'familiar'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">buildEntityMap\u003C/span>\u003Cspan style=\"color:#E1E4E8\">().\u003C/span>\u003Cspan style=\"color:#B392F0\">catch\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(console.error);\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce script tourne dans le pipeline CI/CD (GitHub Actions, GitLab CI) à chaque déploiement. Le fichier est régénéré, versionné, et servi statiquement. Pas de runtime, pas de latence additionnelle.\u003C/p>\n\u003Ch3>Validation et debugging\u003C/h3>\n\u003Cp>Avant de pousser en production, validez la structure JSON-LD. Le \u003Ca href=\"https://json-ld.org/playground/\">JSON-LD Playground\u003C/a> du W3C reste l'outil de référence pour vérifier l'expansion des contextes. Pour les gros fichiers (le nôtre pèse 2,4 Mo pour 3 000 articles), \u003Ccode>jq\u003C/code> en CLI est plus adapté :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifier la structure de base\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> public/.well-known/entitymap.json\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '.entities | length'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># => 847 (entités uniques après regroupement)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Lister les entités sans wikidataId (à corriger)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> public/.well-known/entitymap.json\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '[.entities[] | select(.\"@id\" | startswith(\"https://www.wikidata.org\") | not)] | length'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># => 45 (les produits — normal, ils ont des URIs internes)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifier que toutes les URLs d'evidence sont en HTTPS\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">cat\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> public/.well-known/entitymap.json\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '[.entities[].claims[].evidence[].url | select(startswith(\"https://\") | not)]'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># => [] (aucune URL non-HTTPS — OK)\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch2>Scénario concret : un média tech de 12 000 pages\u003C/h2>\n\u003Cp>Prenons le cas de TechPulse, un média tech français avec 12 000 articles publiés depuis 2018, couvrant le cloud, la cybersécurité, et l'IA. Leur Knowledge Panel Google est instable — il apparaît sur certaines requêtes brandées mais pas d'autres. Les citations dans les AI Overviews de Google et dans les réponses de Perplexity sont incohérentes : parfois le média est attribué, souvent il est synthétisé sans attribution.\u003C/p>\n\u003Cp>\u003Cstrong>Avant EntityMap :\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>12 000 pages avec du schema.org \u003Ccode>Article\u003C/code> en inline, mais sans \u003Ccode>about\u003C/code> structuré sur 80% des articles (les anciens).\u003C/li>\n\u003Cli>Aucun graphe d'entités centralisé. Le knowledge graph interne existe dans la tête du rédacteur en chef, pas dans les données.\u003C/li>\n\u003Cli>Google Search Console montre 9 200 pages indexées — cohérent. Mais les rich results ne couvrent que 2 100 articles (ceux publiés après la refonte de 2023).\u003C/li>\n\u003Cli>Screaming Frog détecte 3 400 articles sans aucune donnée structurée JSON-LD.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Implémentation EntityMap :\u003C/strong>\u003C/p>\n\u003Col>\n\u003Cli>Export des 12 000 articles depuis WordPress headless (WPGraphQL).\u003C/li>\n\u003Cli>Enrichissement automatique : un script NLP (spaCy + Wikidata Lookup API) extrait les entités principales de chaque article et les lie à des QIDs. Taux de match automatique : 73%. Les 27% restants sont revus manuellement par la rédaction sur 3 semaines.\u003C/li>\n\u003Cli>Regroupement : les 12 000 articles se mappent sur 1 240 entités distinctes. TechPulse a 15+ articles sur 89 d'entre elles → \u003Ccode>topicAuthority: \"expert\"\u003C/code>.\u003C/li>\n\u003Cli>Le fichier entitymap.json pèse 4,1 Mo. Servi avec gzip, il descend à 380 Ko.\u003C/li>\n\u003Cli>Déploiement en \u003Ccode>.well-known/entitymap.json\u003C/code> avec les headers appropriés.\u003C/li>\n\u003C/ol>\n\u003Cp>\u003Cstrong>Résultat attendu (suivi sur 3 mois) :\u003C/strong>\nCe standard étant encore en phase d'adoption, les résultats directs sur les rankings Google classiques sont nuls — Google n'a pas annoncé de support d'EntityMap. En revanche, l'exercice de structuration a un bénéfice collatéral massif : en mappant chaque article à une entité Wikidata, l'équipe de TechPulse a identifié 340 articles orphelins (sans lien interne thématique), 87 doublons sémantiques (deux articles couvrant la même entité sans canonical croisé), et 12 entités \"expert\" sans page pillar dédiée.\u003C/p>\n\u003Cp>Ce qui compte ici, ce n'est pas que les LLM lisent le fichier demain. C'est que l'exercice de construire un EntityMap force une hygiène sémantique que la plupart des sites de cette taille n'ont jamais faite.\u003C/p>\n\u003Ch2>Relations avec les autres signaux machine-readable\u003C/h2>\n\u003Cp>EntityMap ne vit pas dans le vide. Il s'inscrit dans un écosystème croissant de fichiers déclaratifs destinés aux agents IA et aux crawlers.\u003C/p>\n\u003Ch3>robots.txt, llms.txt, et maintenant entitymap.json\u003C/h3>\n\u003Cp>\u003Ccode>robots.txt\u003C/code> contrôle l'accès — qui peut crawler quoi. \u003Ccode>llms.txt\u003C/code> (proposé par Jeremy Howard, co-fondateur de fast.ai) fournit un résumé textuel de votre site pour les LLM. EntityMap va plus loin : il structure le \u003Cem>savoir\u003C/em> de votre organisation, pas juste la permission d'accès ou un résumé narratif.\u003C/p>\n\u003Cp>Ces trois fichiers sont complémentaires, pas concurrents :\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Fichier\u003C/th>\n\u003Cth>Fonction\u003C/th>\n\u003Cth>Format\u003C/th>\n\u003Cth>Consumer principal\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>robots.txt\u003C/code>\u003C/td>\n\u003Ctd>Contrôle d'accès crawlers\u003C/td>\n\u003Ctd>Texte plat\u003C/td>\n\u003Ctd>Googlebot, Bingbot\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>llms.txt\u003C/code>\u003C/td>\n\u003Ctd>Résumé narratif pour LLM\u003C/td>\n\u003Ctd>Markdown\u003C/td>\n\u003Ctd>ChatGPT, Claude, etc.\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>entitymap.json\u003C/code>\u003C/td>\n\u003Ctd>Graphe d'entités + preuves\u003C/td>\n\u003Ctd>JSON-LD\u003C/td>\n\u003Ctd>Agents IA, knowledge graphs\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\n\u003Cp>L'article de Cloudflare sur l'Agent Readiness Score (\u003Ca href=\"/blog/all-you-need-to-know-about-cloudflare-s-agent-readiness-score-via-sejournal-slobodanmanic\">analysé ici\u003C/a>) montre que la capacité d'un site à communiquer avec les agents IA devient un critère de qualité technique mesurable. EntityMap s'inscrit directement dans cette tendance.\u003C/p>\n\u003Ch3>Le lien avec le schema.org inline\u003C/h3>\n\u003Cp>EntityMap ne remplace pas votre JSON-LD inline. Il le complète. La bonne pratique : chaque page conserve son schema.org contextuel (\u003Ccode>Article\u003C/code>, \u003Ccode>Product\u003C/code>, etc.), et le fichier EntityMap fournit la vue d'ensemble qui relie toutes ces pages entre elles.\u003C/p>\n\u003Cp>Un pattern intéressant consiste à utiliser les mêmes \u003Ccode>@id\u003C/code> dans les deux contextes. Si votre page produit contient :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@context\": \"https://schema.org\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@type\": \"Product\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@id\": \"https://cyberguard.io/products/sentinel-xdr/#product\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"name\": \"Sentinel XDR\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"description\": \"Extended Detection and Response platform...\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>...et que votre EntityMap déclare la même entité avec le même \u003Ccode>@id\u003C/code>, un agent IA peut faire le lien entre la déclaration centralisée et le contenu de la page. C'est du linked data classique, mais appliqué à un use case nouveau.\u003C/p>\n\u003Cp>Cela rejoint directement les enjeux de lisibilité machine des marques que nous avons explorés dans l'article sur \u003Ca href=\"/blog/what-makes-a-brand-machine-readable-in-ai-search\">ce qui rend une marque machine-readable pour l'AI search\u003C/a>.\u003C/p>\n\u003Ch2>Limites et trade-offs — ce qu'EntityMap ne résout pas\u003C/h2>\n\u003Ch3>Aucun engagement de consommation côté LLM\u003C/h3>\n\u003Cp>C'est le point critique. Aujourd'hui, aucun grand modèle de langage (GPT-4o, Claude, Gemini) n'a publiquement annoncé consommer le fichier \u003Ccode>entitymap.json\u003C/code>. Google n'en fait pas mention dans sa documentation Search Central. Le standard est une \u003Cem>proposition\u003C/em>, portée par Dixon Jones (fondateur d'InLinks, figure reconnue du SEO sémantique), mais il n'a pas encore de RFC formelle ni d'adoption par un agent IA majeur.\u003C/p>\n\u003Cp>Cela ne signifie pas que c'est inutile — la dynamique de \u003Ccode>robots.txt\u003C/code> a suivi le même chemin (convention informelle avant d'être respectée par les crawlers). Mais il faut calibrer vos attentes : déployer EntityMap ne va pas, demain matin, améliorer vos citations dans les AI Overviews.\u003C/p>\n\u003Ch3>Le risque du fichier obèse\u003C/h3>\n\u003Cp>Pour un e-commerce de 50 000 SKUs, chacun mappé à des entités (marques, catégories, matériaux, normes), le fichier peut facilement dépasser 20 Mo. Même compressé, c'est un payload non trivial. La spécification ne prévoit pas de mécanisme de pagination ou de \u003Ccode>Sitemap-style\u003C/code> split. C'est une lacune que la communauté devra adresser.\u003C/p>\n\u003Cp>Une solution pragmatique : segmenter par sous-domaines ou par section du site, avec un fichier index :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"@type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"entitymap:EntityMapIndex\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"maps\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    { \u003C/span>\u003Cspan style=\"color:#79B8FF\">\"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/.well-known/entitymap-blog.json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    { \u003C/span>\u003Cspan style=\"color:#79B8FF\">\"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/.well-known/entitymap-products.json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    { \u003C/span>\u003Cspan style=\"color:#79B8FF\">\"url\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://cyberguard.io/.well-known/entitymap-docs.json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce pattern n'est pas dans la spec actuelle, mais il est cohérent avec la logique des sitemaps index et sera probablement nécessaire pour les gros sites.\u003C/p>\n\u003Ch3>L'auto-déclaration d'expertise\u003C/h3>\n\u003Cp>Le champ \u003Ccode>topicAuthority\u003C/code> est une auto-déclaration. Rien n'empêche un site spam de se déclarer \"expert\" sur n'importe quel sujet. Les consommateurs du fichier devront croiser cette déclaration avec des signaux externes (backlinks, mentions, E-E-A-T classique). C'est un signal parmi d'autres, pas une preuve.\u003C/p>\n\u003Ch3>La maintenance continue\u003C/h3>\n\u003Cp>Un EntityMap qui dérive de la réalité du site est pire que pas d'EntityMap du tout. Si vous supprimez 200 articles lors d'un content pruning et que les URLs d'evidence pointent toujours vers des 404, vous envoyez un signal de négligence aux agents qui vérifient les preuves.\u003C/p>\n\u003Cp>C'est exactement le type de régression silencieuse qu'un outil de monitoring comme Seogard peut détecter automatiquement : des URLs référencées dans vos données structurées qui retournent un 404 ou un soft 404, sans que personne dans l'équipe ne s'en rende compte.\u003C/p>\n\u003Ch2>Stratégie d'adoption : quand et comment déployer\u003C/h2>\n\u003Ch3>Pour qui c'est pertinent maintenant\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Sites avec une forte couverture thématique\u003C/strong> (médias, bases de connaissances, SaaS avec un blog éditorial conséquent) : l'exercice de structuration a une valeur intrinsèque, même sans consommation par les LLM.\u003C/li>\n\u003Cli>\u003Cstrong>Organisations qui investissent déjà dans le knowledge graph interne\u003C/strong> : si vous avez une taxonomie d'entités (via InLinks, WordLift, ou un système custom), la génération d'EntityMap est quasi-gratuite.\u003C/li>\n\u003Cli>\u003Cstrong>Early adopters qui veulent être prêts\u003C/strong> quand les agents IA commenceront à consommer ce type de fichier — et les signaux vont dans ce sens, comme le montrent les annonces de Google I/O 2026 sur \u003Ca href=\"/blog/sundar-pichai-google-search-ai-agents-and-tools-will-become-one\">la convergence search/agents/tools\u003C/a>.\u003C/li>\n\u003C/ul>\n\u003Ch3>Pour qui c'est prématuré\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Sites de moins de 100 pages\u003C/strong> : le ratio effort/bénéfice est défavorable. Concentrez-vous sur votre schema.org inline et vos bases.\u003C/li>\n\u003Cli>\u003Cstrong>Sites sans taxonomie d'entités\u003C/strong> : si vous ne savez pas quelles entités votre site couvre, commencez par ce travail de fond avant de penser au fichier de sortie.\u003C/li>\n\u003C/ul>\n\u003Ch3>Checklist de déploiement\u003C/h3>\n\u003Col>\n\u003Cli>Inventorier vos entités principales via un crawl Screaming Frog + extraction des \u003Ccode>about\u003C/code> et \u003Ccode>mentions\u003C/code> dans votre JSON-LD existant.\u003C/li>\n\u003Cli>Enrichir avec des identifiants Wikidata (l'API Wikidata Search est gratuite et bien documentée : \u003Ca href=\"https://www.wikidata.org/w/api.php\">https://www.wikidata.org/w/api.php\u003C/a>).\u003C/li>\n\u003Cli>Regrouper les articles par entité et évaluer la couverture.\u003C/li>\n\u003Cli>Générer le fichier via un script de build intégré au CI/CD.\u003C/li>\n\u003Cli>Servir avec les bons headers (cf. config Nginx ci-dessus).\u003C/li>\n\u003Cli>Monitorer que les URLs d'evidence restent valides — un check hebdomadaire automatisé est le minimum.\u003C/li>\n\u003C/ol>\n\u003Ch2>Ce que cela signifie pour la visibilité IA en 2026\u003C/h2>\n\u003Cp>EntityMap est un pari sur l'avenir de la découverte d'information. Le postulat sous-jacent : les agents IA vont de plus en plus chercher à comprendre \u003Cem>qui sait quoi\u003C/em> avant de décider \u003Cem>quelle source citer\u003C/em>. Ce n'est plus une question de ranking sur 10 liens bleus, mais de \u003Ca href=\"/blog/the-new-rules-of-search-key-aeo-content-marketing-trends-for-2026-via-sejournal-hethr-campbell\">visibilité dans un écosystème de réponses générées\u003C/a>.\u003C/p>\n\u003Cp>Les démonstrations de Google I/O 2026 (\u003Ca href=\"/blog/google-s-i-o-demos-reveal-the-new-business-visibility-problem-via-sejournal-mattgsouthern\">analysées ici\u003C/a>) ont montré que le problème de visibilité des marques dans l'AI search est réel et croissant. Un fichier déclaratif qui dit \"voici nos entités, voici nos preuves\" ne résoudra pas tout, mais il pose les fondations d'une communication structurée entre votre site et les systèmes qui synthétisent l'information.\u003C/p>\n\u003Cp>Le standard est jeune, les consommateurs sont rares, et les bénéfices immédiats sont surtout collatéraux (hygiène sémantique, détection de lacunes éditoriales). Mais l'histoire du SEO technique nous enseigne que les standards déclaratifs finissent par s'imposer quand ils résolvent un vrai problème — et la question \"comment les agents IA découvrent-ils l'expertise d'un domaine ?\" est un vrai problème. Déployez EntityMap comme vous auriez déployé schema.org en 2014 : sans attendre la preuve de ROI immédiat, mais avec la rigueur technique qui garantit que le jour où les agents le lisent, votre fichier est irréprochable.\u003C/p>",null,12,[18,19,20,21,22],"entitymap","structured-data","AI search","knowledge-graph","JSON-LD","EntityMap : le standard ouvert qui structure votre marque pour l'IA","Tue Jun 02 2026 06:02:54 GMT+0000 (Coordinated Universal Time)",[26,41,58],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":31,"description":32,"image":15,"imageAlt":15,"readingTime":16,"tags":33,"title":39,"updatedAt":40},"6a1c5bbfaa6b273b0c57e754","google-s-i-o-demos-reveal-the-new-business-visibility-problem-via-sejournal-mattgsouthern","https://seogard.io/blog/google-s-i-o-demos-reveal-the-new-business-visibility-problem-via-sejournal-mattgsouthern","2026-05-31T16:03:11.265Z","2026-05-31","Les démos Google I/O finalisent des transactions sans jamais montrer de site. Analyse technique du nouveau problème de visibilité business et comment s'y préparer.",[34,35,36,37,38],"google i/o","ai search","business visibility","structured data","answer engine optimization","Google I/O 2026 : le problème de visibilité business que les démos révèlent","Sun May 31 2026 16:03:11 GMT+0000 (Coordinated Universal Time)",{"_id":42,"slug":43,"__v":6,"author":7,"canonical":44,"category":10,"createdAt":45,"date":46,"description":47,"image":15,"imageAlt":15,"readingTime":16,"tags":48,"title":56,"updatedAt":57},"6a1a7d89aa6b273b0ccd1780","google-serp-layout-shift-position-1-now-appears-halfway-down-the-page-via-sejournal-lorenbaker","https://seogard.io/blog/google-serp-layout-shift-position-1-now-appears-halfway-down-the-page-via-sejournal-lorenbaker","2026-05-30T06:02:49.607Z","2026-05-30","La position 1 organique recule à 800px+ du haut de page. Analyse technique du SERP layout shift Google et stratégies pour maintenir la visibilité réelle.",[49,50,51,52,53,54,55],"google","serp","layout","shift","position","visibilité","above-the-fold","SERP Layout Shift : pourquoi la position 1 ne vaut plus rien","Sat May 30 2026 06:02:49 GMT+0000 (Coordinated Universal Time)",{"_id":59,"slug":60,"__v":6,"author":7,"canonical":61,"category":10,"createdAt":62,"date":63,"description":64,"image":15,"imageAlt":15,"readingTime":16,"tags":65,"title":71,"updatedAt":72},"6a18674aaa6b273b0c1406eb","5-places-to-find-faq-content-that-improves-ai-visibility","https://seogard.io/blog/5-places-to-find-faq-content-that-improves-ai-visibility","2026-05-28T16:03:22.185Z","2026-05-28","GSC, Reddit, People Also Ask, insights clients et prompts IA : 5 méthodes concrètes pour trouver le FAQ content qui améliore votre visibilité dans les réponses IA.",[66,67,68,69,70],"FAQ content","AI visibility","People Also Ask","Google Search Console","AEO","5 sources de FAQ content qui boostent votre visibilité IA","Thu May 28 2026 16:03:22 GMT+0000 (Coordinated Universal Time)"]