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 base | https://www.gnewsalyzer.com/api/v2 |
|---|---|
| Protocole | HTTPS uniquement |
| Format | application/json; charset=utf-8 |
| Authentification | En-tête X-API-Key |
| CORS | Autorisé depuis n'importe quelle origine |
| Version | 2.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.
- Créez un compte — gratuit, sans carte bancaire.
- Ouvrez Outils › API depuis le menu de votre tableau de bord.
- 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.
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 :
| Appel | Coût |
|---|---|
| Cas général | 1 unité |
/discover/check groupé | 1 unité par tranche entamée de 10 URL — 100 URL coûtent 10 unités |
/articles/new?limit=N | 1 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-Limit | Plafond de la fenêtre la plus contrainte à cet instant. |
|---|---|
X-RateLimit-Remaining | Ce qu'il vous reste sur cette fenêtre. |
X-RateLimit-Reset | Horodatage Unix de la remise à zéro. |
X-RateLimit-MinuteX-RateLimit-HourX-RateLimit-Day | Le détail de chaque fenêtre, au format utilisé/plafond. |
Retry-After | Pré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.
| Code | Signification | Que faire |
|---|---|---|
400 | Requête mal formée | Un paramètre obligatoire manque ou n'a pas la forme attendue. |
401 | Clé absente ou invalide | Vérifiez l'en-tête X-API-Key. Une clé révoquée renvoie aussi 401. |
403 | Accès refusé | La clé est restreinte (adresse IP ou point d'entrée). Les routes /webhooks ne sont pas ouvertes et répondent 403. |
404 | Introuvable | Le point d'entrée ou la ressource n'existe pas. |
429 | Quota dépassé | Attendez le délai indiqué par l'en-tête Retry-After. |
500 | Erreur serveur | Incident de notre côté. Réessayez, puis écrivez-nous si cela persiste. |
503 | Service indisponible | Maintenance 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ètre | Description |
|---|---|
url | URL 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ètre | Description |
|---|---|
urls | URL 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ètre | Description |
|---|---|
page | numéro de page (1 par défaut) |
limit | taille de page, 100 au maximum (50 par défaut) |
category | filtre sur la catégorie |
source | filtre sur la source (nom du site ou domaine) |
date_from | date de début (AAAA-MM-JJ) |
date_to | date de fin (AAAA-MM-JJ) |
sort | import_date, og_title, categorie_ia, og_site_name ou score (import_date par défaut) |
order | ASC 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ètre | Description |
|---|---|
q | terme recherché, 3 caractères au minimum (obligatoire) |
page | numéro de page |
limit | taille 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ètre | Description |
|---|---|
hours | fenêtre en heures, 168 au maximum (24 par défaut) |
limit | nombre 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ètre | Description |
|---|---|
page | numéro de page |
limit | taille 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ètre | Description |
|---|---|
page | numéro de page |
limit | taille de page, 100 au maximum (50 par défaut) |
search | filtre sur le nom |
min_articles | nombre minimum d'articles rattachés |
sort | score, 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ètre | Description |
|---|---|
limit | 50 au maximum (10 par défaut) |
min_articles_24h | articles 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ètre | Description |
|---|---|
category | catégorie exacte (toutes par défaut) |
region | slug de région, ex. bretagne (toute la France par défaut) |
hours | 6, 24 ou 48 (24 par défaut) |
limit | 25 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ètre | Description |
|---|---|
limit | 50 au maximum (10 par défaut) |
days | fenê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ètre | Description |
|---|---|
q | terme recherché, 2 caractères au minimum (obligatoire) |
limit | 100 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ètre | Description |
|---|---|
page | numéro de page |
limit | taille 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ètre | Description |
|---|---|
days | fenê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.
- Créez une clé depuis Outils › API.
- Ajoutez le serveur
https://signalytics.fr/mcpà votre application, avec votre clé à la place deVOTRE_CLE. - 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.