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 < 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/newscomstart_datede ontem. - O nó Merge combina os resultados dos temas.
- O nó HTTP Request chama
/api/extractcom 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 é 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.