L'API Atlas sert des indicateurs pays, régionaux et infranationaux en JSON, normalisés quelle que soit la source d'origine. Toutes les routes commençant par /api/ passent par le même socle d'authentification, de quotas et de format d'erreur, décrit ici une fois pour toutes.
Toute route sous /api/* accepte un en-tête X-API-Key, vérifié par un middleware placé devant chaque requête. Cet en-tête est optionnel : son absence ne bloque pas la requête, elle change seulement le régime de limitation appliqué.
Sans clé — requête anonyme, soumise à une limite globale de 240 requêtes/minute sur tout /api/* (sauf /api/billing/*, exempté). Certaines routes coûteuses en calcul appliquent en plus une limite dédiée de 30 requêtes/minute par IP anonyme : /api/compare, /api/region/{code}, /api/region/custom/aggregate, /api/chart/compare.svg, /api/country/{code}/forecast, /api/subdivisions/{iso3}/indicators/{code}/forecast.
Avec clé valide — le palier associé à la clé (free, starter, pro, business ou consumer_pro) fixe la limite de débit par minute et un quota mensuel décrémenté à chaque appel. Une clé expirée est automatiquement rétrogradée vers free, jamais rejetée. Une clé révoquée est traitée comme si elle n'existait pas (401).
consumer_pro n'est jamais vendu directement par clé API : il ne s'obtient qu'en l'offrant à un compte (voir la page « Compte & clés API »).curl -H "X-API-Key: $ATLAS_KEY" \ "https://atlasfeed.fr/api/countries"
import requests
resp = requests.get(
"https://atlasfeed.fr/api/countries",
headers={"X-API-Key": "VOTRE_CLE"},
)
resp.raise_for_status()
print(resp.json())
const resp = await fetch("https://atlasfeed.fr/api/countries", {
headers: { "X-API-Key": "VOTRE_CLE" },
});
const data = await resp.json();
Quotas comptés par mois calendaire. Un dépassement renvoie une réponse 429, jamais de facturation surprise.
Palier supplémentaire, offert à un compte plutôt que vendu par clé API : consumer_pro — 10 requêtes/minute, 2 000 requêtes/mois.
Trois formes de réponse d'erreur reviennent sur toute route derrière le contrôle de clé API, avant même que la logique propre à la route s'exécute.
tier présent, en-tête Retry-After: 60.tier.tier, monthlyLimit, resetsAt.{"error": "invalid_api_key"}
{"error": "rate_limit_exceeded", "tier": "free", "retryAfter": 60}
{"error": "rate_limit_exceeded", "retryAfter": 60}
{
"error": "quota_exceeded",
"tier": "free",
"monthlyLimit": 1000,
"resetsAt": "2026-10-01T00:00:00+00:00"
}
Certaines routes coûteuses en calcul appliquent en plus, aux seuls appels anonymes, une limite de 30/minute distincte : elle renvoie un 429 de forme différente, {"detail": "..."} (message localisé, clé too_many_requests_minute), sans les champs ci-dessus.
/api/healthSonde de disponibilité, sans authentification requise et sans rate limiting spécifique — utilisable pour un contrôle de supervision externe.
Toujours 200 — aucune erreur possible.
curl "https://atlasfeed.fr/api/health"
import requests
resp = requests.get("https://atlasfeed.fr/api/health")
print(resp.json())const resp = await fetch("https://atlasfeed.fr/api/health");
const data = await resp.json();{"status": "ok", "indicators": 117, "forecastAvailable": false}indicators compte ici le seul catalogue curaté (117 codes), pas la longue traîne : c'est GET /api/indicators qui expose le total complet dans son champ total, un ordre de grandeur au-dessus. forecastAvailable reflète la présence réelle de l'extra forecast (TimesFM) sur ce déploiement.