Felo API PlatformFelo API Platform

Recherche

Transformez une requête de recherche en brief de contenu SEO

Regardez quelles pages répondent aujourd’hui, lisez-les en Markdown, cartographiez les questions couvertes et manquées, puis écrivez un brief dont le rédacteur peut tirer un plan.

Temps25 minutesNiveauIntermédiaireMis à jour2026-10-30
Pour quiMarketing de contenuSpécialistes SEOÉditeurs

Copier le prompt

Remplacez les champs entre crochets, puis collez dans Claude Code, Codex ou toute IA avec accès au terminal. Elle installe le skill Felo, demande avant de dépenser des crédits et exécute le workflow.

Rédige un brief de contenu SEO pour la requête [requête cible] pour [produit ou site].

Public : [lecteur]. Marché et langue : [région], [langue]. Angle : [guide / comparatif / page produit]. Décision éclairée : [nouvel article / mise à jour / combler un manque].

Lis d’abord ce qui répond aujourd’hui à cette requête avant de proposer un plan. Produis un brief Markdown avec :
1. La requête cible et l’intention que tu en déduis, avec les preuves de cette lecture.
2. Ce que couvrent les pages actuelles : titre, URL et sections d’ouverture.
3. Les questions auxquelles les pages actuelles répondent, et celles qu’elles manquent.
4. Un plan proposé avec une ligne par section indiquant ce qu’elle doit prouver.
5. Des preuves et exemples issus des sources, avec liens.
6. Une liste complète des sources.

Règles :
- Ne revendique aucun volume de recherche, difficulté de mot-clé, position ou trafic. Ce workflow ne les mesure pas ; écris « Non mesuré ici » plutôt qu’un chiffre.
- N’invente ni statistiques, ni citations, ni affirmations sur le contenu des concurrents.
- Décris l’intention comme une lecture des pages, pas comme un fait mesuré.
- Garde les citations courtes, attribuées et liées.
- Transforme la région et la langue en valeurs explicites.
- Avant de consommer des crédits, montre les appels API prévus et attends mon accord.
- Ne publie, ne planifie et n’envoie rien.
- Écris le résultat dans ./seo-brief.md et résume-le dans le chat.

La copie inclut aussi les étapes d'installation et les règles de sécurité.

Ce que vous obtenez

Exemple de sortie d'une exécution. Pas de génération en direct.

Exemple de brief (extrait)

Brief SEO — « comment automatiser le triage support »

Requête cible et intention

Requête : « comment automatiser le triage support ». Les pages renvoyées commencent par des étapes de mise en œuvre, pas par des pages produit ; l’intention se lit donc comme un how-to. C’est une lecture des pages, pas un label d’intention mesuré.

Ce que couvrent les pages actuelles

PageURLCommence par
Automatiser le triage support : guide pratiquehttps://example.com/guideRègles de routage, puis tags
Checklist d’automatisation du triagehttps://example.com/checklistLa checklist elle-même

Questions auxquelles les pages répondent

  • Ce que change l’automatisation du triage
  • Par quelles règles de routage commencer

Questions qu’elles manquent

  • Comment mesurer si le triage s’est vraiment amélioré
  • Que faire quand le classifieur se trompe

Plan proposé

  1. Ce que change l’automatisation du triage — prouver qu’il s’agit de la file, pas des effectifs.
  2. Les trois premières règles de routage à automatiser — prouver chacune par un exemple.
  3. Comment le mesurer le premier mois — prouver avec un indicateur qu’un responsable ops peut sortir.
  4. Quand l’automatisation se trompe — prouver le chemin de repli humain.

Preuves

  • Exemple de règle de routage, cité depuis https://example.com/guide (vérifié le 2026-10-30)

Non mesuré ici

Volume de recherche, difficulté du mot-clé et position. Ce workflow lit des pages publiques ; il n’interroge pas d’index de recherche ni de tracker de position.

Sources

  • https://example.com/guide
  • https://example.com/checklist

Les appels exacts

Pour les développeurs : le même workflow en code, dans l'ordre d'exécution.

Afficher les appels API
  1. Voyez qui répond aujourd’hui

    Interrogez Chat sur la requête et obtenez la réponse et les pages citées. Ces pages sont le contenu concurrent actuel.

    seo-brief.ts
    const BASE = "https://openapi.felo.ai";
    const headers = {
      Authorization: `Bearer ${process.env.FELO_API_KEY}`,
      "Content-Type": "application/json",
    };
    
    async function felo<T>(path: string, body?: unknown): Promise<T> {
      const res = await fetch(`${BASE}${path}`, {
        method: body ? "POST" : "GET",
        headers,
        body: body ? JSON.stringify(body) : undefined,
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<T>;
    }
    
    type ChatData = {
      data: {
        answer: string;
        resources: { link: string; title: string; snippet: string }[];
      };
    };
    
    const query = "how to automate support triage";
    const ourSite = "example.com";
    
    const coverage = await felo<ChatData>("/v2/chat", {
      query: `What pages currently answer the search query "${query}"? List the pages and what each one covers.`,
    });
    
    const candidates = coverage.data.resources
      .filter((resource) => !resource.link.includes(ourSite))
      .slice(0, 5)
      .map((resource) => ({ url: resource.link, title: resource.title }));

    Exemple de sortie

    {
      "answer": "Readers searching this usually want a step-by-step …",
      "sources": [
        { "link": "https://example.com/guide", "title": "…", "snippet": "…" }
      ]
    }
  2. Lisez les pages en Markdown

    Récupérez les trois à cinq pages les plus solides avec Web Fetch en Markdown, en gardant titres et questions.

    seo-brief.ts
    type ExtractData = { data: { content: string } };
    
    const pages = await Promise.all(
      candidates.map(async (page) => {
        const res = await felo<ExtractData>("/v2/web/extract", {
          url: page.url,
          output_format: "markdown",
          with_readability: true,
          with_cache: true,
        });
        const checkedAt = new Date().toISOString().slice(0, 10);
        return { ...page, checkedAt, content: res.data.content };
      }),
    );

    Exemple de sortie

    {
      "url": "https://example.com/guide",
      "checkedAt": "2026-10-30",
      "content": "# Automating support triage\n\n## Routing rules\n…"
    }
  3. Cartographiez couverture et lacunes

    Extrayez les H2/H3 et les questions FAQ de chaque page et faites un tableau : quelles questions sont répondues, lesquelles manquent ?

    seo-brief.ts
    type Heading = { page: string; heading: string };
    
    const headings: Heading[] = pages.flatMap((page) =>
      page.content
        .split("\n")
        .filter((line) => line.startsWith("## "))
        .map((line) => ({
          page: page.title,
          heading: line.replace(/^##\s+/, ""),
        })),
    );
    
    const questions = headings.filter((item) => item.heading.includes("?"));
    
    const byTopic = new Map<string, string[]>();
    for (const item of headings) {
      byTopic.set(item.heading, [...(byTopic.get(item.heading) ?? []), item.page]);
    }

    Exemple de sortie

    // questions
    [
      { "page": "…", "heading": "What routes should you automate first?" }
    ]
  4. Écrivez le brief

    Décrivez requête cible, intention, comparaison de couverture, questions manquantes, plan proposé et liste de sources.

    seo-brief.ts
    const today = new Date().toISOString().slice(0, 10);
    
    const brief = [
      `# SEO brief — "${query}"`,
      `Checked ${today}. Site: ${ourSite}.`,
      "",
      "## Intent read",
      "The pages returned for this query lead with: " +
        headings.slice(0, 6).map((item) => item.heading).join("; ") +
        ". This is a reading of their structure, not a measured intent label.",
      "",
      "## What the pages cover",
      "| Page | URL | Checked |",
      "| --- | --- | --- |",
      ...pages.map((page) => `| ${page.title} | ${page.url} | ${page.checkedAt} |`),
      "",
      "## Questions the pages answer",
      ...questions.map((item) => `- ${item.heading} (${item.page})`),
      "",
      "## Topics more than one page covers",
      ...[byTopic.entries()]
        .filter(([, pageTitles]) => pageTitles.length > 1)
        .map(([heading, pageTitles]) => `- ${heading} (${pageTitles.length} pages)`),
      "",
      "## Proposed outline",
      ...questions.slice(0, 5).map((item, index) => `${index + 1}. ${item.heading}`),
      "",
      "## Questions they miss",
      "<!-- Only questions none of the fetched pages answer. Delete this comment when filled. -->",
      "",
      "## Not measured here",
      "Search volume, keyword difficulty, and ranking position. This workflow reads public pages; it does not query a search index or a rank tracker.",
      "",
      "## Sources",
      ...pages.map((page) => `- ${page.title}: ${page.url}`),
    ].join("\n");
    
    console.log(brief);

    Exemple de sortie

    # SEO brief — "how to automate support triage"
  5. Enregistrez dans le LiveDoc

    Enregistrez le brief et les liens des pages dans le LiveDoc pour que la prochaine mise à jour ne récupère que les changements.

    seo-brief.ts
    type LiveDocData = { data: { short_id: string } };
    
    const briefDoc = await felo<LiveDocData>("/v2/livedocs", {
      name: `SEO briefs: ${ourSite}`,
      description: "One document resource per target query",
    });
    
    await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/urls`, {
      urls: pages.map((page) => ({ url: page.url, title: page.title })),
    });
    
    await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/doc`, {
      title: `SEO brief — ${query}`,
      content: brief,
    });
    
    console.log(briefDoc.data.short_id); // the next query adds to this archive

    Exemple de sortie

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Ce qui est inclus

  • Liste de pages sourcée par Chat et liens de réponse
  • Meilleures pages actuelles en Markdown
  • Titres et questions qu’elles couvrent
  • Brief dont on peut tirer un plan immédiatement
  • LiveDoc avec les sources pour la prochaine mise à jour

Ce qu'elle ne fait pas

  • Ne mesure pas les positions, volumes, difficulté ou trafic
  • Pages publiques uniquement ; login et paywall peuvent échouer
  • Ne publie pas et ne réécrit pas l’article entier
  • Une exécution par requête ; plusieurs requêtes demandent votre boucle
  • Ne garantit pas les positions

Questions

Mesure-t-il le volume ou les positions ?

Non. Il lit des pages publiques et évalue quel contenu répond à la requête aujourd’hui ; positions et volumes restent dans vos outils SEO.

D’où viennent les données ?

Chat renvoie des pages sourcées et Web Fetch les transforme en Markdown. Chaque évaluation du brief pointe vers une page et une date précises.

Puis-je traiter plusieurs requêtes ?

Oui, mais une à la fois. Répétez les étapes pour chaque requête et enregistrez des briefs séparés.

Pour quelles requêtes ?

Information, comparaison et « comment faire », car les pages publiques donnent assez de signal. Les requêtes transactionnelles demandent vos données produit et conversion.

Écrit-il l’article ?

Non. Il produit le brief et le plan ; l’écriture revient à l’éditeur ou à votre agent rédacteur.

Combien coûte une exécution ?

Chat et extraction de pages consomment des crédits à l’usage ; les tarifs actuels sont sur la page des prix. Le prompt demande votre accord avant dépense.

Workflows liés

Adaptez-la

La même recette, adaptée à votre façon de livrer.

Requêtes comparatives seulement

Limitez-vous à « X vs Y » et « meilleur X » pour mieux voir l’angle de différenciation.

Ajoutez votre page produit

Ajoutez la page produit comme source supplémentaire pour que le plan atterrisse sur vos fonctions et prix.

Actualisez chaque trimestre

Relancez dans le même LiveDoc et observez l’évolution des pages concurrentes et du plan.

Les pages de référence derrière cette recette et la suite.