[ blog · use-case ]8 min read

Construire un agent de briefing matinal avec la News Search API

Sarah ChoyPublié le 2 mai 2026Mis à jour le 3 mai 20268 min de lecture
Construire un agent de briefing matinal avec la News Search API

Fondateurs, PM et analystes veulent la même chose à 8h : un digest propre de ce qui a changé pendant la nuit. Avec une News Search API, un LLM et une plateforme de cron, vous le construisez en un après-midi.

L'essentiel

  • Architecture : cron → News Search → URL Extract des stories prometteuses → résumé LLM → post Slack/email.
  • Fraîcheur via <code>start_date</code> = aujourd'hui − 1 ; locale via <code>country_code</code>.
  • Découpez par sujet en parallèle ; le LLM merge et déduplique.
  • Coût total ≈ 15 crédits/sujet/jour + tokens LLM. Un briefing 5-sujets reste < $0.10/jour au tarif catalogue.

À quoi ressemble un briefing utile

Un agent de briefing matinal doit répondre à une question : 'qu'est-ce qui a changé cette nuit que je dois savoir ?' La barre est plus haute qu'il n'y paraît. Une liste de titres échoue — c'est du RSS, muté en une semaine. Ce qui survit : un digest 5 puces avec liens, organisé par sujet, dans la voix du lecteur.

Cela se décompose en pipeline simple :

  • Récupérer les news récentes sur N sujets — News Search API.
  • Extraire le corps des liens que le modèle veut citer — URL Extract API.
  • Résumer + clusterer avec votre LLM.
  • Poster sur Slack / email / Notion — votre canal habituel.
  • Planifier avec cron — Vercel Cron, GitHub Actions, n8n…

Étape 1 : choisir les sujets

3–6 sujets suffisent. Un briefing à 12 sujets se scrolle. Exemples :

  • Fondateur SaaS B2B : 'levées IA', 'news OpenAI/Anthropic', 'mouvements concurrents'.
  • Analyste financier : 'FOMC et Treasury', 'chaîne de semi-conducteurs', 'tickers spécifiques'.
  • PM santé : 'agréments FDA', 'résultats d'essais cliniques', 'changements de remboursement'.

Étape 2 : récupérer le signal brut

Un appel News Search par sujet, en parallèle. Fraîcheur via 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])

Chaque appel renvoie jusqu'à 5 titres ranked (10 avec num_results). 3 sujets = 3 × 15 = 45 crédits/jour, soit $0.045/jour au tarif $5 / 5 000. La News API n'est pas le coût dominant — c'est le LLM.

Étape 3 : extraire sélectivement les corps

Pas besoin du contenu de chaque article — uniquement de ceux que le modèle voudra citer en détail. Heuristique : top 2 par sujet. Sur API Pick, un seul appel 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()

À 2 crédits par URL, l'extract ajoute ~12 crédits/jour pour 3 sujets.

Étape 4 : le prompt de résumé

Le prompt définit la voix du briefing. Point de départ :

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 règle 'SKIP si signal faible' a le ROI le plus élevé. C'est elle qui empêche le mute du canal.

Étape 5 : poster et planifier

Le cron Python tient en moins de 80 lignes. Post Slack :

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

Planifiez avec Vercel Cron (dans vercel.json), GitHub Actions, AWS EventBridge ou n8n. Lancez à 7h45 dans votre fuseau — pour qu'il vous attende à 8h.

Version no-code dans n8n

  • Schedule trigger — quotidien, 7h45 fuseau utilisateur.
  • HTTP Request (un par sujet), POST /api/search/news avec start_date = hier.
  • Merge combine les sujets.
  • HTTP Request appelle /api/extract avec les top URL.
  • OpenAI / Anthropic exécute le prompt de résumé.
  • If filtre les SKIP.
  • Slack poste le briefing.

À surveiller en production

  • Drift de sujets. 'AI agents' devient trop large en 6 mois — l'index grandit, votre briefing doit rester précis. Resserrez les requêtes chaque trimestre.
  • Répétition entre jours. Donnez au modèle les URL de la veille avec 'don't re-cover stories from this list'.
  • Week-ends calmes. La règle SKIP gère ; n'arrimez pas votre routine quotidienne au briefing.

Itérer, ne pas livrer-et-oublier

Lisez le briefing chaque matin pendant une semaine. Notez où le modèle ment, mal catégorise ou rate quelque chose. Mettez à jour le prompt. Au bout d'une semaine, le briefing devient une habitude — et vous avez un agent fonctionnel en ~80 lignes de code et trois appels API.

Questions fréquentes

Pourquoi ne pas utiliser Google News ou un agrégateur RSS ?

Les deux marchent — et vous laissent la partie ennuyeuse : clusterer, dédupliquer, résumer, écrire le briefing. Un agent fait ça avec un LLM. RSS donne des titres ; un agent donne un paragraphe qui dit ce qui compte, avec sources.

Quelle est la fraîcheur de la News Search API ?

Indexe les grands médias quasi temps réel. Pour un briefing 8h couvrant les 24h passées, mettez start_date sur hier. Pour un bot horaire, mettez sur aujourd'hui et dédupliquez vs le run précédent.

Et si le briefing n'a rien à dire ?

Mettez la règle dans le prompt : 'If fewer than 3 substantive stories changed overnight, return SKIP.' Le cron doit respecter SKIP et ne rien poster. La fatigue de briefing est le chemin le plus rapide pour qu'un canal Slack soit muté.

Peut-on s'en passer de n8n ?

Oui. Le même flux tient en 30 lignes Python avec cron — voir l'exemple plus bas. n8n facilite le debug visuel et l'intégration Slack, mais n'est pas obligatoire.

Comment éviter qu'une même story soit résumée sur plusieurs sujets ?

Donnez au modèle les URL des requêtes précédentes du même run avec : 'do not re-mention any URL already covered'. Ou faites une seule recherche multi-sujets et laissez le modèle partitionner. Les deux marchent ; la seconde est moins chère.

APIs utilisées dans cet article

Sarah Choy
Écrit par
Sarah Choy
CEO, API Pick

Sarah Choy est CEO d'API Pick. Elle écrit sur la création d'APIs prêtes pour la production destinées aux agents IA et aux workflows LLM.