Démarrage

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.

Authentification

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

Le palier 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
curl -H "X-API-Key: $ATLAS_KEY" \
  "https://atlasfeed.fr/api/countries"
PYTHON
import requests

resp = requests.get(
    "https://atlasfeed.fr/api/countries",
    headers={"X-API-Key": "VOTRE_CLE"},
)
resp.raise_for_status()
print(resp.json())
JAVASCRIPT
const resp = await fetch("https://atlasfeed.fr/api/countries", {
  headers: { "X-API-Key": "VOTRE_CLE" },
});
const data = await resp.json();

Paliers & quotas

Quotas comptés par mois calendaire. Un dépassement renvoie une réponse 429, jamais de facturation surprise.

 
FREE
STARTER
PRO
BUSINESS
Requêtes / minute
5
30
120
500
Quota mensuel
1 000
20 000
200 000
2 000 000

Palier supplémentaire, offert à un compte plutôt que vendu par clé API : consumer_pro — 10 requêtes/minute, 2 000 requêtes/mois.

Format d'erreur commun

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.

Code
Erreur
Cas
401
invalid_api_key
Clé fournie mais inconnue ou révoquée.
429
rate_limit_exceeded (avec clé)
Limite de débit par minute du palier dépassée, clé valide. Champ tier présent, en-tête Retry-After: 60.
429
rate_limit_exceeded (anonyme)
Flood anonyme global (240/min), sans clé. Pas de champ tier.
429
quota_exceeded
Quota mensuel du palier épuisé. Champs tier, monthlyLimit, resetsAt.
401 — invalid_api_key
{"error": "invalid_api_key"}
429 — rate_limit_exceeded (avec clé)
{"error": "rate_limit_exceeded", "tier": "free", "retryAfter": 60}
429 — rate_limit_exceeded (anonyme)
{"error": "rate_limit_exceeded", "retryAfter": 60}
429 — quota_exceeded
{
  "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.

GET/api/health

Sonde de disponibilité, sans authentification requise et sans rate limiting spécifique — utilisable pour un contrôle de supervision externe.

Paramètre
Type
Requis
Défaut
Description
Aucun paramètre.

Toujours 200 — aucune erreur possible.

CURL
curl "https://atlasfeed.fr/api/health"
PYTHON
import requests

resp = requests.get("https://atlasfeed.fr/api/health")
print(resp.json())
JAVASCRIPT
const resp = await fetch("https://atlasfeed.fr/api/health");
const data = await resp.json();
RÉPONSE
{"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.

Cette page ne couvre que le socle commun. Chaque groupe de routes a sa propre page — voir la navigation ci-dessus.