Démarrage rapide
Obtenez une clé, copiez la ligne, exécutez-la, lisez le JSON.
0. Obtenez une clé
Créez un compte gratuit, ouvrez les clés API et en générez une. Ensuite, conservez-la dans une variable d'environnement :
export FNA_KEY=fna_live_...1. Recherchez
curl -H "Authorization: Bearer $FNA_KEY" "https://freenewsapi.ai/v1/search?q=climate+summit&size=2"{
"took_ms": 41,
"total": 1284,
"total_is_lower_bound": false,
"size": 2,
"offset": 0,
"results": [
{
"id": "9c1f8a4b2d3e5f6071829304a5b6c7d8",
"url": "https://example-news.com/world/climate-summit-opens",
"title": "Climate summit opens with a call for binding targets",
"description": "Delegates from 190 countries gathered on Monday ...",
"published_at": "2026-08-17T09:12:00Z",
"crawled_at": "2026-08-17T10:48:31Z",
"host": "example-news.com",
"sitename": "Example News",
"country": "GB",
"country_source": "cctld",
"lang": "en",
"tld": "com"
}
]
}Trois champs de cette réponse méritent une attention immédiate. total indique le nombre d'articles correspondants, et non le nombre retourné — il est limité à 10,000 pour des raisons de performance, et total_is_lower_bound vous informe lorsque ce plafond est atteint. country_source précise comment le pays a été déterminé, ce qui est important car environ un tiers des valeurs de pays dans tout jeu de données d'actualités sont des inférences plutôt que des faits. Et crawled_at est l'horodatage honnête : les éditeurs peuvent remonter la date de leurs published_at, mais l'heure de crawl est attribuée par le pipeline.
2. Affinez votre recherche
Les filtres se combinent avec AND entre les paramètres et OR au sein d'un même paramètre. Ainsi, country=DE,AT&lang=de se lit comme « articles en langue allemande provenant d'Allemagne ou d'Autriche ». Voici une requête pour les articles en langue ukrainaine d'Ukraine, du plus récent au plus ancien :
curl -H "Authorization: Bearer $FNA_KEY" "https://freenewsapi.ai/v1/search?country=UA&lang=uk&date=today&sort=date&size=10"3. Obtenez le texte complet
Les résultats de la recherche excluent le corps de l'article par défaut pour réduire la taille des réponses. Demandez-le explicitement une fois que vous avez sélectionné les articles qui vous intéressent réellement :
curl -H "Authorization: Bearer $FNA_KEY" "https://freenewsapi.ai/v1/search?q=inflation&full_text=true&size=5"Le texte intégral fait environ 2,000 à 4,000 caractères par article. Vingt articles avec full_text=true représentent environ 40,000 jetons pour un modèle de langage. Sélectionnez d'abord, puis récupérez les corps d'articles. Voir les coûts en jetons.
4. Comptez au lieu de lister
Souvent, la question utile n'est pas « quels sont les articles » mais « y a-t-il quoi que ce soit ici, et où se trouve-t-il ». Compter les réponses pour une fraction du coût — environ 200 jetons contre plusieurs milliers pour une page de résultats — en fait le premier appel idéal pour un agent qui décide si une recherche vaut la peine d'être exécutée :
curl -H "Authorization: Bearer $FNA_KEY" "https://freenewsapi.ai/v1/stats?q=earthquake&date=7d"La réponse fournit des comptes par pays, langue, zone de domaine, éditeur et jour, calculés sur l'ensemble des résultats correspondants plutôt que sur la page courante.
En Python
import os, requests
HEADERS = {"Authorization": "Bearer " + os.environ["FNA_KEY"]}
r = requests.get("https://freenewsapi.ai/v1/search", headers=HEADERS, params={
"q": "semiconductor export controls",
"date": "7d",
"lang": "en",
"size": 20,
"sort": "relevance",
})
for a in r.json()["results"]:
print(a["published_at"], a["host"], a["title"])En JavaScript
const url = new URL("https://freenewsapi.ai/v1/search");
url.search = new URLSearchParams({ q: "central bank", date: "24h", size: "20" });
const { results } = await (await fetch(url, { headers: { Authorization: `Bearer ${FNA_KEY}` } })).json();
results.forEach(a => console.log(a.published_at, a.host, a.title));