[ blog · use-case ]8 min read

News Search API로 모닝 브리핑 에이전트 만들기

Sarah Choy2026년 5월 2일 게시2026년 5월 3일 업데이트8분 분량
News Search API로 모닝 브리핑 에이전트 만들기

창업자, PM, 애널리스트가 아침 8시에 원하는 건 같다: 어젯밤 무엇이 변했는지 깔끔한 요약. News Search API + LLM + cron이면 오후 한 번에 만든다.

한눈에

  • 구조: cron → News Search → 핵심 기사에 URL Extract → LLM 요약 → Slack 게시.
  • <code>start_date = 어제</code>로 신선도 조절, <code>country_code</code>로 지역 조절.
  • 토픽별 News Search를 병렬 호출, LLM이 머지/중복 제거.
  • 총비용 ≈ 토픽당 15 크레딧/일 + LLM 토큰. 5 토픽 브리핑도 정가 $0.10/일 미만.

'쓸모 있는 브리핑'의 모양

모닝 브리핑 에이전트는 한 가지 질문에 답해야 한다: '어젯밤 알아야 할 변화는 무엇인가?' 헤드라인 나열은 RSS와 같아 1주일 안에 mute된다. 살아남는 형식은: 링크가 달린 5개의 글머리, 토픽별로 묶고, 사용자의 어조로 작성.

이를 작은 파이프라인으로 분해:

  • 가져오기: N개 토픽의 최근 뉴스 — News Search API.
  • 추출: 모델이 인용할 링크의 본문 — URL Extract API.
  • 요약 + 클러스터링: 선호하는 LLM.
  • 전달: Slack / 이메일 / Notion — 기존 채널.
  • 스케줄: cron — Vercel Cron, GitHub Actions, n8n 등.

Step 1: 토픽 선정

3〜6개 토픽이면 충분. 12개 토픽 브리핑은 스크롤로 지나친다. 예:

  • B2B SaaS 창업자: 'AI 펀딩', 'OpenAI / Anthropic 동향', '경쟁사 동향'.
  • 금융 애널리스트: 'FOMC와 Treasury', '반도체 공급망', '특정 ticker'.
  • 헬스케어 PM: 'FDA 승인', '임상시험 결과 공개', '보험 환급 변경'.

Step 2: 원시 신호 가져오기

토픽별로 News Search를 병렬로 1회씩 호출. start_date로 신선도 제한:

from datetime import date, timedelta
import asyncio, aiohttp

KEY = "pk_yourkey"
TOPICS = [
    "AI agent infrastructure funding",
    "OpenAI Anthropic Google new releases",
    "RAG and LLM tool calling research",
]

async def fetch_topic(session, q):
    yesterday = (date.today() - timedelta(days=1)).isoformat()
    async with session.post(
        "https://www.apipick.com/api/search/news",
        headers={"x-api-key": KEY},
        json={"query": q, "start_date": yesterday},
    ) as r:
        return q, await r.json()

async def fetch_all():
    async with aiohttp.ClientSession() as s:
        return await asyncio.gather(*[fetch_topic(s, q) for q in TOPICS])

호출마다 ranked 헤드라인 최대 5건(num_results로 10까지). 3 토픽 브리핑은 1일 3 × 15 = 45 크레딧, $5/5,000 환산 ≈ $0.045/일. 일일 총비용에서 News API는 작은 부분이고 LLM이 큰 부분.

Step 3: 선택적으로 본문 추출

모든 기사 본문이 필요한 건 아니다 — 모델이 자세히 인용할 만한 것만. 간단한 휴리스틱: 토픽당 상위 2건 추출. API Pick에선 한 번의 배치 호출:

import requests

urls = [r["url"] for topic, payload in results for r in payload["results"][:2]]

extracted = requests.post(
    "https://www.apipick.com/api/extract",
    headers={"x-api-key": KEY},
    json={"urls": urls, "extract_effort": "auto"},
).json()

URL당 2 크레딧, 3 토픽 브리핑의 추출 단계는 1일 약 12 크레딧.

Step 4: 요약 프롬프트

프롬프트가 브리핑의 '목소리'를 결정한다. 출발점:

You are an assistant that writes a morning briefing in <Sarah's> voice:
direct, no fluff, no marketing language.

Input: a JSON list of {topic, headlines, extracted_bodies}.

Output rules:
- 1 short paragraph per topic, max 60 words.
- Each paragraph ends with up to 3 inline source links.
- If a topic has fewer than 2 substantive stories overnight, omit it.
- If the entire briefing has fewer than 2 substantive topics, output the
  literal token SKIP and nothing else.
- Never editorialise. Quote facts and figures verbatim from the sources.

Output format: Slack-flavoured markdown.

'저신호면 SKIP'이 단일 ROI 최고의 룰. 이게 브리핑이 mute되지 않는 근본 이유.

Step 5: 전달과 스케줄

Python cron 전체가 80줄 미만. Slack 게시:

if briefing.strip() == "SKIP":
    return
requests.post(
    SLACK_WEBHOOK_URL,
    json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)

Vercel Cron(vercel.json), GitHub Actions, AWS EventBridge, n8n 등으로 스케줄. 사용자 시간대 7:45에 실행 — 8시에 앉을 때 이미 도착해 있도록.

코드 없이 n8n으로

  • Schedule trigger: 매일 7:45(사용자 TZ).
  • HTTP Request 노드(토픽당 1개): POST /api/search/news, start_date = 어제.
  • Merge: 토픽 결과 합치기.
  • HTTP Request: /api/extract.
  • OpenAI / Anthropic: 요약 프롬프트 실행.
  • If: 출력이 SKIP이 아닌지 확인.
  • Slack: 게시.

운영에서 주시할 것

  • 토픽 표류. 'AI agents' 같은 넓은 쿼리는 6개월 후 모호해진다 — 인덱스는 자라지만 브리핑은 구체적 유지. 분기마다 쿼리를 조이라.
  • 일일 중복. 모델에 어제의 URL 리스트를 전달하고 '이 리스트의 기사는 다시 다루지 말 것' 지시.
  • 조용한 주말. SKIP 룰이 처리. 일일 체크인 습관을 브리핑에 묶지 말 것.

반복하라, 발사 후 잊지 말 것

첫 1주일은 매일 브리핑을 읽어라. 모델이 거짓말한 곳, 잘못 분류한 곳, 놓친 곳을 메모. 프롬프트를 업데이트. 1주일 후엔 브리핑이 습관이 되고 — 약 80줄의 코드와 3번의 API 호출로 동작하는 에이전트를 만든 것이다.

자주 묻는 질문

Google News나 RSS 어그리게이터로 충분하지 않나?

둘 다 작동하지만 — 지루한 부분(클러스터링, 중복 제거, 요약, 실제 브리핑 작성)은 그대로 남는다. 에이전트는 LLM으로 그 부분을 처리한다. RSS는 헤드라인을, 에이전트는 '왜 중요한지'를 출처 링크와 함께 한 단락으로 준다.

News Search API의 신선도는?

주요 매체를 거의 실시간으로 인덱싱. 오전 8시 브리핑이 직전 24시간을 다루려면 start_date를 어제로. 시간당 도는 속보 봇이라면 start_date를 오늘로 두고 직전 실행 결과로 중복 제거.

오늘 별 거 없으면?

프롬프트에 그 규칙을 넣어라: 'If fewer than 3 substantive stories changed overnight, return SKIP.' cron이 SKIP을 받으면 게시하지 말 것. 브리핑 피로는 Slack 채널이 mute되는 가장 빠른 길.

n8n 없이도 동작하나?

예. 아래 30줄 Python 스크립트 + cron으로 충분. n8n은 시각적 디버깅과 Slack 통합에 편하지만 필수 아님.

같은 기사가 여러 토픽에서 중복 요약되지 않게 하려면?

같은 실행에서 이전 쿼리에 사용된 URL을 모델에 전달하며 '이 리스트의 URL은 다시 언급하지 말 것' 지시. 또는 멀티 토픽을 한 번에 검색하고 모델이 분류하게 한다. 후자가 더 싸다.

이 글에서 사용한 API

Sarah Choy
작성
Sarah Choy
CEO, API Pick

Sarah Choy는 API Pick의 CEO입니다. AI 에이전트와 LLM 워크플로를 위한 프로덕션 등급 API에 대해 씁니다.