[ blog · use-case ]8 min read

Een ochtendbriefing-agent bouwen met de News Search API

Sarah ChoyGepubliceerd op 2 mei 20268 min leestijd
Een ochtendbriefing-agent bouwen met de News Search API

Elke founder, PM en analist wil om 8 uur 's ochtends hetzelfde: een nette samenvatting van wat er 's nachts veranderde. Met een News Search API, een LLM en een HTTP-cron-platform zet je er in één middag een neer.

TL;DR

  • Architectuur: cron → News Search → URL Extract voor veelbelovende verhalen → LLM-samenvatting → post naar Slack/e-mail.
  • Stem de versheid af met <code>start_date</code> = vandaag − 1; stem de locale af met <code>country_code</code>.
  • Hak de briefing op per onderwerp met parallelle News Search-queries; de LLM voegt samen en ontdubbelt.
  • Totale kosten zijn ~15 credits per onderwerp per dag, plus LLM-tokens. Een briefing van 5 onderwerpen is &lt; $0,10/dag tegen lijstprijs.

De vorm van een nuttige briefing

Een ochtendbriefing-agent moet één vraag beantwoorden: 'wat veranderde er 's nachts dat ik moet weten?' De lat ligt hoger dan het klinkt. Een dump van koppen faalt — het is hetzelfde als RSS en wordt binnen een week gedempt. Wat overleeft is een digest van 5 punten met links, geordend per onderwerp, in de stem van de gebruiker.

Dat valt uiteen in een kleine pipeline:

  • Recent nieuws over N onderwerpen ophalen — News Search API.
  • De body extraheren van elke link die het model wil citeren — URL Extract API.
  • Samenvatten + clusteren met een LLM — het model van jouw keuze.
  • Posten naar Slack / e-mail / Notion — je bestaande communicatiekanaal.
  • Plannen met een cron — Vercel Cron, GitHub Actions, n8n, enz.

Stap 1: kies je onderwerpen

Houd het op 3–6 onderwerpen. Briefings met 12 onderwerpen worden weggescrold. Voorbeelden:

  • Voor een B2B-SaaS-founder: 'AI-fundingrondes', 'OpenAI / Anthropic-nieuws', 'concurrentiebewegingen'.
  • Voor een financieel analist: 'FOMC en Treasury', 'halfgeleider-toeleveringsketen', 'specifieke tickers'.
  • Voor een healthcare-PM: 'FDA-goedkeuringen', 'uitkomsten van klinische trials', 'wijzigingen in vergoedingen'.

Stap 2: haal het ruwe signaal binnen

Draai één News Search-aanroep per onderwerp, parallel. Gebruik start_date om de versheid te begrenzen:

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

Elke aanroep levert tot 5 gerangschikte koppen op (max 10 met num_results). Voor een briefing van 3 onderwerpen is dat 3 × 15 = 45 credits per run. Tegen het tarief van $5 / 5.000 credits, $0,045/dag. De dagelijkse kosten worden gedomineerd door de LLM, niet door de News API.

Stap 3: extraheer bodies selectief

Je hebt niet de volledige inhoud van elk verhaal nodig — alleen die het model in detail wil citeren. Een simpele heuristiek: extraheer de top 2 verhalen per onderwerp. Met API Pick is dat één batch-aanroep:

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

Tegen 2 credits per URL voegt de extract-stap ~12 credits/dag toe voor een briefing van 3 onderwerpen.

Stap 4: de prompt voor de samenvatter

In de prompt leeft de stem van de briefing. Een startpunt:

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.

De instructie 'SKIP bij weinig signaal' is in z'n eentje de regel met de meeste hefboomwerking. Daarom wordt je briefing niet gedempt.

Stap 5: posten en plannen

Voor een Python-cron is het hele script < 80 regels. De Slack-post:

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

Plan met Vercel Cron (in vercel.json), GitHub Actions, AWS EventBridge of n8n. Draai om 7:45 in jouw tijdzone — het doel is dat hij klaarstaat wanneer je om 8 uur aanschuift.

Het in n8n doen als je liever no-code werkt

  • Schedule trigger — dagelijks, 7:45 gebruikerstijdzone.
  • HTTP Request-nodes (één per onderwerp), POST /api/search/news met start_date van gisteren.
  • De Merge-node combineert de onderwerpresultaten.
  • De HTTP Request-node roept /api/extract aan met de top-URL's.
  • De OpenAI / Anthropic-node draait de samenvatter-prompt.
  • De If-node controleert dat de output geen SKIP is.
  • De Slack-node post de briefing.

Waar je in productie op moet letten

  • Onderwerpdrift. 'AI agents' is na 6 maanden te breed — de index van de API groeit; je briefing moet specifiek blijven. Scherp de queries elk kwartaal aan.
  • Herhaling over dagen heen. Geef het model de URL's van de vorige dag mee met 'don't re-cover stories from this list' als hetzelfde verhaal blijft opduiken.
  • Rustige weekends. De SKIP-regel handelt dit al af; koppel alleen je dagelijkse check-in-gewoonte niet aan de briefing.

Itereer, niet bouwen-en-vergeten

Lees de briefing een week lang elke ochtend. Noteer waar het model loog, verkeerd categoriseerde of iets miste. Werk de prompt bij. Na een week itereren wordt de briefing een gewoonte — en heb je een werkende agent gebouwd met zo'n 80 regels code en drie API-aanroepen.

Veelgestelde vragen

Waarom niet gewoon Google News of een RSS-aggregator gebruiken?

Beide werken — en beide laten jou het saaie deel doen: clusteren, ontdubbelen, samenvatten en de eigenlijke briefing schrijven. Een agent doet dat deel met een LLM. RSS geeft je koppen; een agent geeft je een alinea die zegt wat ertoe doet en naar de bronnen linkt.

Hoe vers is de News Search API?

De API indexeert grote media vrijwel realtime. Voor een briefing van 8 uur die de afgelopen 24 uur dekt, zet je start_date op gisteren. Voor breaking-news-bots die per uur draaien, zet je start_date op vandaag en draai je de agent opnieuw met ontdubbeling tegen je vorige run.

Wat als de briefing niets nieuws te melden heeft?

Bouw dat in de prompt: 'If fewer than 3 substantive stories changed overnight, return SKIP.' Je cron job moet SKIP respecteren en geen briefing met weinig signaal posten. Briefing-moeheid is de snelste manier om een Slack-kanaal gedempt te krijgen.

Kan ik dit zonder n8n draaien?

Ja. Dezelfde flow draait als een Python-script van 30 regels op een cron — zie het voorbeeld hieronder. n8n is handig voor visueel debuggen en Slack-integratie, maar is niet vereist.

Hoe voorkom ik dat hetzelfde verhaal over meerdere onderwerpen wordt samengevat?

Geef het model de URL's van eerdere queries in dezelfde run mee met de instructie: 'do not re-mention any URL already covered.' Of draai één multi-onderwerp-zoekopdracht en laat het model partitioneren. Beide werken; de tweede is goedkoper.

API's gebruikt in dit artikel

Sarah Choy
Geschreven door
Sarah Choy
CEO, API Pick

Sarah Choy is de CEO van API Pick. Ze schrijft over het bouwen van productieklare API's voor AI-agents en LLM-workflows.