Costruisci un agente di briefing mattutino con la News Search API

Ogni founder, PM e analista vuole la stessa cosa alle 8 del mattino: un digest pulito di cosa è cambiato durante la notte. Con una News Search API, un LLM e una piattaforma con cron via HTTP, lo realizzi in un pomeriggio.
In breve
- •Architettura: cron → News Search → URL Extract delle storie promettenti → riassunto con LLM → post su Slack/email.
- •Regola la freschezza con <code>start_date</code> = oggi − 1; regola il locale con <code>country_code</code>.
- •Suddividi il briefing per tema con query parallele su News Search; l'LLM unisce e deduplica.
- •Il costo totale è di ~15 crediti per tema al giorno, più i token dell'LLM. Un briefing di 5 temi costa < 0,10 $/giorno a prezzo di listino.
La forma di un briefing utile
Un agente di briefing mattutino deve rispondere a una domanda: 'cosa è cambiato durante la notte che ho bisogno di sapere?' L'asticella è più alta di quanto sembri. Uno scarico di titoli fallisce — è la stessa cosa dell'RSS e viene silenziato nel giro di una settimana. Ciò che sopravvive è un digest di 5 punti con link, organizzato per tema, nella voce dell'utente.
Questo si scompone in una piccola pipeline:
- Recuperare notizie recenti su N temi — News Search API.
- Estrarre il corpo di qualsiasi link che il modello voglia citare — URL Extract API.
- Riassumere + raggruppare con un LLM — il modello che preferisci.
- Pubblicare su Slack / email / Notion — il tuo canale di comunicazione esistente.
- Pianificare con un cron — Vercel Cron, GitHub Actions, n8n, ecc.
Passo 1: scegli i tuoi temi
Restano 3–6 temi. I briefing con 12 temi vengono superati con lo scroll. Esempi:
- Per un founder di SaaS B2B: 'round di funding sull'IA', 'notizie OpenAI / Anthropic', 'mosse dei concorrenti'.
- Per un analista finanziario: 'FOMC e Treasury', 'catena di fornitura dei semiconduttori', 'ticker specifici'.
- Per un PM healthcare: 'approvazioni FDA', 'risultati di trial clinici', 'cambiamenti nei rimborsi'.
Passo 2: recupera il segnale grezzo
Esegui una chiamata a News Search per tema, in parallelo. Usa start_date per limitare la freschezza:
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])Ogni chiamata restituisce fino a 5 titoli ordinati (max 10 con num_results). Per un briefing di 3 temi sono 3 × 15 = 45 crediti per esecuzione. Alla tariffa di 5 $ / 5.000 crediti, 0,045 $/giorno. Il costo giornaliero è dominato dall'LLM, non dalla News API.
Passo 3: estrai i corpi in modo selettivo
Non ti serve il contenuto completo di ogni storia — solo di quelle che il modello vuole citare in dettaglio. Un'euristica semplice: estrai le 2 storie migliori per tema. Con API Pick è un'unica chiamata batch:
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 crediti per URL, il passo di estrazione aggiunge ~12 crediti/giorno per un briefing di 3 temi.
Passo 4: il prompt del riassuntore
Il prompt è dove vive la voce del briefing. Un punto di partenza:
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.L'istruzione 'SKIP se basso segnale' è la regola con la leva più alta. È il motivo per cui il tuo briefing non verrà silenziato.
Passo 5: pubblica e pianifica
Per un cron in Python, l'intero script è < 80 righe. Il post su Slack:
if briefing.strip() == "SKIP":
return
requests.post(
SLACK_WEBHOOK_URL,
json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)Pianifica con Vercel Cron (in vercel.json), GitHub Actions, AWS EventBridge o n8n. Eseguilo alle 7:45 del tuo fuso orario — l'obiettivo è che ti stia già aspettando quando ti siedi alle 8.
Farlo in n8n se preferisci il no-code
- Schedule trigger — quotidiano, 7:45 nel fuso dell'utente.
- Nodi HTTP Request (uno per tema), POST
/api/search/newsconstart_datedi ieri. - Il nodo Merge combina i risultati dei temi.
- Il nodo HTTP Request chiama
/api/extractcon le URL principali. - Il nodo OpenAI / Anthropic esegue il prompt del riassuntore.
- Il nodo If verifica che l'output non sia SKIP.
- Il nodo Slack pubblica il briefing.
Cosa tenere d'occhio in produzione
- Deriva del tema. 'AI agents' diventa troppo ampio dopo 6 mesi — l'indice dell'API cresce; il tuo briefing deve restare specifico. Stringi le query ogni trimestre.
- Ripetizione tra i giorni. Passa al modello le URL del giorno precedente con 'don't re-cover stories from this list' se la stessa storia continua a comparire.
- Weekend tranquilli. La regola SKIP gestisce già questo; semplicemente non legare la tua abitudine di check-in quotidiano al briefing.
Itera, non lanciare e dimenticare
Leggi il briefing ogni mattina per una settimana. Annota dove il modello ha mentito, classificato male o tralasciato qualcosa. Aggiorna il prompt. Dopo una settimana di iterazione il briefing diventa un'abitudine — e hai costruito un agente funzionante con circa 80 righe di codice e tre chiamate API.
Domande frequenti
Perché non usare semplicemente Google News o un aggregatore RSS?
Funzionano entrambi — e lasciano a te la parte noiosa: raggruppare, deduplicare, riassumere e scrivere davvero il briefing. Un agente fa quella parte con un LLM. L'RSS ti dà i titoli; l'agente ti dà un paragrafo che dice cosa conta, con i link alle fonti.
Quanto è fresca la News Search API?
L'API indicizza le principali testate quasi in tempo reale. Per un briefing delle 8 che copre le 24 ore precedenti, imposta start_date a ieri. Per i bot di breaking news che girano ogni ora, imposta start_date a oggi e riesegui l'agente deduplicando rispetto all'ultima esecuzione.
E se il briefing non ha niente di nuovo da dire?
Mettilo nel prompt: 'If fewer than 3 substantive stories changed overnight, return SKIP.' Il tuo cron job deve rispettare lo SKIP e non pubblicare un briefing a basso segnale. La fatica da briefing è la via più rapida per farsi silenziare un canale Slack.
Posso farlo senza n8n?
Sì. Lo stesso flusso gira come uno script Python di 30 righe su un cron — vedi l'esempio sotto. n8n è comodo per il debugging visivo e l'integrazione con Slack, ma non è obbligatorio.
Come evito che la stessa storia venga riassunta in più temi?
Passa al modello le URL delle query precedenti nella stessa esecuzione con l'istruzione: 'do not re-mention any URL already covered.' Oppure esegui un'unica ricerca multi-tema e lascia che il modello faccia la partizione. Funzionano entrambe; la seconda costa meno.
API usate in questo articolo
Sarah Choy è la CEO di API Pick. Scrive sulla creazione di API pronte per la produzione per agenti IA e flussi di lavoro con LLM.