Felo API PlatformFelo API Platform

Riset

Ubah kueri pencarian menjadi brief konten SEO

Lihat halaman mana yang menjawab hari ini, baca sebagai Markdown, petakan pertanyaan yang tercakup dan terlewat, lalu tulis brief agar penulis bisa menyusun kerangka.

Waktu25 menitTingkatMenengahDiperbarui2026-10-30
Untuk siapaContent marketingSpesialis SEOEditor

Salin prompt

Ganti kolom dalam kurung siku lalu tempel ke Claude Code, Codex, atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum memakai kredit, dan menjalankan alur kerja.

Tulis ringkasan konten SEO untuk kueri [kueri target] untuk [produk atau situs].

Audiens: [pembaca]. Pasar dan bahasa: [wilayah], [bahasa]. Sudut: [panduan / perbandingan / halaman produk]. Keputusan yang didukung: [artikel baru / penyegaran / menutup celah].

Baca dulu apa yang saat ini menjawab kueri ini sebelum menyusun outline. Hasilkan ringkasan Markdown berisi:
1. Kueri target dan niat pencarian yang kamu simpulkan, dengan bukti pembacaan itu.
2. Apa yang dicakup halaman saat ini: judul, URL, dan bagian pembuka.
3. Pertanyaan yang dijawab halaman saat ini dan pertanyaan yang terlewat.
4. Outline usulan dengan satu baris per bagian tentang apa yang harus dibuktikan.
5. Bukti dan contoh dari sumber, dengan tautan.
6. Daftar sumber lengkap.

Aturan:
- Jangan mengklaim volume pencarian, kesulitan kata kunci, peringkat, atau lalu lintas. Alur ini tidak mengukurnya; tulis “Tidak diukur di sini” alih-alih angka.
- Jangan mengarang statistik, kutipan, atau klaim tentang konten pesaing.
- Jelaskan niat sebagai pembacaan halaman, bukan fakta terukur.
- Jaga kutipan tetap singkat, diberi atribusi, dan bertautan.
- Ubah wilayah dan bahasa menjadi nilai eksplisit.
- Sebelum memakai kredit, tampilkan panggilan API yang direncanakan dan tunggu persetujuan saya.
- Jangan menerbitkan, menjadwalkan, atau mengirim apa pun.
- Tulis hasilnya ke ./seo-brief.md dan ringkas di chat.

Salinan juga menyertakan langkah pemasangan dan aturan keamanan.

Yang Anda dapatkan

Contoh keluaran dari satu eksekusi. Bukan pembuatan langsung.

Contoh ringkasan (kutipan)

Ringkasan SEO — “cara mengotomatiskan triase dukungan”

Kueri target dan niat

Kueri: “cara mengotomatiskan triase dukungan”. Halaman yang dikembalikan dimulai dengan langkah implementasi, bukan halaman produk, jadi niatnya terbaca sebagai how-to. Ini pembacaan halaman, bukan label niat terukur.

Apa yang dicakup halaman saat ini

HalamanURLDimulai dengan
Mengotomatiskan triase dukungan: panduan praktishttps://example.com/guideAturan routing, lalu tag
Checklist otomatisasi triasehttps://example.com/checklistChecklist itu sendiri

Pertanyaan yang dijawab

  • Apa yang berubah dengan otomatisasi triase
  • Aturan routing mana yang pertama

Pertanyaan yang terlewat

  • Cara mengukur apakah triase benar-benar membaik
  • Apa yang dilakukan saat classifier salah

Kerangka usulan

  1. Apa yang berubah — buktikan ini soal antrean, bukan jumlah staf.
  2. Tiga aturan routing pertama — buktikan masing-masing dengan contoh.
  3. Cara mengukurnya di bulan pertama — buktikan dengan metrik yang bisa diambil pemimpin ops.
  4. Saat otomatisasi salah — buktikan jalur fallback manusia.

Bukti

  • Contoh aturan routing, dikutip dari https://example.com/guide (diperiksa 2026-10-30)

Tidak diukur di sini

Volume pencarian, kesulitan kata kunci, dan posisi. Alur ini membaca halaman publik; tidak meminta indeks pencarian atau pelacak posisi.

Sumber

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

Panggilan persisnya

Untuk developer: alur kerja yang sama sebagai kode, sesuai urutan eksekusi.

Tampilkan panggilan API asli
  1. Lihat siapa yang menjawab hari ini

    Tanya Chat tentang kueri dan dapatkan jawaban serta halaman yang dikutip. Halaman itu adalah konten pesaing saat ini.

    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 }));

    Contoh keluaran

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

    Unduh tiga sampai lima halaman terkuat dengan Web Fetch sebagai Markdown, simpan judul dan pertanyaan.

    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 };
      }),
    );

    Contoh keluaran

    {
      "url": "https://example.com/guide",
      "checkedAt": "2026-10-30",
      "content": "# Automating support triage\n\n## Routing rules\n…"
    }
  3. Petakan cakupan dan celah

    Ekstrak H2/H3 dan pertanyaan FAQ tiap halaman lalu buat tabel: pertanyaan mana yang terjawab dan mana yang tidak.

    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]);
    }

    Contoh keluaran

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

    Jelaskan kueri, intent, perbandingan cakupan, pertanyaan yang hilang, kerangka usulan, dan daftar sumber.

    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);

    Contoh keluaran

    # SEO brief — "how to automate support triage"
  5. Simpan di LiveDoc

    Simpan brief dan tautan halaman di LiveDoc agar pembaruan berikutnya hanya mengunduh perubahan.

    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

    Contoh keluaran

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Termasuk

  • Daftar halaman bersumber dari Chat dan tautan jawaban
  • Halaman teratas saat ini dalam Markdown
  • Judul dan pertanyaan yang dicakup
  • Brief yang bisa langsung dijadikan kerangka
  • LiveDoc dengan sumber untuk pembaruan berikutnya

Yang tidak dilakukan

  • Tidak mengukur peringkat, volume, kesulitan, atau traffic
  • Hanya halaman publik; login dan paywall bisa gagal
  • Tidak menerbitkan atau menulis ulang seluruh artikel
  • Satu eksekusi per kueri; beberapa kueri butuh loop Anda
  • Tidak menjamin peringkat

Pertanyaan

Apakah mengukur volume atau peringkat?

Tidak. Ia membaca halaman publik dan menilai konten mana yang menjawab hari ini; peringkat dan volume ada di alat SEO Anda.

Dari mana datanya?

Chat mengembalikan halaman bersumber dan Web Fetch mengubahnya menjadi Markdown. Setiap penilaian menunjuk halaman dan tanggal tertentu.

Bisa menangani beberapa kueri?

Bisa, tetapi satu per satu. Ulangi langkah per kueri dan simpan brief terpisah.

Untuk kueri apa cocok?

Informasional, perbandingan, dan “cara melakukan”, karena halaman publik memberi sinyal cukup. Kueri transaksional butuh data produk dan konversi Anda.

Apakah ia menulis artikelnya?

Tidak. Ia menghasilkan brief dan kerangka; penulisan oleh editor atau writing agent Anda.

Berapa biaya satu eksekusi?

Chat dan ekstraksi memakai kredit sesuai pemakaian; tarif saat ini di halaman harga. Prompt meminta persetujuan sebelum mengeluarkan biaya.

Alur kerja terkait

Sesuaikan

Resep yang sama, disesuaikan dengan cara Anda benar-benar mengirim.

Hanya kueri perbandingan

Batasi ke “X vs Y” dan “X terbaik” untuk melihat sudut diferensiasi.

Tambahkan halaman produk Anda

Sertakan halaman produk sebagai sumber tambahan agar kerangka berpijak pada fitur dan harga Anda.

Perbarui tiap kuartal

Jalankan ulang di LiveDoc yang sama dan lihat perubahan halaman pesaing serta kerangka.

Halaman referensi di balik resep ini dan langkah berikutnya.