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 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 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.

300
par minute
1 000
par heure
5 000
par 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 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.

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 ressource appartient à un autre compte, ou la clé est restreinte.
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: $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"
}
GET /discover/check

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

ParamètreDescription
urlsURLs 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"
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": "...", "present": true, "occurrences": 2, "...": "..." } ]
  }
}

Articles

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

GET /articles

Liste paginée.

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 le domaine
date_fromdate de début (AAAA-MM-JJ)
date_todate de fin (AAAA-MM-JJ)
sortimport_date, title, categorie_ia ou domaine
orderASC 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"
GET /articles/{id}

Détail d'un article.

curl -H "X-API-Key: $GNEWSALYZER_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: $GNEWSALYZER_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: $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.

GET /categories

Toutes les catégories avec leur volumétrie.

curl -H "X-API-Key: $GNEWSALYZER_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
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.

GET /topics

Liste des sujets.

ParamètreDescription
pagenuméro de page
limittaille de page, 100 au maximum
searchfiltre sur le nom
min_articlesnombre minimum d'articles rattachés
sortscore, name ou recent
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics?sort=recent&limit=20"
GET /topics/trending

Sujets en progression.

ParamètreDescription
limit50 au maximum
daysfenêtre en jours, 90 au maximum
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/trending?days=7"
GET /topics/popular

Sujets les plus traités.

ParamètreDescription
limit50 au maximum
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/popular"
GET /topics/search

Recherche de sujets.

ParamètreDescription
qterme recherché
limit50 au maximum
curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/topics/search?q=climat"
GET /topics/{id}/articles

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.

GET /analytics/overview

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"
GET /analytics/categories

Répartition par catégorie.

curl -H "X-API-Key: $GNEWSALYZER_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: $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.

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: $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": "..." }
    }
  }
}
GET /audits

Vos audits Discover (ceux du compte rattaché à la clé).

curl -H "X-API-Key: $GNEWSALYZER_API_KEY" \
  "https://www.gnewsalyzer.com/api/v2/audits"
GET /audits/{token}

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.