J'ai Créé un Moniteur de Marque IA qui Suit Tous les LLM
L'équipe marketing de Freshdesk avait un problème dont elle n'était pas consciente.
Leur produit était recommandé par Google Search. Mais quand quelqu'un ouvrait ChatGPT — qui gère aujourd'hui 900 millions d'utilisateurs actifs par semaine — et tapait "quel est le meilleur outil de support client pour une équipe de 50 personnes ?", Freshdesk n'apparaissait pas dans la réponse. Gorgias oui. Zendesk oui. Intercom oui. Freshdesk ? Invisible.
C'est le problème que j'ai décidé de résoudre en une seule session de code, une application Next.js et une API de scraping. Une application fonctionnelle qui interroge ChatGPT, Perplexity, Gemini, Grok, Copilot et Google Search pour n'importe quel nom de marque — puis vous dit exactement où vous apparaissez, où vous n'apparaissez pas, et à quoi ressemble le sentiment quand vous apparaissez.
Pourquoi le Classement Google de votre Marque ne Raconte Plus Toute l'Histoire
Le volume des recherches sur les moteurs de recherche devrait chuter de 25 % d'ici 2026, les utilisateurs migrant vers les chatbots IA. ChatGPT seul a dépassé 1 milliard d'utilisateurs actifs mensuels estimés en janvier 2026.
Les LLM ne classent pas des pages. Ils recommandent des marques. Et il y a moins d'une chance sur 100 que ChatGPT donne la même liste de recommandations de marques dans deux réponses à la même requête.
Des outils commerciaux comme Otterly.ai, l'AI Visibility Toolkit de Semrush et Siftly facturent entre 200 et 500 $/mois pour ce suivi. Mais je voulais comprendre les mécanismes en le construisant moi-même.
Le Problème API vs. Navigateur que Personne ne Vous Prévient
La réponse que vous obtenez de l'API de ChatGPT n'est pas la même que celle qu'un utilisateur voit dans le navigateur. L'application web ajoute des optimisations supplémentaires — formatage des citations, liens vers les sources, restructuration des réponses. L'API fournit une complétion brute. Le navigateur offre une expérience curatée avec sources et contexte.
Et Copilot n'a aucune API publique. Vous devez voir ce que l'interface réelle du navigateur affiche.
La géolocalisation ajoute une autre couche. Un utilisateur à Londres demandant à Perplexity "meilleur outil de gestion de projet" obtient des résultats différents d'un utilisateur à San Francisco. Les appels API ne capturent pas cette variance. Le scraping de l'interface utilisateur oui.
Cela a mis fin à mon plan "juste appeler les APIs" dès la première heure. Pour voir ce que voient les vrais utilisateurs, il faut scraper la véritable interface utilisateur.
C'est là que Bright Data est entré dans la construction.
Les Scrapers IA de Bright Data
Le scraper IA de Bright Data : des scrapers préconstruits pour les plateformes IA qui retournent des données structurées — texte de réponse, sources, citations — depuis les interfaces web orientées utilisateur de ChatGPT, Gemini, Copilot, Perplexity et Google SERP.
Les tarifs débutent à 0,001 $ par enregistrement.
Le scraping des plateformes IA n'est pas instantané. Le scraper charge la page, attend que le modèle génère sa réponse (10 à 30 secondes), puis extrait le résultat. Si le scraping prend plus de 60 secondes, Bright Data retourne un ID de snapshot. Vous sondez cet ID avec des requêtes GET jusqu'à ce que le résultat soit prêt.
C'est le pattern trigger-poll-download, et il a fondamentalement façonné l'architecture de l'application.
La Stack : Next.js, SQLite, Drizzle et un Agent de Programmation
- Next.js avec React pour le frontend et les routes API
- SQLite avec Drizzle ORM pour la persistance locale
- Bright Data API pour scraper les six plateformes
- Claude Code comme agent de programmation principal (avec un passage à Cursor à mi-parcours)
Trois tables : brands, scans et results. Chaque résultat stocke le nom du fournisseur, le statut de mention, le sentiment, le texte brut de la réponse et les sources éventuelles.
Ce qui a Mal Tourné : Les Modes de Défaillance de la Première Architecture
Problème 1 : Cascades de timeouts. Quand le scraping d'un fournisseur prenait trop de temps, tout le scan échouait.
Problème 2 : Pas de récupération. Si je fermais mon ordinateur portable, tous les scans en cours disparaissaient.
Problème 3 : Limitation de débit. Plusieurs scans simultanés atteignaient les limites de débit sans mécanisme de retry propre.
Inngest : La File d'Attente en Arrière-Plan qui a Tout Résolu
Avant (fragile) :
- L'utilisateur clique sur "Scan"
- La route API déclenche les six scrapers de manière synchrone
- Attend tous les résultats ou expire
Après (durable) :
- L'utilisateur clique sur "Scan"
- La route API envoie un événement à Inngest
- Inngest déclenche les six scrapers en parallèle, chacun comme une étape séparée
- Chaque étape gère sa propre boucle de polling de manière indépendante
- Les résultats sont écrits dans SQLite au fur et à mesure de leur complétion
- Le frontend interroge les mises à jour et rend les résultats de manière incrémentielle
export const scanBrand = inngest.createFunction(
{
id: "scan-brand",
concurrency: { limit: 3 },
},
{ event: "brand/scan.requested" },
async ({ event, step }) => {
const { brandName, prompt, providers } = event.data;
const results = await Promise.allSettled(
providers.map((provider) =>
step.run(`scrape-${provider}`, async () => {
const snapshot = await triggerScrape(provider, prompt);
const result = await pollForResult(snapshot.id);
const analysis = analyzeMention(result, brandName);
await saveResult(brandName, provider, analysis);
return analysis;
})
)
);
return results;
}
);
Le Passage de Claude Code à Cursor
J'ai basculé vers Cursor utilisant Opus 4.6 à mi-parcours. Le problème venait de mon ingénierie du contexte — quand on alimente plusieurs documentations de fournisseurs à un agent de programmation, il faut structurer le travail comme des tâches séquentielles, chacune ne contenant que la documentation du fournisseur concerné.
Gestion des Six Fournisseurs
ChatGPT : Requiert prompt. country optionnel pour la géolocalisation.
Perplexity : Requiert prompt. Retourne des citations inline.
Gemini AI Mode : Requiert à la fois url et prompt.
Grok : Requiert prompt.
Copilot : Requiert url. Pas d'API publique.
Google SERP : Requiert query (pas prompt).
const PROVIDER_CONFIG = {
chatgpt: {
datasetId: process.env.BRIGHTDATA_CHATGPT_ID,
buildPayload: (prompt: string, country?: string) => ({
prompt,
...(country && { country }),
}),
},
perplexity: {
datasetId: process.env.BRIGHTDATA_PERPLEXITY_ID,
buildPayload: (prompt: string) => ({ prompt }),
},
copilot: {
datasetId: process.env.BRIGHTDATA_COPILOT_ID,
buildPayload: (prompt: string) => ({
url: "https://copilot.microsoft.com",
prompt,
}),
},
};
Ce que j'Aurais Fait Différemment
Commencer avec Inngest dès le départ. Construire d'abord la version synchrone m'a coûté quatre heures de refactorisation.
Simplifier le schéma de la base de données. Les données brutes peuvent vivre sous forme de blob JSON.
Construire le système de planification dès le premier jour. Les scans uniques sont utiles. Suivre les changements dans le temps est précieux.
Gestion des erreurs plus granulaire. "Erreur de limite de débit" → réessayer dans 30 secondes. "Élément introuvable" → l'interface a changé, me prévenir.
L'Argumentaire Business
Des entreprises comme Otterly.ai et Siftly facturent 200 à 500 $/mois pour la surveillance des LLM. L'écart de visibilité entre le SEO traditionnel et les recommandations IA est réel.
Les LLM privilégient la pertinence sémantique et la clarté structurelle par rapport à la seule autorité de domaine. Un commentaire Reddit bien structuré ou un avis détaillé sur un blog de niche peut influencer une recommandation LLM davantage qu'une page d'accueil avec un DA-90.
Étendre le Système
Scans planifiés utilisant le déclencheur cron d'Inngest :
export const scheduledScan = inngest.createFunction(
{ id: "scheduled-brand-scan" },
{ cron: "0 */6 * * *" },
async ({ step }) => {
const brands = await step.run("get-brands", () =>
db.select().from(brands).where(eq(brands.active, true))
);
for (const brand of brands) {
await step.sendEvent("trigger-scan", {
name: "brand/scan.requested",
data: { brandName: brand.name, prompt: brand.defaultPrompt, providers: brand.providers },
});
}
}
);
Alertes : Notification Slack : "Votre marque a été mentionnée par ChatGPT hier mais ne l'est plus aujourd'hui pour 'meilleur CRM pour les startups'."
Analyse de tendances : "Quand j'ai publié cet article comparatif, mon taux de mention dans les LLM a-t-il augmenté ?"
Le Pattern Prêt pour la Production qui Vaut la Peine d'être Copié
La combinaison Bright Data + Inngest + Next.js gère la partie la plus difficile du développement backend : rendre les choses peu fiables fiables.
Arrêtez d'essayer de rendre des appels externes peu fiables fiables uniquement par la gestion des erreurs. Utilisez un moteur de workflow qui traite le manque de fiabilité comme la norme, et construisez votre logique comme une série d'étapes individuellement durables.
Foire aux Questions
Qu'est-ce que la surveillance de marque IA et pourquoi est-ce important ?
Elle suit comment les plateformes IA comme ChatGPT, Perplexity et Gemini mentionnent votre marque quand les utilisateurs demandent des recommandations.
Peut-on utiliser l'API de ChatGPT plutôt que de scraper ?
Les réponses de l'API diffèrent significativement de l'interface du navigateur. Le scraping capture ce que voient les vrais utilisateurs.
Combien cela coûte-t-il de faire tourner le système ?
Bright Data commence à 0,001 $ par enregistrement. Pour 10 marques sur 6 fournisseurs quotidiennement, environ 54 $/mois — bien moins que les alternatives commerciales à 200-500 $/mois.
Pourquoi les recommandations de marques des LLM changent-elles entre les requêtes ?
Les réponses des LLM sont non déterministes. Moins d'une chance sur 100 que ChatGPT donne la même liste de marques dans deux prompts identiques.
Qu'est-ce que le pattern trigger-poll-download ?
Un workflow asynchrone où l'on déclenche une opération longue, on sonde sa complétion, puis on télécharge le résultat quand il est prêt.
Travaillons Ensemble
- Fiverr: fiverr.com/s/EgxYmWD
- Portfolio: mejba.me
- Ramlit Limited: ramlit.com
- ColorPark: colorpark.io
- xCyberSecurity: xcybersecurity.io