[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fqrBzViLLytvPWAEEEPZKQ8uWSi1S8Ieugo6YSrBVIpc":3,"$fCFUp9lWYcpLMszNbL0Uxuy4oXLRKpLTrs3LnY_rKfbU":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},"69de8142aa6b273b0cdacf99","google-s-task-based-agentic-search-is-disrupting-seo-today-not-tomorrow-via-sejournal-martinibuster",0,"Equipe Seogard","Google ne redirige plus simplement des utilisateurs vers des pages. La recherche agentique — task-based agentic search — signifie que l'infrastructure de Google exécute des tâches complètes au nom de l'utilisateur : comparer des prix, réserver un vol, synthétiser un rapport médical. Votre site n'est plus une destination. Il devient un fournisseur de données pour un agent autonome qui décide quoi extraire, quand, et comment le restituer.\n\nCe n'est pas une spéculation. Les annonces de Sundar Pichai lors de Google I/O 2026 et l'évolution documentée par [Search Engine Journal](https://www.searchenginejournal.com/googles-task-based-search/571800/) confirment un virage structurel déjà en cours. Si vous gérez un site de plus de 500 pages, les implications architecturales sont immédiates.\n\n## Ce que signifie \"task-based\" pour le crawl et l'indexation\n\nLa recherche classique fonctionne sur un modèle requête → résultats → clic. L'agent Google, lui, fonctionne sur un modèle tâche → décomposition en sous-tâches → extraction multi-sources → synthèse → action. La différence est fondamentale pour le SEO technique.\n\n### Le crawl devient orienté extraction, pas indexation\n\nDans le modèle classique, Googlebot crawle une page, la rend, en extrait le contenu, et l'indexe pour la servir plus tard en réponse à une requête. Dans le modèle agentique, l'agent a besoin d'une donnée précise **maintenant** — le prix d'un produit, une disponibilité, une spécification technique — et il va la chercher au moment où la tâche l'exige.\n\nCela change la nature du crawl. On passe d'un crawl d'indexation (exhaustif, périodique) à un crawl d'extraction (ciblé, temps réel ou quasi temps réel). Les conséquences directes :\n\n- Les pages dont les données structurées sont absentes ou mal implémentées deviennent invisibles pour l'agent, même si elles rankent en position 1.\n- La fraîcheur des données devient critique — un prix indexé il y a 48h n'a aucune valeur pour un agent qui compare des offres en direct.\n- Le [rendering budget](/blog/rendering-budget-de-google-combien-de-javascript-est-trop) prend une dimension nouvelle : l'agent n'a pas la patience d'attendre 3 secondes de rendering JavaScript pour extraire un prix.\n\n### L'impact mesurable sur un site e-commerce\n\nPrenons un cas concret : un e-commerce mode de 18 000 pages produit, dont 12 000 avec des données structurées `Product` conformes, et 6 000 pages avec des données structurées partielles (pas de `offers`, pas de `availability`).\n\nDans le modèle classique, ces 6 000 pages rankent correctement si le contenu textuel est pertinent. Dans le modèle agentique, quand un utilisateur demande \"trouve-moi une veste imperméable homme sous 120€ disponible en L avec livraison avant vendredi\", l'agent va extraire les données structurées de chaque source. Les 6 000 pages sans `offers.price`, `offers.availability` et `offers.shippingDetails` sont éliminées de la comparaison. Pas dé-indexées — simplement ignorées par l'agent.\n\nVoici ce que devrait contenir le Schema d'une page produit pour être exploitable par un agent :\n\n```json\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Product\",\n  \"name\": \"Veste imperméable Trail Pro\",\n  \"brand\": {\n    \"@type\": \"Brand\",\n    \"name\": \"AlpineRun\"\n  },\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"109.95\",\n    \"priceCurrency\": \"EUR\",\n    \"availability\": \"https://schema.org/InStock\",\n    \"itemCondition\": \"https://schema.org/NewCondition\",\n    \"priceValidUntil\": \"2026-05-01\",\n    \"shippingDetails\": {\n      \"@type\": \"OfferShippingDetails\",\n      \"shippingRate\": {\n        \"@type\": \"MonetaryAmount\",\n        \"value\": \"0\",\n        \"currency\": \"EUR\"\n      },\n      \"deliveryTime\": {\n        \"@type\": \"ShippingDeliveryTime\",\n        \"handlingTime\": {\n          \"@type\": \"QuantitativeValue\",\n          \"minValue\": 0,\n          \"maxValue\": 1,\n          \"unitCode\": \"DAY\"\n        },\n        \"transitTime\": {\n          \"@type\": \"QuantitativeValue\",\n          \"minValue\": 1,\n          \"maxValue\": 3,\n          \"unitCode\": \"DAY\"\n        }\n      }\n    }\n  },\n  \"size\": [\"S\", \"M\", \"L\", \"XL\"],\n  \"color\": \"Noir\",\n  \"material\": \"Gore-Tex 3 couches\"\n}\n```\n\nLa granularité `shippingDetails` avec `deliveryTime` est ce qui permet à l'agent de répondre à la contrainte \"livraison avant vendredi\". Sans cette donnée, votre produit est techniquement invisible pour cette tâche, même s'il est en stock et livrable en 24h.\n\n## Structured data : de l'enrichissement au contrat d'interface\n\nJusqu'ici, les données structurées étaient un bonus — elles amélioraient l'affichage dans les SERP via les rich snippets. Avec la recherche agentique, elles deviennent un **contrat d'interface** entre votre site et l'agent Google.\n\n### Le vocabulaire Schema.org comme API déclarative\n\nL'analogie avec le développement [API-first](/blog/api-first-et-seo-servir-du-contenu-crawlable-depuis-une-api) est pertinente. Vos données structurées sont l'équivalent d'un endpoint REST que l'agent interroge. Si le schéma est incomplet, c'est comme un endpoint qui retourne un 200 avec un body vide — techniquement fonctionnel, pratiquement inutile.\n\nGoogle a déjà posé les bases de cette approche avec le [Merchant Center](https://developers.google.com/shopping-content/guides/products) et les product feeds. Mais la recherche agentique étend ce modèle à tous les types de contenu : articles, services, événements, recettes, FAQ, avis.\n\n### Validation automatisée à l'échelle\n\nSur un site de 15 000+ pages, valider manuellement les données structurées est impossible. Voici un script Node.js pour auditer en masse la conformité des données structurées via l'API Rich Results Test :\n\n```typescript\nimport fetch from 'node-fetch';\nimport { createReadStream } from 'fs';\nimport { parse } from 'csv-parse';\n\ninterface AuditResult {\n  url: string;\n  hasProduct: boolean;\n  hasOffer: boolean;\n  hasAvailability: boolean;\n  hasShipping: boolean;\n  errors: string[];\n}\n\nasync function auditStructuredData(url: string): Promise\u003CAuditResult> {\n  const response = await fetch(\n    'https://searchconsole.googleapis.com/v1/urlInspection:index',\n    {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${process.env.GSC_TOKEN}`,\n      },\n      body: JSON.stringify({\n        inspectionUrl: url,\n        siteUrl: 'https://shop.alpinerun.fr/',\n      }),\n    }\n  );\n\n  const data = await response.json();\n  const richResults = data.inspectionResult?.richResultsResult;\n\n  const detectedItems = richResults?.detectedItems || [];\n  const productItem = detectedItems.find(\n    (i: any) => i.richResultType === 'Product'\n  );\n\n  const issues = productItem?.items?.[0]?.issues || [];\n\n  return {\n    url,\n    hasProduct: !!productItem,\n    hasOffer: !issues.some((i: any) => i.issueMessage?.includes('offers')),\n    hasAvailability: !issues.some((i: any) =>\n      i.issueMessage?.includes('availability')\n    ),\n    hasShipping: !issues.some((i: any) =>\n      i.issueMessage?.includes('shipping')\n    ),\n    errors: issues.map((i: any) => i.issueMessage),\n  };\n}\n\nasync function runAudit(csvPath: string) {\n  const urls: string[] = [];\n  const parser = createReadStream(csvPath).pipe(\n    parse({ columns: true, delimiter: ',' })\n  );\n\n  for await (const row of parser) {\n    urls.push(row.url);\n  }\n\n  const results: AuditResult[] = [];\n  for (const url of urls) {\n    const result = await auditStructuredData(url);\n    results.push(result);\n    // Rate limiting — Google API quota\n    await new Promise((r) => setTimeout(r, 1200));\n  }\n\n  const incomplete = results.filter(\n    (r) => !r.hasOffer || !r.hasAvailability || !r.hasShipping\n  );\n\n  console.log(`Total audité : ${results.length}`);\n  console.log(`Conformes agent-ready : ${results.length - incomplete.length}`);\n  console.log(`Incomplets : ${incomplete.length}`);\n  console.log('\\nPages critiques :');\n  incomplete.forEach((r) => {\n    console.log(`  ${r.url} — ${r.errors.join(', ')}`);\n  });\n}\n\nrunAudit('./product-urls.csv');\n```\n\nCe type d'audit automatisé doit tourner régulièrement — pas une fois par trimestre, mais chaque semaine. Un produit dont le `availability` passe de `InStock` à `OutOfStock` sans que le Schema soit mis à jour envoie un signal contradictoire à l'agent. Un outil de monitoring comme Seogard détecte ces régressions de données structurées automatiquement, sans attendre qu'un crawl Screaming Frog soit lancé manuellement.\n\n## Server-Side Rendering : l'obligation technique face à l'agent\n\nLa recherche agentique renforce une tendance déjà lourde : le contenu doit être disponible dans le HTML initial. Un agent qui exécute une tâche complexe en décomposant 15 sous-requêtes sur 15 sites différents ne va pas attendre que votre SPA React hydrate le DOM pour extraire un prix.\n\n### Le SSR n'est plus optionnel pour les pages transactionnelles\n\nSi vous exploitez un [headless CMS](/blog/headless-cms-et-seo-avantages-et-risques-techniques) couplé à un framework frontend, la question du rendering est tranchée : SSR ou SSG pour toute page qui contient une donnée exploitable par un agent (prix, dispo, specs, avis).\n\nLe cas typique : une équipe migre de Create React App vers Next.js mais conserve le chargement client-side des données produit via `useEffect`. Le HTML servi au crawl contient le squelette de la page mais aucune donnée produit. Googlebot classique finit par rendre la page (avec un délai de jours à semaines). L'agent agentique, lui, passe à la source suivante.\n\nVérification rapide avec `curl` pour identifier les pages à risque :\n\n```bash\n# Vérifier que le prix est présent dans le HTML initial (pas de JS rendering)\ncurl -s -A \"Googlebot\" \"https://shop.alpinerun.fr/veste-trail-pro\" \\\n  | grep -o '\"price\":\"[0-9.]*\"'\n\n# Si rien ne s'affiche, le prix est rendu côté client → invisible pour l'agent\n\n# Vérification en masse depuis un sitemap\ncurl -s \"https://shop.alpinerun.fr/sitemap-products.xml\" \\\n  | grep -oP '\u003Cloc>\\K[^\u003C]+' \\\n  | head -50 \\\n  | while read url; do\n      price=$(curl -s -A \"Googlebot\" \"$url\" | grep -o '\"price\":\"[0-9.]*\"')\n      if [ -z \"$price\" ]; then\n        echo \"FAIL: $url — pas de prix dans le HTML initial\"\n      fi\n    done\n```\n\nCe test prend 2 minutes à mettre en place et peut révéler que 40% de vos pages produit servent un HTML vide au crawler. Pour un e-commerce avec 18 000 URLs produit, cela représente potentiellement 7 200 pages invisibles à l'agent — un trou dans le catalogue.\n\n### Le cas des frameworks et des migrations\n\nSi vous êtes en cours de [migration de framework](/blog/changer-de-framework-next-js-vers-nuxt-ou-l-inverse-sans-perte-seo), la recherche agentique ajoute une contrainte supplémentaire au cahier des charges. Le choix entre `getServerSideProps` (Next.js), `useAsyncData` (Nuxt 3), ou `loader` (Remix) n'est plus seulement une question de performance — c'est une question de visibilité agentique.\n\nLa règle : toute donnée que l'agent pourrait vouloir extraire doit être dans le HTML servi par le serveur. Pas dans un fetch client-side, pas dans un Web Component hydraté, pas dans un iframe.\n\n## Signaux de fraîcheur et crawl en temps réel\n\nL'un des aspects les plus disruptifs de la recherche agentique est l'exigence de fraîcheur. Un agent qui compare des prix en temps réel ne peut pas travailler avec un cache de 72h.\n\n### IndexNow et les mécanismes de notification push\n\nGoogle n'a pas officiellement adopté [IndexNow](https://www.indexnow.org/) (contrairement à Bing), mais le modèle agentique pousse vers un mécanisme similaire : le site notifie le moteur quand une donnée change, plutôt que d'attendre le prochain passage du crawler.\n\nEn attendant une adoption officielle par Google, les mécanismes existants restent : le sitemap avec `\u003Clastmod>` précis, l'API d'indexation Google (limitée aux `JobPosting` et `BroadcastEvent`), et le Merchant Center pour les données produit.\n\nLe `\u003Clastmod>` dans le sitemap doit refléter la date réelle de modification du contenu, pas la date de rebuild du site. Un piège classique avec les SSG : si vous régénérez toutes les pages en même temps, tous les `\u003Clastmod>` passent à la date du build, ce qui dilue le signal de fraîcheur.\n\n```xml\n\u003C!-- Mauvais : toutes les pages ont le même lastmod = date du build -->\n\u003Curl>\n  \u003Cloc>https://shop.alpinerun.fr/veste-trail-pro\u003C/loc>\n  \u003Clastmod>2026-04-14T02:00:00+02:00\u003C/lastmod>\n\u003C/url>\n\u003Curl>\n  \u003Cloc>https://shop.alpinerun.fr/short-running-lite\u003C/loc>\n  \u003Clastmod>2026-04-14T02:00:00+02:00\u003C/lastmod>\n\u003C/url>\n\n\u003C!-- Bon : lastmod = date réelle de la dernière modification produit -->\n\u003Curl>\n  \u003Cloc>https://shop.alpinerun.fr/veste-trail-pro\u003C/loc>\n  \u003Clastmod>2026-04-12T14:23:11+02:00\u003C/lastmod>\n  \u003Cchangefreq>daily\u003C/changefreq>\n\u003C/url>\n\u003Curl>\n  \u003Cloc>https://shop.alpinerun.fr/short-running-lite\u003C/loc>\n  \u003Clastmod>2026-03-28T09:45:00+02:00\u003C/lastmod>\n  \u003Cchangefreq>weekly\u003C/changefreq>\n\u003C/url>\n```\n\nPour les sites e-commerce dont les prix changent plusieurs fois par jour, le [product feed](/blog/why-product-feeds-shouldn-t-be-the-most-ignored-seo-system-in-ecommerce) vers le Merchant Center devient le canal prioritaire. L'agent agentique utilisera probablement les données Merchant Center en priorité sur les données crawlées, simplement parce qu'elles sont plus fraîches et plus structurées.\n\n## Les bots IA et l'accès à vos données : un enjeu de gouvernance\n\nLa recherche agentique n'est pas un monopole Google. OpenAI, Meta, ByteDance et d'autres déploient leurs propres agents qui [crawlent déjà massivement le web](/blog/llms-et-crawl-comment-les-bots-ia-crawlent-votre-site). La question n'est plus \"comment être visible\" mais \"à qui donner accès à quoi\".\n\n### robots.txt à l'ère agentique\n\nLe fichier `robots.txt` devient un outil de politique d'accès aux données, pas seulement de gestion du crawl budget. Un éditeur de contenu premium qui laisse GPTBot et Google-Extended crawler l'intégralité de son contenu offre gratuitement ses données à des agents qui les synthétiseront sans jamais renvoyer de trafic.\n\nLe trade-off est réel : bloquer les bots IA protège votre contenu mais vous rend invisible dans les réponses agentiques. Autoriser le crawl IA vous rend visible mais cannibalise potentiellement votre trafic organique classique.\n\nIl n'y a pas de réponse universelle. Pour un média dont le modèle économique repose sur le trafic, bloquer les agents IA de tiers tout en restant accessible à Googlebot a du sens. Pour un e-commerce dont l'objectif est la transaction, être extractible par tous les agents maximise la surface de vente.\n\nL'approche granulaire est la plus pertinente — autoriser le crawl IA sur les pages produit (où la transaction est l'objectif) et le restreindre sur le contenu éditorial (guides d'achat, articles de blog) qui génère du trafic organique :\n\n```\n# robots.txt — politique différenciée par type de contenu\nUser-agent: Googlebot\nAllow: /\n\nUser-agent: GPTBot\nAllow: /products/\nAllow: /api/products/\nDisallow: /blog/\nDisallow: /guides/\n\nUser-agent: Bytespider\nAllow: /products/\nDisallow: /blog/\nDisallow: /guides/\n\nUser-agent: anthropic-ai\nAllow: /products/\nDisallow: /blog/\nDisallow: /guides/\n```\n\nCette stratégie suppose que vous monitoriez les user-agents des bots IA qui crawlent votre site. Les logs serveur restent la source de vérité — Search Console ne remonte pas les crawls des bots tiers. Un [suivi du trafic bot IA](/blog/openai-meta-bytedance-lead-ai-bot-traffic-in-publishing-via-sejournal-mattgsouthern) est désormais indispensable dans votre stack de monitoring.\n\n## Préparer l'architecture pour la recherche agentique\n\nL'adaptation à la recherche agentique n'est pas un projet SEO ponctuel. C'est un changement d'architecture qui touche le frontend, le backend, le CMS, et le pipeline de données.\n\n### Checklist technique pour un site \"agent-ready\"\n\n**1. Données structurées complètes et à jour.** Chaque type de contenu doit avoir son Schema exhaustif. Pour les produits : `Product` avec `Offer`, `availability`, `shippingDetails`, `returnPolicy`. Pour les articles : `Article` avec `author`, `datePublished`, `dateModified`. Pour les services : `Service` avec `areaServed`, `offers`. Validez avec le [Rich Results Test](https://search.google.com/test/rich-results) et automatisez la validation dans votre CI/CD.\n\n**2. SSR systématique pour les pages à données extractibles.** Vérifiez avec `curl` ou Screaming Frog en mode \"JavaScript rendering off\" que toutes les données critiques sont dans le HTML initial. Chrome DevTools > Network > Disable JavaScript est votre allié pour identifier les régressions.\n\n**3. Sitemap avec `\u003Clastmod>` précis.** Branchez le `lastmod` sur la date réelle de modification en base de données, pas sur la date de déploiement. Si vous utilisez un SSG avec ISR (Incremental Static Regeneration), assurez-vous que la régénération met à jour le sitemap.\n\n**4. Product feed Merchant Center synchronisé.** Pour l'e-commerce, le feed est votre canal le plus direct vers l'agent Google. Un feed mis à jour toutes les 4h avec prix, dispo et délais de livraison vaut mieux qu'un Schema parfait mais crawlé une fois par semaine.\n\n**5. Politique `robots.txt` par type de bot.** Définissez explicitement ce que chaque agent peut crawler. Monitorez les user-agents dans vos logs pour détecter les nouveaux bots.\n\n**6. Monitoring des régressions.** Un Schema valide aujourd'hui peut être cassé demain par un déploiement qui modifie un template produit. Seogard détecte ce type de régression — une balise `application/ld+json` qui disparaît, un champ `price` qui passe à `null`, un `availability` qui n'est plus mis à jour — avant que l'impact sur la visibilité agentique ne soit mesurable.\n\n### L'impact sur les intent gaps\n\nLa recherche agentique modifie la notion même d'intent. Dans le modèle classique, vous optimisez pour des requêtes. Dans le modèle agentique, l'utilisateur ne formule plus de requêtes — il décrit une tâche. L'agent décompose cette tâche en intentions intermédiaires que vous ne verrez jamais dans Search Console.\n\nCela signifie que les [intent gaps classiques](/blog/how-to-measure-intent-gaps-using-google-search-console-data) ne captent qu'une partie de la réalité. Un utilisateur qui dit \"organise mon week-end à Lyon avec un budget de 300€\" déclenche des sous-requêtes implicites sur les hôtels, restaurants, transports, météo, événements — aucune de ces sous-requêtes n'apparaîtra dans vos données Search Console, mais votre contenu sera (ou ne sera pas) utilisé par l'agent.\n\nL'approche pragmatique : modéliser les tâches que vos utilisateurs cibles confieraient à un agent, décomposer ces tâches en sous-besoins informationnels, et s'assurer que chaque sous-besoin est couvert par une page avec des données structurées complètes et extractibles.\n\n## Le parallèle avec AI Overviews et l'évolution du SERP\n\nLa recherche agentique est l'extension logique des [AI Overviews](/blog/google-sge-ai-overviews-quel-impact-sur-le-seo-technique) et de la vision décrite par [Sundar Pichai](/blog/what-pichai-s-interview-reveals-about-google-s-search-direction-via-sejournal-mattgsouthern). Les AI Overviews synthétisent des informations. L'agent agentique va plus loin : il agit, compare, filtre, et potentiellement transige au nom de l'utilisateur.\n\nLes sites qui ont déjà [optimisé pour les moteurs de réponse IA](/blog/optimiser-pour-les-moteurs-de-reponse-ia) ont une longueur d'avance, car les fondamentaux sont les mêmes : contenu extractible, structuré, frais, et rendu côté serveur. Mais la recherche agentique ajoute une couche : la capacité à supporter des interactions programmatiques, pas seulement de la lecture.\n\nLe SEO technique de 2026 n'est plus une discipline d'optimisation de pages. C'est une discipline d'architecture de systèmes d'information accessibles aux agents autonomes. Les sites qui traitent leurs données structurées comme un asset stratégique — au même titre que leur code ou leur base de données — seront ceux que les agents sélectionneront pour exécuter les tâches de leurs utilisateurs.\n\nLa transition est en cours. Le crawl agentique de Google est déjà dans les logs de vos serveurs. La question n'est pas de savoir si cela vous concerne, mais combien de pages de votre site sont prêtes à y répondre.\n```","https://seogard.io/blog/google-s-task-based-agentic-search-is-disrupting-seo-today-not-tomorrow-via-sejournal-martinibuster","Actualités SEO","2026-04-14T18:02:42.687Z","2026-04-14","Google passe à la recherche agentique par tâches. Analyse technique des impacts sur le crawl, le rendering et l'architecture SEO de vos sites.","\u003Cp>Google ne redirige plus simplement des utilisateurs vers des pages. La recherche agentique — task-based agentic search — signifie que l'infrastructure de Google exécute des tâches complètes au nom de l'utilisateur : comparer des prix, réserver un vol, synthétiser un rapport médical. Votre site n'est plus une destination. Il devient un fournisseur de données pour un agent autonome qui décide quoi extraire, quand, et comment le restituer.\u003C/p>\n\u003Cp>Ce n'est pas une spéculation. Les annonces de Sundar Pichai lors de Google I/O 2026 et l'évolution documentée par \u003Ca href=\"https://www.searchenginejournal.com/googles-task-based-search/571800/\">Search Engine Journal\u003C/a> confirment un virage structurel déjà en cours. Si vous gérez un site de plus de 500 pages, les implications architecturales sont immédiates.\u003C/p>\n\u003Ch2>Ce que signifie \"task-based\" pour le crawl et l'indexation\u003C/h2>\n\u003Cp>La recherche classique fonctionne sur un modèle requête → résultats → clic. L'agent Google, lui, fonctionne sur un modèle tâche → décomposition en sous-tâches → extraction multi-sources → synthèse → action. La différence est fondamentale pour le SEO technique.\u003C/p>\n\u003Ch3>Le crawl devient orienté extraction, pas indexation\u003C/h3>\n\u003Cp>Dans le modèle classique, Googlebot crawle une page, la rend, en extrait le contenu, et l'indexe pour la servir plus tard en réponse à une requête. Dans le modèle agentique, l'agent a besoin d'une donnée précise \u003Cstrong>maintenant\u003C/strong> — le prix d'un produit, une disponibilité, une spécification technique — et il va la chercher au moment où la tâche l'exige.\u003C/p>\n\u003Cp>Cela change la nature du crawl. On passe d'un crawl d'indexation (exhaustif, périodique) à un crawl d'extraction (ciblé, temps réel ou quasi temps réel). Les conséquences directes :\u003C/p>\n\u003Cul>\n\u003Cli>Les pages dont les données structurées sont absentes ou mal implémentées deviennent invisibles pour l'agent, même si elles rankent en position 1.\u003C/li>\n\u003Cli>La fraîcheur des données devient critique — un prix indexé il y a 48h n'a aucune valeur pour un agent qui compare des offres en direct.\u003C/li>\n\u003Cli>Le \u003Ca href=\"/blog/rendering-budget-de-google-combien-de-javascript-est-trop\">rendering budget\u003C/a> prend une dimension nouvelle : l'agent n'a pas la patience d'attendre 3 secondes de rendering JavaScript pour extraire un prix.\u003C/li>\n\u003C/ul>\n\u003Ch3>L'impact mesurable sur un site e-commerce\u003C/h3>\n\u003Cp>Prenons un cas concret : un e-commerce mode de 18 000 pages produit, dont 12 000 avec des données structurées \u003Ccode>Product\u003C/code> conformes, et 6 000 pages avec des données structurées partielles (pas de \u003Ccode>offers\u003C/code>, pas de \u003Ccode>availability\u003C/code>).\u003C/p>\n\u003Cp>Dans le modèle classique, ces 6 000 pages rankent correctement si le contenu textuel est pertinent. Dans le modèle agentique, quand un utilisateur demande \"trouve-moi une veste imperméable homme sous 120€ disponible en L avec livraison avant vendredi\", l'agent va extraire les données structurées de chaque source. Les 6 000 pages sans \u003Ccode>offers.price\u003C/code>, \u003Ccode>offers.availability\u003C/code> et \u003Ccode>offers.shippingDetails\u003C/code> sont éliminées de la comparaison. Pas dé-indexées — simplement ignorées par l'agent.\u003C/p>\n\u003Cp>Voici ce que devrait contenir le Schema d'une page produit pour être exploitable par un agent :\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>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org\"\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\">\"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\">\"Veste imperméable Trail Pro\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"brand\"\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\">\"Brand\"\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\">\"AlpineRun\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"offers\"\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\">\"Offer\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"price\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"109.95\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"priceCurrency\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"EUR\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"availability\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/InStock\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"itemCondition\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/NewCondition\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"priceValidUntil\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2026-05-01\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    \"shippingDetails\"\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\">\"OfferShippingDetails\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"shippingRate\"\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\">\"MonetaryAmount\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"value\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"0\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"currency\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"EUR\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \"deliveryTime\"\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\">\"ShippingDeliveryTime\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"handlingTime\"\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\">\"QuantitativeValue\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"minValue\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"maxValue\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"unitCode\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"DAY\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \"transitTime\"\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\">\"QuantitativeValue\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"minValue\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"maxValue\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">3\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">          \"unitCode\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"DAY\"\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\">  \"size\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"S\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"M\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"L\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"XL\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"color\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Noir\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">  \"material\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Gore-Tex 3 couches\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>La granularité \u003Ccode>shippingDetails\u003C/code> avec \u003Ccode>deliveryTime\u003C/code> est ce qui permet à l'agent de répondre à la contrainte \"livraison avant vendredi\". Sans cette donnée, votre produit est techniquement invisible pour cette tâche, même s'il est en stock et livrable en 24h.\u003C/p>\n\u003Ch2>Structured data : de l'enrichissement au contrat d'interface\u003C/h2>\n\u003Cp>Jusqu'ici, les données structurées étaient un bonus — elles amélioraient l'affichage dans les SERP via les rich snippets. Avec la recherche agentique, elles deviennent un \u003Cstrong>contrat d'interface\u003C/strong> entre votre site et l'agent Google.\u003C/p>\n\u003Ch3>Le vocabulaire Schema.org comme API déclarative\u003C/h3>\n\u003Cp>L'analogie avec le développement \u003Ca href=\"/blog/api-first-et-seo-servir-du-contenu-crawlable-depuis-une-api\">API-first\u003C/a> est pertinente. Vos données structurées sont l'équivalent d'un endpoint REST que l'agent interroge. Si le schéma est incomplet, c'est comme un endpoint qui retourne un 200 avec un body vide — techniquement fonctionnel, pratiquement inutile.\u003C/p>\n\u003Cp>Google a déjà posé les bases de cette approche avec le \u003Ca href=\"https://developers.google.com/shopping-content/guides/products\">Merchant Center\u003C/a> et les product feeds. Mais la recherche agentique étend ce modèle à tous les types de contenu : articles, services, événements, recettes, FAQ, avis.\u003C/p>\n\u003Ch3>Validation automatisée à l'échelle\u003C/h3>\n\u003Cp>Sur un site de 15 000+ pages, valider manuellement les données structurées est impossible. Voici un script Node.js pour auditer en masse la conformité des données structurées via l'API Rich Results Test :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> fetch \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'node-fetch'\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\"> { createReadStream } \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\"> { parse } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'csv-parse'\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\"> AuditResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\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\">  hasProduct\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  hasOffer\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  hasAvailability\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  hasShipping\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  errors\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\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> auditStructuredData\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\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>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">AuditResult\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\"> response\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> fetch\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    'https://searchconsole.googleapis.com/v1/urlInspection:index'\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\">      method: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'POST'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      headers: {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        'Content-Type'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'application/json'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        Authorization: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Bearer ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">process\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">env\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#79B8FF\">GSC_TOKEN\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\">\u003Cspan style=\"color:#E1E4E8\">      body: \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\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        inspectionUrl: url,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        siteUrl: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'https://shop.alpinerun.fr/'\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\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> data\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> response.\u003C/span>\u003Cspan style=\"color:#B392F0\">json\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\"> richResults\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> data.inspectionResult?.richResultsResult;\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\"> detectedItems\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> richResults?.detectedItems \u003C/span>\u003Cspan style=\"color:#F97583\">||\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\"> productItem\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> detectedItems.\u003C/span>\u003Cspan style=\"color:#B392F0\">find\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    (\u003C/span>\u003Cspan style=\"color:#FFAB70\">i\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> any\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> i.richResultType \u003C/span>\u003Cspan style=\"color:#F97583\">===\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'Product'\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\"> issues\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> productItem?.items?.[\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]?.issues \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    url,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    hasProduct: \u003C/span>\u003Cspan style=\"color:#F97583\">!!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">productItem,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    hasOffer: \u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">issues.\u003C/span>\u003Cspan style=\"color:#B392F0\">some\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">i\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> any\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> i.issueMessage?.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'offers'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    hasAvailability: \u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">issues.\u003C/span>\u003Cspan style=\"color:#B392F0\">some\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">i\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> any\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      i.issueMessage?.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'availability'\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\">    hasShipping: \u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">issues.\u003C/span>\u003Cspan style=\"color:#B392F0\">some\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">i\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> any\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      i.issueMessage?.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'shipping'\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\">    errors: issues.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">i\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> any\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> i.issueMessage),\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\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> runAudit\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">csvPath\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\"> urls\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[] \u003C/span>\u003Cspan style=\"color:#F97583\">=\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\"> parser\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#B392F0\"> createReadStream\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(csvPath).\u003C/span>\u003Cspan style=\"color:#B392F0\">pipe\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">    parse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ columns: \u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, delimiter: \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\">  for\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> row\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> parser) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    urls.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(row.url);\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\"> results\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> AuditResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\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\"> url\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> urls) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> result\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> auditStructuredData\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(url);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    results.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(result);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Rate limiting — Google API quota\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    await\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#79B8FF\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#B392F0\"> setTimeout\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(r, \u003C/span>\u003Cspan style=\"color:#79B8FF\">1200\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\"> incomplete\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> results.\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\">r\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#F97583\"> !\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r.hasOffer \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#F97583\"> !\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r.hasAvailability \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#F97583\"> !\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r.hasShipping\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:#E1E4E8\">  console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Total audité : ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">results\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\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\">`Conformes agent-ready : ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">results\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#F97583\"> -\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> incomplete\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\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\">`Incomplets : ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">incomplete\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\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\">'\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">Pages critiques :'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  incomplete.\u003C/span>\u003Cspan style=\"color:#B392F0\">forEach\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\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\">`  ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">} — ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">errors\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">join\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">', '\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)\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\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">runAudit\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'./product-urls.csv'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce type d'audit automatisé doit tourner régulièrement — pas une fois par trimestre, mais chaque semaine. Un produit dont le \u003Ccode>availability\u003C/code> passe de \u003Ccode>InStock\u003C/code> à \u003Ccode>OutOfStock\u003C/code> sans que le Schema soit mis à jour envoie un signal contradictoire à l'agent. Un outil de monitoring comme Seogard détecte ces régressions de données structurées automatiquement, sans attendre qu'un crawl Screaming Frog soit lancé manuellement.\u003C/p>\n\u003Ch2>Server-Side Rendering : l'obligation technique face à l'agent\u003C/h2>\n\u003Cp>La recherche agentique renforce une tendance déjà lourde : le contenu doit être disponible dans le HTML initial. Un agent qui exécute une tâche complexe en décomposant 15 sous-requêtes sur 15 sites différents ne va pas attendre que votre SPA React hydrate le DOM pour extraire un prix.\u003C/p>\n\u003Ch3>Le SSR n'est plus optionnel pour les pages transactionnelles\u003C/h3>\n\u003Cp>Si vous exploitez un \u003Ca href=\"/blog/headless-cms-et-seo-avantages-et-risques-techniques\">headless CMS\u003C/a> couplé à un framework frontend, la question du rendering est tranchée : SSR ou SSG pour toute page qui contient une donnée exploitable par un agent (prix, dispo, specs, avis).\u003C/p>\n\u003Cp>Le cas typique : une équipe migre de Create React App vers Next.js mais conserve le chargement client-side des données produit via \u003Ccode>useEffect\u003C/code>. Le HTML servi au crawl contient le squelette de la page mais aucune donnée produit. Googlebot classique finit par rendre la page (avec un délai de jours à semaines). L'agent agentique, lui, passe à la source suivante.\u003C/p>\n\u003Cp>Vérification rapide avec \u003Ccode>curl\u003C/code> pour identifier les pages à risque :\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 que le prix est présent dans le HTML initial (pas de JS rendering)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -A\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Googlebot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"https://shop.alpinerun.fr/veste-trail-pro\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -o\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '\"price\":\"[0-9.]*\"'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Si rien ne s'affiche, le prix est rendu côté client → invisible pour l'agent\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérification en masse depuis un sitemap\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"https://shop.alpinerun.fr/sitemap-products.xml\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -oP\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '&#x3C;loc>\\K[^&#x3C;]+'\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -50\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  |\u003C/span>\u003Cspan style=\"color:#F97583\"> while\u003C/span>\u003Cspan style=\"color:#79B8FF\"> read\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#F97583\">do\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      price\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -A\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Googlebot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -o\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '\"price\":\"[0-9.]*\"'\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\"> [ \u003C/span>\u003Cspan style=\"color:#F97583\">-z\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$price\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C/span>\u003Cspan style=\"color:#F97583\">then\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"FAIL: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> — pas de prix dans le HTML initial\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      fi\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    done\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce test prend 2 minutes à mettre en place et peut révéler que 40% de vos pages produit servent un HTML vide au crawler. Pour un e-commerce avec 18 000 URLs produit, cela représente potentiellement 7 200 pages invisibles à l'agent — un trou dans le catalogue.\u003C/p>\n\u003Ch3>Le cas des frameworks et des migrations\u003C/h3>\n\u003Cp>Si vous êtes en cours de \u003Ca href=\"/blog/changer-de-framework-next-js-vers-nuxt-ou-l-inverse-sans-perte-seo\">migration de framework\u003C/a>, la recherche agentique ajoute une contrainte supplémentaire au cahier des charges. Le choix entre \u003Ccode>getServerSideProps\u003C/code> (Next.js), \u003Ccode>useAsyncData\u003C/code> (Nuxt 3), ou \u003Ccode>loader\u003C/code> (Remix) n'est plus seulement une question de performance — c'est une question de visibilité agentique.\u003C/p>\n\u003Cp>La règle : toute donnée que l'agent pourrait vouloir extraire doit être dans le HTML servi par le serveur. Pas dans un fetch client-side, pas dans un Web Component hydraté, pas dans un iframe.\u003C/p>\n\u003Ch2>Signaux de fraîcheur et crawl en temps réel\u003C/h2>\n\u003Cp>L'un des aspects les plus disruptifs de la recherche agentique est l'exigence de fraîcheur. Un agent qui compare des prix en temps réel ne peut pas travailler avec un cache de 72h.\u003C/p>\n\u003Ch3>IndexNow et les mécanismes de notification push\u003C/h3>\n\u003Cp>Google n'a pas officiellement adopté \u003Ca href=\"https://www.indexnow.org/\">IndexNow\u003C/a> (contrairement à Bing), mais le modèle agentique pousse vers un mécanisme similaire : le site notifie le moteur quand une donnée change, plutôt que d'attendre le prochain passage du crawler.\u003C/p>\n\u003Cp>En attendant une adoption officielle par Google, les mécanismes existants restent : le sitemap avec \u003Ccode>&#x3C;lastmod>\u003C/code> précis, l'API d'indexation Google (limitée aux \u003Ccode>JobPosting\u003C/code> et \u003Ccode>BroadcastEvent\u003C/code>), et le Merchant Center pour les données produit.\u003C/p>\n\u003Cp>Le \u003Ccode>&#x3C;lastmod>\u003C/code> dans le sitemap doit refléter la date réelle de modification du contenu, pas la date de rebuild du site. Un piège classique avec les SSG : si vous régénérez toutes les pages en même temps, tous les \u003Ccode>&#x3C;lastmod>\u003C/code> passent à la date du build, ce qui dilue le signal de fraîcheur.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">&#x3C;!-- Mauvais : toutes les pages ont le même lastmod = date du build -->\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>https://shop.alpinerun.fr/veste-trail-pro&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>2026-04-14T02:00:00+02:00&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>https://shop.alpinerun.fr/short-running-lite&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>2026-04-14T02:00:00+02:00&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">&#x3C;!-- Bon : lastmod = date réelle de la dernière modification produit -->\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>https://shop.alpinerun.fr/veste-trail-pro&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>2026-04-12T14:23:11+02:00&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">changefreq\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>daily&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">changefreq\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>https://shop.alpinerun.fr/short-running-lite&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">loc\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>2026-03-28T09:45:00+02:00&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">lastmod\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  &#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">changefreq\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>weekly&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">changefreq\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">url\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Pour les sites e-commerce dont les prix changent plusieurs fois par jour, le \u003Ca href=\"/blog/why-product-feeds-shouldn-t-be-the-most-ignored-seo-system-in-ecommerce\">product feed\u003C/a> vers le Merchant Center devient le canal prioritaire. L'agent agentique utilisera probablement les données Merchant Center en priorité sur les données crawlées, simplement parce qu'elles sont plus fraîches et plus structurées.\u003C/p>\n\u003Ch2>Les bots IA et l'accès à vos données : un enjeu de gouvernance\u003C/h2>\n\u003Cp>La recherche agentique n'est pas un monopole Google. OpenAI, Meta, ByteDance et d'autres déploient leurs propres agents qui \u003Ca href=\"/blog/llms-et-crawl-comment-les-bots-ia-crawlent-votre-site\">crawlent déjà massivement le web\u003C/a>. La question n'est plus \"comment être visible\" mais \"à qui donner accès à quoi\".\u003C/p>\n\u003Ch3>robots.txt à l'ère agentique\u003C/h3>\n\u003Cp>Le fichier \u003Ccode>robots.txt\u003C/code> devient un outil de politique d'accès aux données, pas seulement de gestion du crawl budget. Un éditeur de contenu premium qui laisse GPTBot et Google-Extended crawler l'intégralité de son contenu offre gratuitement ses données à des agents qui les synthétiseront sans jamais renvoyer de trafic.\u003C/p>\n\u003Cp>Le trade-off est réel : bloquer les bots IA protège votre contenu mais vous rend invisible dans les réponses agentiques. Autoriser le crawl IA vous rend visible mais cannibalise potentiellement votre trafic organique classique.\u003C/p>\n\u003Cp>Il n'y a pas de réponse universelle. Pour un média dont le modèle économique repose sur le trafic, bloquer les agents IA de tiers tout en restant accessible à Googlebot a du sens. Pour un e-commerce dont l'objectif est la transaction, être extractible par tous les agents maximise la surface de vente.\u003C/p>\n\u003Cp>L'approche granulaire est la plus pertinente — autoriser le crawl IA sur les pages produit (où la transaction est l'objectif) et le restreindre sur le contenu éditorial (guides d'achat, articles de blog) qui génère du trafic organique :\u003C/p>\n\u003Cpre>\u003Ccode># robots.txt — politique différenciée par type de contenu\nUser-agent: Googlebot\nAllow: /\n\nUser-agent: GPTBot\nAllow: /products/\nAllow: /api/products/\nDisallow: /blog/\nDisallow: /guides/\n\nUser-agent: Bytespider\nAllow: /products/\nDisallow: /blog/\nDisallow: /guides/\n\nUser-agent: anthropic-ai\nAllow: /products/\nDisallow: /blog/\nDisallow: /guides/\n\u003C/code>\u003C/pre>\n\u003Cp>Cette stratégie suppose que vous monitoriez les user-agents des bots IA qui crawlent votre site. Les logs serveur restent la source de vérité — Search Console ne remonte pas les crawls des bots tiers. Un \u003Ca href=\"/blog/openai-meta-bytedance-lead-ai-bot-traffic-in-publishing-via-sejournal-mattgsouthern\">suivi du trafic bot IA\u003C/a> est désormais indispensable dans votre stack de monitoring.\u003C/p>\n\u003Ch2>Préparer l'architecture pour la recherche agentique\u003C/h2>\n\u003Cp>L'adaptation à la recherche agentique n'est pas un projet SEO ponctuel. C'est un changement d'architecture qui touche le frontend, le backend, le CMS, et le pipeline de données.\u003C/p>\n\u003Ch3>Checklist technique pour un site \"agent-ready\"\u003C/h3>\n\u003Cp>\u003Cstrong>1. Données structurées complètes et à jour.\u003C/strong> Chaque type de contenu doit avoir son Schema exhaustif. Pour les produits : \u003Ccode>Product\u003C/code> avec \u003Ccode>Offer\u003C/code>, \u003Ccode>availability\u003C/code>, \u003Ccode>shippingDetails\u003C/code>, \u003Ccode>returnPolicy\u003C/code>. Pour les articles : \u003Ccode>Article\u003C/code> avec \u003Ccode>author\u003C/code>, \u003Ccode>datePublished\u003C/code>, \u003Ccode>dateModified\u003C/code>. Pour les services : \u003Ccode>Service\u003C/code> avec \u003Ccode>areaServed\u003C/code>, \u003Ccode>offers\u003C/code>. Validez avec le \u003Ca href=\"https://search.google.com/test/rich-results\">Rich Results Test\u003C/a> et automatisez la validation dans votre CI/CD.\u003C/p>\n\u003Cp>\u003Cstrong>2. SSR systématique pour les pages à données extractibles.\u003C/strong> Vérifiez avec \u003Ccode>curl\u003C/code> ou Screaming Frog en mode \"JavaScript rendering off\" que toutes les données critiques sont dans le HTML initial. Chrome DevTools > Network > Disable JavaScript est votre allié pour identifier les régressions.\u003C/p>\n\u003Cp>\u003Cstrong>3. Sitemap avec \u003Ccode>&#x3C;lastmod>\u003C/code> précis.\u003C/strong> Branchez le \u003Ccode>lastmod\u003C/code> sur la date réelle de modification en base de données, pas sur la date de déploiement. Si vous utilisez un SSG avec ISR (Incremental Static Regeneration), assurez-vous que la régénération met à jour le sitemap.\u003C/p>\n\u003Cp>\u003Cstrong>4. Product feed Merchant Center synchronisé.\u003C/strong> Pour l'e-commerce, le feed est votre canal le plus direct vers l'agent Google. Un feed mis à jour toutes les 4h avec prix, dispo et délais de livraison vaut mieux qu'un Schema parfait mais crawlé une fois par semaine.\u003C/p>\n\u003Cp>\u003Cstrong>5. Politique \u003Ccode>robots.txt\u003C/code> par type de bot.\u003C/strong> Définissez explicitement ce que chaque agent peut crawler. Monitorez les user-agents dans vos logs pour détecter les nouveaux bots.\u003C/p>\n\u003Cp>\u003Cstrong>6. Monitoring des régressions.\u003C/strong> Un Schema valide aujourd'hui peut être cassé demain par un déploiement qui modifie un template produit. Seogard détecte ce type de régression — une balise \u003Ccode>application/ld+json\u003C/code> qui disparaît, un champ \u003Ccode>price\u003C/code> qui passe à \u003Ccode>null\u003C/code>, un \u003Ccode>availability\u003C/code> qui n'est plus mis à jour — avant que l'impact sur la visibilité agentique ne soit mesurable.\u003C/p>\n\u003Ch3>L'impact sur les intent gaps\u003C/h3>\n\u003Cp>La recherche agentique modifie la notion même d'intent. Dans le modèle classique, vous optimisez pour des requêtes. Dans le modèle agentique, l'utilisateur ne formule plus de requêtes — il décrit une tâche. L'agent décompose cette tâche en intentions intermédiaires que vous ne verrez jamais dans Search Console.\u003C/p>\n\u003Cp>Cela signifie que les \u003Ca href=\"/blog/how-to-measure-intent-gaps-using-google-search-console-data\">intent gaps classiques\u003C/a> ne captent qu'une partie de la réalité. Un utilisateur qui dit \"organise mon week-end à Lyon avec un budget de 300€\" déclenche des sous-requêtes implicites sur les hôtels, restaurants, transports, météo, événements — aucune de ces sous-requêtes n'apparaîtra dans vos données Search Console, mais votre contenu sera (ou ne sera pas) utilisé par l'agent.\u003C/p>\n\u003Cp>L'approche pragmatique : modéliser les tâches que vos utilisateurs cibles confieraient à un agent, décomposer ces tâches en sous-besoins informationnels, et s'assurer que chaque sous-besoin est couvert par une page avec des données structurées complètes et extractibles.\u003C/p>\n\u003Ch2>Le parallèle avec AI Overviews et l'évolution du SERP\u003C/h2>\n\u003Cp>La recherche agentique est l'extension logique des \u003Ca href=\"/blog/google-sge-ai-overviews-quel-impact-sur-le-seo-technique\">AI Overviews\u003C/a> et de la vision décrite par \u003Ca href=\"/blog/what-pichai-s-interview-reveals-about-google-s-search-direction-via-sejournal-mattgsouthern\">Sundar Pichai\u003C/a>. Les AI Overviews synthétisent des informations. L'agent agentique va plus loin : il agit, compare, filtre, et potentiellement transige au nom de l'utilisateur.\u003C/p>\n\u003Cp>Les sites qui ont déjà \u003Ca href=\"/blog/optimiser-pour-les-moteurs-de-reponse-ia\">optimisé pour les moteurs de réponse IA\u003C/a> ont une longueur d'avance, car les fondamentaux sont les mêmes : contenu extractible, structuré, frais, et rendu côté serveur. Mais la recherche agentique ajoute une couche : la capacité à supporter des interactions programmatiques, pas seulement de la lecture.\u003C/p>\n\u003Cp>Le SEO technique de 2026 n'est plus une discipline d'optimisation de pages. C'est une discipline d'architecture de systèmes d'information accessibles aux agents autonomes. Les sites qui traitent leurs données structurées comme un asset stratégique — au même titre que leur code ou leur base de données — seront ceux que les agents sélectionneront pour exécuter les tâches de leurs utilisateurs.\u003C/p>\n\u003Cp>La transition est en cours. Le crawl agentique de Google est déjà dans les logs de vos serveurs. La question n'est pas de savoir si cela vous concerne, mais combien de pages de votre site sont prêtes à y répondre.\u003C/p>\n\u003Cpre>\u003Ccode>\u003C/code>\u003C/pre>",null,12,[18,19,20,21,22],"agentic search","google AI","SEO technique","crawl budget","structured data","Agentic Search Google : impact SEO technique concret","Tue Apr 14 2026 18:02:42 GMT+0000 (Coordinated Universal Time)",[26,40,55],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":12,"description":31,"image":15,"imageAlt":15,"readingTime":16,"tags":32,"title":38,"updatedAt":39},"69de570daa6b273b0cb90dc2","google-lists-9-scenarios-that-explain-how-it-picks-canonical-urls-via-sejournal-martinibuster","https://seogard.io/blog/google-lists-9-scenarios-that-explain-how-it-picks-canonical-urls-via-sejournal-martinibuster","2026-04-14T15:02:37.538Z","Analyse technique des 9 scénarios où Google choisit une URL canonique. Code, configs et stratégies pour garder le contrôle de vos canonicals.",[33,34,35,36,37],"canonical","google","indexation","duplicate-content","seo-technique","Canonicalisation Google : les 9 scénarios décryptés","Tue Apr 14 2026 15:02:37 GMT+0000 (Coordinated Universal Time)",{"_id":41,"slug":42,"__v":6,"author":7,"canonical":43,"category":10,"createdAt":44,"date":45,"description":46,"image":15,"imageAlt":15,"readingTime":47,"tags":48,"title":53,"updatedAt":54},"69db3593aa6b273b0c387277","why-product-feeds-shouldn-t-be-the-most-ignored-seo-system-in-ecommerce","https://seogard.io/blog/why-product-feeds-shouldn-t-be-the-most-ignored-seo-system-in-ecommerce","2026-04-12T06:02:59.904Z","2026-04-12","Les product feeds pilotent Google Shopping, structured data et AI search. Voici comment les transformer en levier SEO technique majeur.",14,[49,50,22,51,52],"product feeds","ecommerce SEO","Google Merchant Center","AI search","Product Feeds & SEO : le système le plus négligé du e-commerce","Sun Apr 12 2026 06:02:59 GMT+0000 (Coordinated Universal Time)",{"_id":56,"slug":57,"__v":6,"author":7,"canonical":58,"category":10,"createdAt":59,"date":45,"description":60,"image":15,"imageAlt":15,"readingTime":16,"tags":61,"title":65,"updatedAt":66},"69db6dc1aa6b273b0c6553f6","google-says-it-can-handle-multiple-urls-to-the-same-content-via-sejournal-martinibuster","https://seogard.io/blog/google-says-it-can-handle-multiple-urls-to-the-same-content-via-sejournal-martinibuster","2026-04-12T10:02:41.445Z","Google affirme gérer les URLs multiples pointant vers un même contenu. Analyse technique des mécanismes réels, limites et configurations à maîtriser.",[62,33,21,63,64],"duplicate content","google indexation","urls multiples","Duplicate content et URLs multiples : ce que Google gère vraiment","Sun Apr 12 2026 10:02:41 GMT+0000 (Coordinated Universal Time)"]