Skip to content

Veille & Alertes — Lecture + actions

Le module Veille capture des documents (web, news, RSS) sur des thématiques configurées, les score (relevance + freshness), et permet de générer des synthèses IA.

Source : server/publicApi/routes/watches.ts.

⚠️ L'API publique ne permet pas de créer/modifier/supprimer une veille — uniquement lire et déclencher des runs/synthèses. La gestion des veilles passe par l'UI (création des sources, mots-clés, fréquence).

Vue d'ensemble

MéthodePathScopeDescription
GET/watcheswatches:readListe paginée des veilles
GET/watches/:idwatches:readDétail d'une veille
GET/watches/:id/feedwatches:readDocuments collectés (paginés, scorés)
GET/watches/:id/syntheseswatches:read20 dernières synthèses générées
POST/watches/:id/runwatches:writeLance un run immédiat (async)
POST/watches/:id/syntheseswatches:writeGénère une synthèse IA (async)

Pas de webhooks publics actuellement émis pour ce module.


GET /watches

Liste paginée des veilles de l'agence (triées par updatedAt DESC).

json
{
  "data": [
    { "id": 1, "agencyId": 7, "name": "Veille concurrence", "status": "active", "updatedAt": "2026-04-27T08:00:00.000Z" }
  ],
  "total": 4,
  "limit": 50,
  "offset": 0
}

GET /watches/:id

Détail d'une veille.

json
{ "data": { "id": 1, "name": "Veille concurrence", "status": "active", ... } }

⚠️ Réponse enveloppée dans { data: ... } (différent des autres endpoints). Pourrait être harmonisé en v2.


GET /watches/:id/feed

Documents collectés par la veille.

Query params

ParamTypeDescription
limitintDéfaut 50, max 100
offsetintOffset
sortscore | dateTri (défaut score — par compositeScore desc)

Réponse 200

json
{
  "data": [
    {
      "id": 101,
      "title": "Article concurrent X annonce…",
      "url": "https://example.com/news",
      "snippet": "…extrait…",
      "author": "Jane Doe",
      "publishedAt": "2026-04-26T18:00:00.000Z",
      "sourceType": "rss",
      "sourceDomain": "example.com",
      "language": "fr",
      "relevanceScore": 0.92,
      "freshnessScore": 0.85,
      "compositeScore": 0.89,
      "isRead": false,
      "isStarred": false
    }
  ],
  "total": 142,
  "limit": 50,
  "offset": 0
}

Les documents archivés (isArchived = true) sont automatiquement exclus.


GET /watches/:id/syntheses

Liste des 20 dernières synthèses IA générées (pas de pagination — historique limité).

json
{
  "data": [
    {
      "id": 12,
      "watchId": 1,
      "status": "completed",
      "summary": "…texte de synthèse…",
      "periodDays": 7,
      "documentsAnalyzed": 47,
      "createdAt": "2026-04-27T08:00:00.000Z"
    }
  ],
  "total": 12
}

POST /watches/:id/run

Déclenche un run de collecte immédiat (async). La veille doit être status = "active" (sinon 409).

Réponse 202

json
{ "message": "Run lancé", "watchId": 1 }

L'exécution est asynchrone — vous pouvez poller /watches/:id/feed ensuite pour voir les nouveaux documents.

Erreurs

  • 409 : la veille n'est pas active

POST /watches/:id/syntheses

Lance la génération d'une synthèse IA (async, async, OpenAI/Anthropic backend).

Body (optionnel)

json
{
  "periodDays": 7,
  "maxDocuments": 50
}
ChampTypeDéfautBornes
periodDaysint71 - 90
maxDocumentsint505 - 100

Réponse 202

json
{ "message": "Génération lancée", "synthesisId": 12 }

Anti-spam

Si une synthèse est déjà status = "generating" pour cette veille, retourne 429 :

json
{ "error": "Une synthèse est déjà en cours de génération", "synthesisId": 11 }

Exemple — déclencher une synthèse 30 jours, max 100 docs

bash
curl -X POST \
  -H "x-api-key: spk_..." \
  -H "Content-Type: application/json" \
  -d '{"periodDays":30,"maxDocuments":100}' \
  https://beta.stormeo.io/api/public/v1/watches/1/syntheses

Récupération du résultat ensuite via :

bash
curl -H "x-api-key: spk_..." \
  https://beta.stormeo.io/api/public/v1/watches/1/syntheses

StormeoOS API