[ blog · use-case ]8 min read

Construa um agente de briefing matinal com a News Search API

Sarah ChoyPublicado em 2 de maio de 20268 min de leitura
Construa um agente de briefing matinal com a News Search API

Todo fundador, PM e analista quer a mesma coisa às 8h: um resumo limpo do que mudou durante a noite. Com uma News Search API, um LLM e uma plataforma de cron via HTTP, você entrega isso em uma tarde.

TL;DR

  • Arquitetura: cron → News Search → URL Extract das matérias promissoras → resumo com LLM → post no Slack/email.
  • Ajuste a atualidade com <code>start_date</code> = hoje − 1; ajuste o locale com <code>country_code</code>.
  • Divida o briefing por tema com consultas paralelas na News Search; o LLM mescla e remove duplicatas.
  • O custo total fica em ~15 créditos por tema por dia, mais tokens de LLM. Um briefing de 5 temas custa &lt; US$ 0,10/dia a preço de tabela.

O formato de um briefing útil

Um agente de briefing matinal deve responder a uma pergunta: 'o que mudou durante a noite que eu preciso saber?' A régua é mais alta do que parece. Um despejo de manchetes fracassa — é a mesma coisa que o RSS e é silenciado em uma semana. O que sobrevive é um resumo de 5 tópicos com links, organizado por tema, na voz do usuário.

Isso se decompõe em uma pequena pipeline:

  • Buscar notícias recentes em N temas — News Search API.
  • Extrair o corpo de qualquer link que o modelo queira citar — URL Extract API.
  • Resumir + agrupar com um LLM — o modelo de sua escolha.
  • Publicar no Slack / email / Notion — seu canal de comunicação atual.
  • Agendar com um cron — Vercel Cron, GitHub Actions, n8n etc.

Passo 1: escolha seus temas

Fique em 3–6 temas. Briefings com 12 temas são ignorados com scroll. Exemplos:

  • Para um fundador de SaaS B2B: 'rodadas de funding em IA', 'notícias OpenAI / Anthropic', 'movimentos da concorrência'.
  • Para um analista financeiro: 'FOMC e Treasury', 'cadeia de suprimentos de semicondutores', 'tickers específicos'.
  • Para um PM de saúde: 'aprovações da FDA', 'resultados de ensaios clínicos', 'mudanças de reembolso'.

Passo 2: traga o sinal bruto

Rode uma chamada à News Search por tema, em paralelo. Use start_date para limitar a atualidade:

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

Cada chamada retorna até 5 manchetes ranqueadas (no máximo 10 com num_results). Para um briefing de 3 temas, são 3 × 15 = 45 créditos por rodada. À taxa de US$ 5 / 5.000 créditos, US$ 0,045/dia. O custo diário é dominado pelo LLM, não pela News API.

Passo 3: extraia corpos seletivamente

Você não precisa do conteúdo completo de cada matéria — só daquelas que o modelo vai citar em detalhe. Uma heurística simples: extraia as 2 melhores matérias por tema. Com a API Pick, é uma única chamada em lote:

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

A 2 créditos por URL, o passo de extração adiciona ~12 créditos/dia para um briefing de 3 temas.

Passo 4: o prompt do resumidor

O prompt é onde a voz do briefing mora. Um ponto de partida:

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.

A instrução 'SKIP se houver baixo sinal' é a regra de maior alavancagem. É por isso que seu briefing não será silenciado.

Passo 5: publicar e agendar

Para um cron em Python, o script inteiro tem < 80 linhas. O post no Slack:

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

Agende com Vercel Cron (no vercel.json), GitHub Actions, AWS EventBridge ou n8n. Rode às 7h45 do seu fuso — a meta é que ele esteja esperando quando você sentar às 8.

Fazendo no n8n se você prefere no-code

  • Schedule trigger — diário, 7h45 no fuso do usuário.
  • Nós de HTTP Request (um por tema), POST /api/search/news com start_date de ontem.
  • O nó Merge combina os resultados dos temas.
  • O nó HTTP Request chama /api/extract com as URLs do topo.
  • O nó OpenAI / Anthropic executa o prompt do resumidor.
  • O nó If verifica se a saída não é SKIP.
  • O nó Slack publica o briefing.

O que observar em produção

  • Deriva de tema. 'AI agents' fica amplo demais depois de 6 meses — o índice da API cresce; seu briefing precisa permanecer específico. Aperte as consultas a cada trimestre.
  • Repetição entre dias. Passe ao modelo as URLs do dia anterior com 'don't re-cover stories from this list' se a mesma matéria insiste em aparecer.
  • Fins de semana parados. A regra SKIP já cuida disso; só não amarre seu hábito de check-in diário ao briefing.

Itere, não lance e esqueça

Leia o briefing toda manhã por uma semana. Anote onde o modelo mentiu, categorizou errado ou deixou algo passar. Atualize o prompt. Depois de uma semana de iteração, o briefing vira hábito — e você construiu um agente funcional com cerca de 80 linhas de código e três chamadas de API.

Perguntas Frequentes

Por que não usar simplesmente o Google News ou um agregador de RSS?

Ambos funcionam — e ambos deixam você com a parte chata: agrupar, deduplicar, resumir e escrever o briefing de fato. Um agente faz essa parte com um LLM. O RSS te dá manchetes; o agente te dá um parágrafo que diz o que importa, com links para as fontes.

Qual é a atualidade da News Search API?

A API indexa os principais veículos quase em tempo real. Para um briefing das 8h cobrindo as 24h anteriores, defina start_date como ontem. Para bots de última hora que rodam de hora em hora, defina start_date como hoje e reexecute o agente deduplicando contra a última rodada.

E se o briefing não tiver nada de novo a dizer?

Coloque isso no prompt: 'If fewer than 3 substantive stories changed overnight, return SKIP.' Seu cron job deve respeitar o SKIP e não publicar um briefing de baixo sinal. A fadiga de briefing é o caminho mais rápido para silenciarem o canal do Slack.

Dá para rodar isso sem o n8n?

Sim. O mesmo fluxo cabe em um script Python de 30 linhas com cron — veja o exemplo abaixo. O n8n é conveniente para debugging visual e integração com o Slack, mas não é obrigatório.

Como evito que a mesma matéria seja resumida em vários temas?

Passe ao modelo as URLs das consultas anteriores na mesma rodada com a instrução: 'do not re-mention any URL already covered.' Ou rode uma única busca multi-tema e deixe o modelo particionar. Ambas funcionam; a segunda é mais barata.

APIs usadas neste artigo

Sarah Choy
Escrito por
Sarah Choy
CEO, API Pick

Sarah Choy é a CEO da API Pick. Ela escreve sobre a construção de APIs prontas para produção para agentes de IA e fluxos de trabalho com LLMs.