API v2 · gratuite

L'API Signalytics

Interrogez depuis vos propres outils les données que Signalytics collecte sur Google Discover et Google News : présence d'une URL, articles détectés, catégories, sujets et statistiques. Gratuite pour tout compte inscrit, sans carte bancaire.

Présentation

Une API REST, du JSON en entrée comme en sortie, une clé dans un en-tête. Rien d'autre à installer.

Adresse de basehttps://www.gnewsalyzer.com/api/v2
ProtocoleHTTPS uniquement
Formatapplication/json; charset=utf-8
AuthentificationEn-tête X-API-Key
CORSAutorisé depuis n'importe quelle origine
Version2.1.0

Le catalogue des points d'entrée est servi sans clé, pour explorer avant de s'inscrire :

curl https://www.gnewsalyzer.com/api/v2/

Obtenir une clé

Trois étapes, moins d'une minute.

  1. Créez un compte — gratuit, sans carte bancaire.
  2. Ouvrez Outils › API depuis le menu de votre tableau de bord.
  3. Nommez votre clé et créez-la. Elle s'affiche une seule fois.

La clé n'est affichée qu'une fois.

Nous n'en conservons que l'empreinte : personne ne peut la relire ensuite, ni vous, ni nous. Copiez-la dans votre gestionnaire de secrets au moment où elle apparaît. Perdue, elle se remplace en quelques secondes — révoquez l'ancienne, créez-en une autre.

Une clé compromise se révoque depuis la même page : les appels qui l'utilisent reçoivent immédiatement un 401.

Authentification

Envoyez votre clé dans l'en-tête X-API-Key à chaque requête.

curl

curl -H "X-API-Key: gna_votre_cle" \
  "https://www.gnewsalyzer.com/api/v2/me"

PHP

<?php
$ch = curl_init('https://www.gnewsalyzer.com/api/v2/me');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-API-Key: ' . getenv('SIGNALYTICS_API_KEY')],
    CURLOPT_TIMEOUT        => 15,
]);
$reponse = json_decode(curl_exec($ch), true);
curl_close($ch);

print_r($reponse['data']);

JavaScript

const reponse = await fetch('https://www.gnewsalyzer.com/api/v2/me', {
  headers: { 'X-API-Key': process.env.SIGNALYTICS_API_KEY }
});

if (!reponse.ok) {
  throw new Error(`API ${reponse.status}`);
}

const { data } = await reponse.json();
console.log(data.quotas);

Python

import os, requests

reponse = requests.get(
    "https://www.gnewsalyzer.com/api/v2/me",
    headers={"X-API-Key": os.environ["SIGNALYTICS_API_KEY"]},
    timeout=15,
)
reponse.raise_for_status()
print(reponse.json()["data"]["quotas"])

Autres formes acceptées

X-API-Key: gna_…Recommandé.
Authorization: Bearer gna_…Pour les clients qui ne savent poser que cet en-tête.
?api_key=gna_…Accepté, mais déconseillé : une URL se retrouve dans les journaux d'accès, l'historique du navigateur et l'en-tête Referer.

Quotas

Assez larges pour ne jamais gêner un usage normal, assez serrés pour qu'un robot emballé ne mette pas le service à genoux.

300par minute
1 000par heure
5 000par jour

Les trois plafonds s'appliquent en même temps et se comptent par compte, pas par clé : émettre plusieurs clés sépare vos environnements, cela ne multiplie pas votre quota. Vous pouvez détenir 5 clés actives.

Coût d'une requête

Une requête vaut une unité, sauf là où le travail demandé dépend de la taille de l'entrée :

AppelCoût
Cas général1 unité
/discover/check groupé1 unité par tranche entamée de 10 URL — 100 URL coûtent 10 unités
/articles/new?limit=N1 unité par tranche entamée de 100 articles

En-têtes de réponse

Chaque réponse porte l'état de votre quota, inutile d'appeler /me pour le suivre :

X-RateLimit-LimitPlafond de la fenêtre la plus contrainte à cet instant.
X-RateLimit-RemainingCe qu'il vous reste sur cette fenêtre.
X-RateLimit-ResetHorodatage Unix de la remise à zéro.
X-RateLimit-Minute
X-RateLimit-Hour
X-RateLimit-Day
Le détail de chaque fenêtre, au format utilisé/plafond.
Retry-AfterPrésent sur un 429 : secondes à attendre.

Besoin de plus ?

Écrivez à contact@gnewsalyzer.com ou passez par la page Contact en décrivant votre usage. Les plafonds se relèvent clé par clé.

Format des réponses

Toujours la même enveloppe, succès comme échec.

Succès

{
  "success": true,
  "data": { ... },
  "timestamp": "2026-10-17T18:04:11+02:00"
}

Échec

{
  "success": false,
  "error": {
    "message": "Quota dépassé : 300 requêtes par minute au maximum. Réessayez dans 23 secondes.",
    "code": 429
  },
  "timestamp": "2026-10-17T18:04:11+02:00"
}

Pagination

Les paramètres page et limit pilotent les listes ; limit est plafonné à 100. Deux formes coexistent :

/articles, /articles/search et /categories/{slug}/articles portent un bloc pagination dans data :

"pagination": { "total": 128455, "page": 2, "limit": 50, "total_pages": 2570 }

/topics et /topics/{id}/articles placent total, page, limit et total_pages directement dans data, à côté de la liste :

"data": { "topics": [ ... ], "total": 499910, "page": 2, "limit": 50, "total_pages": 9999 }

Erreurs

Le code HTTP porte le sens ; le message dit quoi corriger.

CodeSignificationQue faire
400Requête mal forméeUn paramètre obligatoire manque ou n'a pas la forme attendue.
401Clé absente ou invalideVérifiez l'en-tête X-API-Key. Une clé révoquée renvoie aussi 401.
403Accès refuséLa clé est restreinte (adresse IP ou point d'entrée). Les routes /webhooks ne sont pas ouvertes et répondent 403.
404IntrouvableLe point d'entrée ou la ressource n'existe pas.
429Quota dépasséAttendez le délai indiqué par l'en-tête Retry-After.
500Erreur serveurIncident de notre côté. Réessayez, puis écrivez-nous si cela persiste.
503Service indisponibleMaintenance ou base injoignable. Réessayez dans quelques instants.

Présence dans Discover

Le cœur de l'API : savoir si une URL a été repérée dans Google Discover, et combien de fois.

GET /discover/check

Vérifie une URL.

ParamètreDescription
urlURL complète à vérifier (obligatoire)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/discover/check?url=https://www.20minutes.fr/exemple-article"
Voir la réponse
{
  "success": true,
  "data": {
    "url": "https://www.20minutes.fr/exemple-article",
    "present": true,
    "occurrences": 3,
    "first_seen": "2026-09-14 06:12:03",
    "last_seen": "2026-09-16 19:40:55",
    "title": "Le titre de l'article",
    "source": "20 Minutes",
    "category": "Actualité"
  },
  "timestamp": "2026-10-17T18:04:11+02:00"
}

GET /discover/check

Vérifie jusqu'à 100 URL d'un coup.

ParamètreDescription
urlsURL séparées par des virgules ou des retours à la ligne (100 au maximum)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/discover/check?urls=https://a.fr/un,https://b.fr/deux"

POST /discover/check

Même chose en JSON — à préférer au-delà de quelques URL, une URL longue sature vite la ligne de requête.

Corps de la requête :

{ "urls": ["https://a.fr/un", "https://b.fr/deux"] }
Voir la réponse
{
  "success": true,
  "data": {
    "summary": { "total": 2, "present": 1, "absent": 1, "truncated": false, "max_urls": 100 },
    "results": [ { "url": "https://a.fr/un", "present": true, "occurrences": 2, "...": "..." } ]
  },
  "timestamp": "2026-10-17T18:04:11+02:00"
}

Articles

Les articles détectés dans Discover, avec leurs métadonnées.

GET /articles

Liste paginée (bloc pagination dans data).

ParamètreDescription
pagenuméro de page (1 par défaut)
limittaille de page, 100 au maximum (50 par défaut)
categoryfiltre sur la catégorie
sourcefiltre sur la source (nom du site ou domaine)
date_fromdate de début (AAAA-MM-JJ)
date_todate de fin (AAAA-MM-JJ)
sortimport_date, og_title, categorie_ia, og_site_name ou score (import_date par défaut)
orderASC ou DESC (DESC par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/articles?limit=20&category=Sport"

GET /articles/{id}

Détail d'un article.

curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/articles/128455"

GET /articles/search

Recherche dans les titres et les descriptions.

ParamètreDescription
qterme recherché, 3 caractères au minimum (obligatoire)
pagenuméro de page
limittaille de page, 100 au maximum
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/articles/search?q=intelligence%20artificielle"

GET /articles/new

Articles arrivés récemment.

ParamètreDescription
hoursfenêtre en heures, 168 au maximum (24 par défaut)
limitnombre d'articles, 1 000 au maximum (100 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/articles/new?hours=6&limit=50"

Catégories

La classification thématique appliquée aux articles.

GET /categories

Toutes les catégories avec leur volumétrie.

curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/categories"

GET /categories/{slug}/articles

Articles d'une catégorie.

ParamètreDescription
pagenuméro de page
limittaille de page, 100 au maximum (50 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/categories/sport/articles?limit=10"

Sujets

Le graphe de sujets construit à partir des articles.

GET /topics

Liste des sujets (pagination à plat dans data).

ParamètreDescription
pagenuméro de page
limittaille de page, 100 au maximum (50 par défaut)
searchfiltre sur le nom
min_articlesnombre minimum d'articles rattachés
sortscore, name ou recent (score par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics?sort=recent&limit=20"
Voir la réponse
{
  "success": true,
  "data": {
    "topics": [
      { "id": 6, "name": "Intelligence artificielle", "article_count": 1842, "dernier_article": 128455, "...": "..." }
    ],
    "total": 499910,
    "page": 1,
    "limit": 20,
    "total_pages": 24996
  },
  "timestamp": "2026-10-17T18:04:11+02:00"
}

GET /topics/trending

Sujets en progression (liste directement dans data).

ParamètreDescription
limit50 au maximum (10 par défaut)
min_articles_24harticles minimum sur les dernières 24 h (3 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/trending?limit=20"

GET /topics/daily

Sujets du jour : topics qui montent sur 6, 24 ou 48 h par rapport aux 7 jours précédents, avec score 0-100, statut et 3 articles exemples.

ParamètreDescription
categorycatégorie exacte (toutes par défaut)
regionslug de région, ex. bretagne (toute la France par défaut)
hours6, 24 ou 48 (24 par défaut)
limit25 au maximum (25 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/daily?category=Sport&hours=6"

GET /topics/popular

Sujets les plus traités (liste directement dans data).

ParamètreDescription
limit50 au maximum (10 par défaut)
daysfenêtre en jours, 90 au maximum (30 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/popular?days=7"

GET /topics/search

Recherche de sujets.

ParamètreDescription
qterme recherché, 2 caractères au minimum (obligatoire)
limit100 au maximum (20 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/search?q=climat"

GET /topics/{id}

Détail d'un sujet et sujets liés.

curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/6"

GET /topics/{id}/articles

Articles rattachés à un sujet (pagination à plat dans data).

ParamètreDescription
pagenuméro de page
limittaille de page, 100 au maximum (20 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/6/articles"

Statistiques

Vues agrégées sur l'ensemble du corpus.

GET /analytics/overview

Volumétrie globale, top catégories, top sources, 7 derniers jours.

curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/analytics/overview"

GET /analytics/categories

Répartition par catégorie.

curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/analytics/categories"

GET /analytics/trends

Évolution dans le temps.

ParamètreDescription
daysfenêtre en jours, 90 au maximum (30 par défaut)
curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/analytics/trends?days=14"

Votre compte

Vos propres données et l'état de vos quotas.

GET /me

Identité de la clé et compteurs en cours. Le moyen le plus simple de vérifier qu'une clé fonctionne.

curl -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/me"
Voir la réponse
{
  "success": true,
  "data": {
    "cle": { "prefixe": "gna_7f3a9b2c", "nom": "Mon intégration", "compte": 42 },
    "quotas": {
      "minute": { "limite": 300, "utilise": 3, "reste": 297, "reinit": "2026-10-17T16:05:00+00:00" },
      "heure":  { "limite": 1000, "utilise": 148, "reste": 852, "reinit": "..." },
      "jour":   { "limite": 5000, "utilise": 902, "reste": 4098, "reinit": "..." }
    }
  },
  "timestamp": "2026-10-17T18:04:11+02:00"
}

Connecter un assistant IA (MCP)

Branchez Signalytics sur Claude, Cursor ou tout client compatible MCP : l'assistant interroge Discover, les topics et les Sujets du jour pour répondre à vos questions.

  1. Créez une clé depuis Outils › API.
  2. Ajoutez le serveur https://signalytics.fr/mcp à votre application, avec votre clé à la place de VOTRE_CLE.
  3. Posez votre question : « Quels sujets montent dans Discover depuis ce matin en sport ? »

Claude Code

claude mcp add --transport http signalytics https://signalytics.fr/mcp --header "X-API-Key: VOTRE_CLE"

Cursor (mcp.json)

{
    "mcpServers": {
        "signalytics": {
            "url": "https://signalytics.fr/mcp",
            "headers": {
                "X-API-Key": "VOTRE_CLE"
            }
        }
    }
}

claude.ai · Claude Desktop

Paramètres › Connecteurs › Ajouter un connecteur personnalisé
Adresse : https://signalytics.fr/mcp?api_key=VOTRE_CLE

16 outils en lecture seule : présence d'URL, articles, topics, Sujets du jour, catégories, tendances et quotas. Chaque appel d'outil compte comme une requête de l'API ; claude.ai et Claude Desktop n'envoient pas d'en-tête, la clé figure donc dans l'adresse : utilisez une clé dédiée, révocable à tout moment.

Exemples complets

Deux usages courants, à copier tels quels.

Vérifier un lot d'URL après une publication

Python

import os, requests

CLE = os.environ["SIGNALYTICS_API_KEY"]
urls = [
    "https://exemple.fr/article-un",
    "https://exemple.fr/article-deux",
]

reponse = requests.post(
    "https://www.gnewsalyzer.com/api/v2/discover/check",
    headers={"X-API-Key": CLE, "Content-Type": "application/json"},
    json={"urls": urls},
    timeout=30,
)
reponse.raise_for_status()

resultat = reponse.json()["data"]
print(f"{resultat['summary']['present']} / {resultat['summary']['total']} repérées")

for ligne in resultat["results"]:
    etat = f"{ligne['occurrences']}x" if ligne["present"] else "absente"
    print(f"  {etat:>8}  {ligne['url']}")

Node.js

const CLE = process.env.SIGNALYTICS_API_KEY;

const reponse = await fetch('https://www.gnewsalyzer.com/api/v2/discover/check', {
  method: 'POST',
  headers: { 'X-API-Key': CLE, 'Content-Type': 'application/json' },
  body: JSON.stringify({ urls: [
    'https://exemple.fr/article-un',
    'https://exemple.fr/article-deux',
  ]}),
});

if (reponse.status === 429) {
  const attente = Number(reponse.headers.get('Retry-After') ?? 60);
  throw new Error(`Quota atteint, réessayez dans ${attente} s`);
}

const { data } = await reponse.json();
console.log(`${data.summary.present} / ${data.summary.total} repérées`);

Shell

curl -s -X POST "https://www.gnewsalyzer.com/api/v2/discover/check" \
  -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://exemple.fr/un","https://exemple.fr/deux"]}' \
  | jq '.data.summary'

Suivre les nouveaux articles

curl -s -H "X-API-Key: $SIGNALYTICS_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/articles/new?hours=6&limit=50" \
  | jq '.data.articles[] | {titre: .title, source: .source, date: .import_date_iso}'

Spécification OpenAPI

openapi.yaml décrit l'API au format OpenAPI : importez-le dans Postman, Insomnia ou un générateur de client.

Bonnes pratiques

Gardez la clé hors du code

Une variable d'environnement, un gestionnaire de secrets — jamais un dépôt, jamais du JavaScript exécuté dans un navigateur : une clé posée dans une page web est publique. Pour un usage côté navigateur, appelez l'API depuis votre propre serveur.

Traitez le 429 au lieu de le subir

Lisez Retry-After et attendez le délai indiqué. Réessayer immédiatement ne fait que creuser le trou : les requêtes refusées comptent aussi.

for tentative in range(5):
    reponse = requests.get(url, headers=entetes, timeout=15)
    if reponse.status_code != 429:
        break
    time.sleep(int(reponse.headers.get("Retry-After", 60)))

Groupez

Un appel groupé de 100 URL coûte 10 unités ; 100 appels unitaires en coûtent 100. À résultat identique.

Mettez en cache de votre côté

Les données évoluent au rythme des collectes, pas à la seconde. Rafraîchir toutes les quelques minutes suffit largement et vous laisse du quota pour le reste.

Révoquez plutôt que de renommer

Au moindre doute sur une clé — poussée par erreur dans un dépôt, partagée dans un fil de discussion — révoquez-la et créez-en une autre depuis Outils › API. C'est instantané et gratuit.