Felo API PlatformFelo API Platform

콘텐츠

소셜 대화를 주간 리스닝 브리프로 바꾸기

지난주 브랜드와 경쟁사 관련 X 게시물을 검색하고 출처 있는 웹 맥락을 더하고 배경 페이지를 읽은 뒤 매호를 아카이브해 다음 주는 아는 것에서 시작합니다.

소요 시간25분난이도중급업데이트2026-10-30
대상브랜드·커뮤니케이션제품 마케팅커뮤니티 관리

프롬프트 복사

대괄호 항목을 바꾼 뒤 Claude Code, Codex 또는 터미널에 접근할 수 있는 AI에 붙여넣으세요. Felo 스킬을 설치하고 크레딧을 쓰기 전에 확인한 뒤 워크플로를 실행합니다.

[브랜드, 제품, 카테고리]의 소셜 리스닝 브리프를 실행해 주세요.

모니터링 단어: [브랜드], [제품명], [경쟁사명], [카테고리 키워드].
기간: 최근 [7 / 14]일. 시간대: [시간대]. 독자: [팀].
허용 출처: 공개 X 게시물과 공개 웹 페이지.

다음을 작성해 주세요.
1. 대화에서 무엇이 바뀌었는지 다섯 줄 요약.
2. 테마별로 사람들이 하는 말, 이를 뒷받침하는 게시물, 그 게시물이 다루는 날짜 범위.
3. 경쟁사 언급: 누가, 어떤 맥락에서 추천되는지.
4. 위험: 불만, 장애, 반복 질문, 반발.
5. 다음 단계를 "지금 답변", "관찰", "제품에 전달"로 나누기.
6. 모든 게시물과 페이지의 URL과 날짜가 있는 출처 목록.

규칙:
- API가 반환한 게시물과 페이지만 보고하세요. 감정 점수, 참여 수치, 인용, 출처를 지어내지 마세요.
- X는 신호로 다루고 대표성 있는 설문으로 보지 마세요. 결론을 내리기엔 표본이 너무 작으면 그렇다고 밝혀 주세요.
- 고객의 말과 당신의 요약을 구분하고, 짧게 인용하고 링크를 붙여 주세요.
- 기간을 명시적인 시작일과 종료일로 확정하고 시간대를 밝혀 주세요.
- 크레딧을 쓰기 전에 실행할 검색과 추출을 보여 주고 제 승인을 기다려 주세요.
- 답변, 게시, 팔로우, 메시지 발송을 하지 마세요. 이 브리프는 읽기 전용입니다.
- 결과를 ./social-listening.md에 쓰고 채팅에서 요약해 주세요.

복사 내용에는 설치 단계와 안전 규칙도 포함됩니다.

완성되는 것

실행 시 예제 출력입니다. 실시간 생성이 아닙니다.

브리프 예시(발췌)

소셜 리스닝 브리프 — 2026-10-30

무엇이 바뀌었나

  • 내보내기 흐름 불만이 최대 테마가 됐다.
  • 가격 스레드에서 더 싼 경쟁사가 추천된다.
  • 2026-10-27 장애는 더 이상 언급되지 않는다.

테마

  1. 업데이트 이후 내보내기가 느림 — @example_dev: “40페이지 문서 내보내기 버튼이 이제 몇 분 걸린다.”(2026-10-28); @example_ops: “월말에 내보내기 대기하는 사람 또 있나?”(2026-10-29)
  2. 더 싼 대안이 추천됨 — Example Rival이 더 낮은 가격을 묻는 스레드에 등장

경쟁사

더 싼 대안을 물을 때 Example Rival이 추천된다. 추천은 기능이 아니라 가격에 관한 것이다.

위험

내보내기 불만이 지원 인접 스레드에도 나타나 이탈 대화로 번질 수 있다.

다음

  • 지금 답변: 2026-10-28 내보내기 스레드.
  • 관찰: 불만이 API 사용자층으로 퍼지는지.
  • 제품에 전달: 월말 내보내기 지연.

출처

  • https://x.com/example_dev/status/... — 2026-10-28
  • https://example.com/export-thread — 2026-10-29

실제 호출

개발자용: 같은 워크플로를 실행 순서대로 담은 복사 가능한 코드.

실제 API 호출 보기
  1. 지난주 게시물 검색하기

    X Search로 브랜드명과 경쟁사명을 검색하고 최근 7일로 제한해 계정과 날짜를 남깁니다.

    listening.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 XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          metrics: { retweet_count: number; favorite_count: number; reply_count: number };
          url: string;
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 7 * 24 * 60 * 60 * 1000) / 1000);
    
    const search = await felo<XData>("/v2/x/tweet/search", {
      query: '"Acme" OR "Acme app"',
      limit: 50,
      since_time: since,
    });
    
    const posts = search.data.tweets;

    예제 출력

    { "data": { "tweets": [
      {
        "content": "The export flow is slow again.",
        "author": { "username": "example_dev" },
        "created_at": "2026-10-28T09:14:00Z",
        "metrics": { "retweet_count": 4, "favorite_count": 21, "reply_count": 6 },
        "url": "https://x.com/example_dev/status/..."
      }
    ] } }
  2. 출처 있는 웹 배경 더하기

    Chat에 논의 배경을 묻고 출처 있는 웹 페이지 목록을 가져옵니다.

    listening.ts
    type ChatData = {
      data: {
        answer: string;
        resources: { link: string; title: string; snippet: string }[];
      };
    };
    
    const context = await felo<ChatData>("/v2/chat", {
      query: "Recent customer complaints and competitor mentions around Acme",
    });
    
    const sources = context.data.resources.slice(0, 5);

    예제 출력

    {
      "answer": "The main threads are …",
      "sources": [
        { "link": "https://example.com/thread", "title": "…", "snippet": "…" }
      ]
    }
  3. 배경 페이지 읽기

    Web Fetch로 가장 관련 있는 2~3페이지를 읽고 사실 배경과 링크를 보충합니다.

    listening.ts
    type ExtractData = { data: { content: string } };
    
    const pages = await Promise.all(
      sources.slice(0, 3).map((source) =>
        felo<ExtractData>("/v2/web/extract", {
          url: source.link,
          output_format: "markdown",
          with_readability: true,
          with_cache: true,
        }).then((page) => ({ ...source, content: page.data.content })),
      ),
    );

    예제 출력

    // pages[0].content
    "# Example thread summary\n\nExtracted page content…"
  4. 주제별 주간 보고서 쓰기

    주제, 대표 게시물, 배경, 리스크, 다음 주 주목점으로 Markdown을 구성합니다.

    listening.ts
    const date = new Date().toISOString().slice(0, 10);
    
    const ranked = [...posts].sort(
      (a, b) => b.metrics.favorite_count - a.metrics.favorite_count,
    );
    
    const brief = [
      `# Social listening brief — ${date}`,
      "",
      "## What the web says",
      context.data.answer,
      "",
      "## What people are posting",
      ...ranked.slice(0, 10).map(
        (post) =>
          `- @${post.author.username} (${post.created_at.slice(0, 10)}): ${post.content}\n  ${post.url}`,
      ),
      "",
      "## Pages behind the answer",
      ...pages.map((page) => `- [${page.title}](${page.link})`),
      "",
      "## Sources",
      ...sources.map((source) => `- [${source.title}](${source.link})`),
    ].join("\n");
    
    console.log(brief);
  5. 아카이브하고 지난주와 비교하기

    보고서와 출처를 LiveDoc에 저장하고 다음 주에 지난 호를 검색해 비교합니다.

    listening.ts
    type LiveDocData = { data: { short_id: string } };
    
    const archive = await felo<LiveDocData>("/v2/livedocs", {
      name: "Social listening archive",
      description: "One document resource per weekly brief",
    });
    
    await felo(`/v2/livedocs/${archive.data.short_id}/resources/doc`, {
      title: `Social listening — ${date}`,
      content: brief,
    });
    
    type Retrieved = { data: { title: string; content: string; score: number }[] };
    
    const previous = await felo<Retrieved>(
      `/v2/livedocs/${archive.data.short_id}/resources/retrieve`,
      { query: "what changed since last week" },
    ).then((res) => res.data.filter((hit) => hit.score >= 0.7));

    예제 출력

    [
      { "title": "Social listening — 2026-10-23", "content": "…", "score": 0.88 }
    ]

포함되는 것

  • 지난주 날짜 있는 X 게시물
  • 출처 있는 웹 배경
  • 주제별로 묶은 논의 요약
  • 바로 공유할 수 있는 주간 보고서
  • 각 호를 저장하는 LiveDoc

하지 않는 것

  • X 커버리지는 불완전하며 모든 사용자를 대표하지 않음
  • 감정 분석의 단정적 결론은 내지 않음
  • 자동 게시나 답글은 하지 않음
  • DM과 비공개 커뮤니티 데이터는 포함하지 않음
  • 주 1회 실행. 일정은 agent나 cron이 담당

자주 묻는 질문

브리프의 출처에는 무엇이 포함되나요?

각 X 게시물은 링크, 계정, 날짜를 유지합니다. 웹 배경은 Chat과 Web Fetch의 공개 페이지입니다. 출처 없는 주장은 쓰지 않습니다.

경쟁사도 함께 추적할 수 있나요?

네. 브랜드명과 경쟁사명을 함께 검색하고 주간 보고서에서 나눠 보여줍니다.

감정을 측정하나요?

주제와 어조로 정리하지만 편집 판단으로 표시하고 정확한 감정 비율을 주장하지 않습니다.

얼마나 과거까지 보나요?

기본은 최근 7일로 주간 보고서에 맞습니다. 더 긴 기간이 필요하면 `since_time`을 바꿉니다.

매주 자동 실행할 수 있나요?

네. 같은 프롬프트를 cron이나 agent 스케줄에 넣고 매주 같은 LiveDoc에 씁니다.

브리프 하나 비용은?

X 검색, Chat, 페이지 추출은 사용량 기반 크레딧입니다. 현재 요금은 가격 페이지에 있고 프롬프트는 쓰기 전에 승인을 요청합니다.

관련 워크플로

내 방식으로 바꾸기

같은 레시피를 실제 배포 방식에 맞게 조정합니다.

한 주제만 보기

하나의 출시나 논쟁으로 범위를 좁히면 브리프가 집중됩니다.

YouTube 의견 더하기

영상 자막으로 크리에이터 관점을 보충하지만 개인 경험으로 표시합니다.

월간 보고서로 만들기

빈도를 월 1회로 바꿔 브랜드와 PR 팀에 맞춥니다.

이 레시피의 배경이 되는 참고 페이지와 다음에 볼 곳.