L'API GNewsalyzer
Interrogez depuis vos propres outils les données que GNewsalyzer 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.
| 1. | Créez un compte — gratuit, sans carte bancaire. |
| 2. | Ouvrez Mes clés d'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 -H "X-API-Key: gna_votre_cle" \
"https://www.gnewsalyzer.com/api/v2/me"
<?php
$ch = curl_init('https://www.gnewsalyzer.com/api/v2/me');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('GNEWSALYZER_API_KEY')],
CURLOPT_TIMEOUT => 15,
]);
$reponse = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($reponse['data']);
const reponse = await fetch('https://www.gnewsalyzer.com/api/v2/me', {
headers: { 'X-API-Key': process.env.GNEWSALYZER_API_KEY }
});
if (!reponse.ok) {
throw new Error(`API ${reponse.status}`);
}
const { data } = await reponse.json();
console.log(data.quotas);
import os, requests
reponse = requests.get(
"https://www.gnewsalyzer.com/api/v2/me",
headers={"X-API-Key": os.environ["GNEWSALYZER_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 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é : 60 requêtes par minute au maximum. Réessayez dans 23 secondes.",
"code": 429
},
"timestamp": "2026-10-17T18:04:11+02:00"
}
Pagination
Les listes portent un bloc pagination dans data. Les paramètres
page et limit les pilotent ; limit est plafonné à 100.
"pagination": { "total": 128455, "page": 2, "limit": 50, "total_pages": 2570 }
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 ressource appartient à un autre compte, ou la clé est restreinte. |
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.
Vérifie une URL.
| Paramètre | Description |
|---|---|
url | URL complète à vérifier (obligatoire) |
curl -H "X-API-Key: $GNEWSALYZER_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"
}
Vérifie jusqu'à 100 URL d'un coup.
| Paramètre | Description |
|---|---|
urls | URLs séparées par des virgules (100 au maximum) |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/discover/check?urls=https://a.fr/un,https://b.fr/deux"
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": "...", "present": true, "occurrences": 2, "...": "..." } ]
}
}
Articles
Les articles détectés dans Discover, avec leurs métadonnées.
Liste paginée.
| 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 le domaine |
date_from | date de début (AAAA-MM-JJ) |
date_to | date de fin (AAAA-MM-JJ) |
sort | import_date, title, categorie_ia ou domaine |
order | ASC ou DESC (DESC par défaut) |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/articles?limit=20&category=Sport"
Détail d'un article.
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/articles/128455"
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: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/articles/search?q=intelligence%20artificielle"
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: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/articles/new?hours=6&limit=50"
Catégories
La classification thématique appliquée aux articles.
Toutes les catégories avec leur volumétrie.
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/categories"
Articles d'une catégorie.
| Paramètre | Description |
|---|---|
page | numéro de page |
limit | taille de page, 100 au maximum |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/categories/sport/articles?limit=10"
Sujets
Le graphe de sujets construit à partir des articles.
Liste des sujets.
| Paramètre | Description |
|---|---|
page | numéro de page |
limit | taille de page, 100 au maximum |
search | filtre sur le nom |
min_articles | nombre minimum d'articles rattachés |
sort | score, name ou recent |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/topics?sort=recent&limit=20"
Sujets en progression.
| Paramètre | Description |
|---|---|
limit | 50 au maximum |
days | fenêtre en jours, 90 au maximum |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/topics/trending?days=7"
Sujets les plus traités.
| Paramètre | Description |
|---|---|
limit | 50 au maximum |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/topics/popular"
Recherche de sujets.
| Paramètre | Description |
|---|---|
q | terme recherché |
limit | 50 au maximum |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/topics/search?q=climat"
Articles rattachés à un sujet.
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/topics/6/articles"
Statistiques
Vues agrégées sur l'ensemble du corpus.
Volumétrie globale, top catégories, top sources, 7 derniers jours.
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/analytics/overview"
Répartition par catégorie.
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/analytics/categories"
Évolution dans le temps.
| Paramètre | Description |
|---|---|
days | fenêtre en jours, 90 au maximum (30 par défaut) |
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/analytics/trends?days=14"
Votre compte
Vos propres données et l'état de vos quotas.
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: $GNEWSALYZER_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": 60, "utilise": 3, "reste": 57, "reinit": "2026-10-17T16:05:00+00:00" },
"heure": { "limite": 1000, "utilise": 148, "reste": 852, "reinit": "..." },
"jour": { "limite": 5000, "utilise": 902, "reste": 4098, "reinit": "..." }
}
}
}
Vos audits Discover (ceux du compte rattaché à la clé).
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/audits"
Détail d'un de vos audits, données comprises.
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
"https://www.gnewsalyzer.com/api/v2/audits/a1b2c3d4e5f6"
Exemples complets
Deux usages courants, à copier tels quels.
Vérifier un lot d'URL après une publication
import os, requests
CLE = os.environ["GNEWSALYZER_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']}")
const CLE = process.env.GNEWSALYZER_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`);
curl -s -X POST "https://www.gnewsalyzer.com/api/v2/discover/check" \
-H "X-API-Key: $GNEWSALYZER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"urls":["https://exemple.fr/un","https://exemple.fr/deux"]}' \
| jq '.data.summary'
Suivre les articles d'une catégorie
curl -s -H "X-API-Key: $GNEWSALYZER_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.
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. C'est instantané et gratuit.