Construye un agente de briefing matutino con la News Search API

Fundadores, PMs y analistas quieren lo mismo a las 8am: un digest limpio de qué cambió durante la noche. Con una News Search API, un LLM y una plataforma con cron, lo construyes en una tarde.
Resumen
- •Arquitectura: cron → News Search → URL Extract de las historias prometedoras → resumen LLM → post a Slack/email.
- •Frescura con <code>start_date</code> = hoy − 1; locale con <code>country_code</code>.
- •Trocea por tema con News Search en paralelo; el LLM mergea y deduplica.
- •Coste total ≈ 15 créditos/tema/día más tokens LLM. Un briefing de 5 temas < $0.10/día a precio de tarifa.
Forma de un briefing útil
Un agente de briefing matutino tiene que responder a una pregunta: '¿qué cambió durante la noche que necesito saber?' La barrera es más alta de lo que parece. Una lista de titulares falla — es lo mismo que RSS y se silencia en una semana. Lo que sobrevive es un digest de 5 puntos con enlaces, agrupado por temas, en la voz del lector.
Eso se descompone en una pequeña pipeline:
- Buscar noticias recientes en N temas — News Search API.
- Extraer el cuerpo de los enlaces que el modelo quiera citar — URL Extract API.
- Resumir + agrupar con el LLM de tu elección.
- Publicar en Slack / email / Notion — tu canal habitual.
- Programar con cron — Vercel Cron, GitHub Actions, n8n, etc.
Paso 1: elige los temas
3–6 temas. Briefings con 12 temas se saltan con scroll. Ejemplos:
- Fundador SaaS B2B: 'rondas de funding IA', 'noticias OpenAI / Anthropic', 'movimientos de competencia'.
- Analista financiero: 'FOMC y Treasury', 'cadena de semiconductores', 'tickers concretos'.
- PM healthcare: 'aprobaciones FDA', 'lecturas de ensayos clínicos', 'cambios de reembolso'.
Paso 2: traer la señal en bruto
Una llamada a News Search por tema, en paralelo. Frescura con 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])Cada llamada devuelve hasta 5 titulares ranked (10 con num_results). 3 temas son 3 × 15 = 45 créditos/día — $0.045/día a tarifa $5 / 5.000 créditos. La News API no es el coste mayor del día — el LLM domina.
Paso 3: extraer cuerpos selectivamente
No necesitas el contenido completo de cada historia, solo de las que el modelo va a citar a fondo. Heurística: top 2 por tema. En API Pick es una sola llamada por lotes:
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, el extract añade ~12 créditos/día para 3 temas.
Paso 4: el prompt de resumen
El prompt define la voz del briefing. Punto 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.La regla 'SKIP cuando hay poca señal' es el ROI más alto. Es la razón por la que tu briefing no será silenciado.
Paso 5: publicar y programar
El cron Python entero cabe en menos de 80 líneas. Publicación en Slack:
if briefing.strip() == "SKIP":
return
requests.post(
SLACK_WEBHOOK_URL,
json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)Programa con Vercel Cron (en vercel.json), GitHub Actions, AWS EventBridge o n8n. Lánzalo a las 7:45 de tu zona — para que ya esté esperándote a las 8.
Versión sin código en n8n
- Schedule trigger — diario, 7:45 zona usuario.
- HTTP Request (uno por tema), POST
/api/search/newsconstart_datede ayer. - Merge combina los resultados.
- HTTP Request a
/api/extractcon las URLs top. - OpenAI / Anthropic ejecuta el prompt.
- If filtra los SKIP.
- Slack publica.
Qué vigilar en producción
- Drift de tema. 'AI agents' se vuelve demasiado amplio en 6 meses — el índice crece, tu briefing debe permanecer específico. Refina queries trimestralmente.
- Repetición entre días. Pásale al modelo las URLs del día anterior con 'don't re-cover stories from this list'.
- Fines de semana flojos. La regla SKIP ya lo gestiona; no ancles tu rutina diaria al briefing.
Itera, no lances y olvides
Lee el briefing cada mañana durante una semana. Anota dónde el modelo mintió, mal categorizó o se le escapó algo. Actualiza el prompt. Una semana después el briefing se vuelve hábito — y has construido un agente operativo con ~80 líneas de código y tres llamadas API.
Preguntas frecuentes
¿Por qué no usar Google News o un agregador RSS?
Funcionan — y te dejan a ti la parte aburrida: clusterizar, deduplicar, resumir y escribir el briefing. El agente hace eso con el LLM. RSS te da titulares; el agente te da un párrafo que dice qué importa, con enlaces.
¿Cuán fresca está la News Search API?
Indexa los principales medios casi en tiempo real. Para un briefing de 8am que cubra las 24h previas, pon start_date en ayer. Para bots de noticias horarios, pon start_date en hoy y deduplica contra la última corrida.
¿Y si el briefing no tiene nada nuevo?
Métele en el prompt: 'If fewer than 3 substantive stories changed overnight, return SKIP.' El cron debe respetar SKIP y no postear briefing flojo. La fatiga de briefing es la vía rápida a que silencien el canal.
¿Se puede sin n8n?
Sí. El mismo flujo cabe en un script Python de 30 líneas con cron — ver ejemplo abajo. n8n facilita el debugging visual y la integración con Slack, pero no es obligatorio.
¿Cómo evito que la misma historia se resuma en varios temas?
Pasa al modelo las URLs ya cubiertas en queries previas dentro del mismo run con instrucción 'do not re-mention any URL already covered'. O usa una sola búsqueda multi-tema y deja que el modelo particione. Ambas funcionan; la segunda es más barata.
APIs usadas en este artículo
Sarah Choy es la CEO de API Pick. Escribe sobre cómo construir APIs listas para producción para agentes de IA y flujos de trabajo con LLMs.