BRVM Live

Documentation

API BRVM Live

Une API HTTP simple pour récupérer les cours des actions de la BRVM en JSON ou en CSV. Pas de compte, pas de SDK : une requête GET suffit.

Base URL https://votre-domaine.tld

Démarrage rapide

Remplacez https://votre-domaine.tld par l’URL de votre instance. Les exemples ci-dessous s’adaptent automatiquement au domaine courant lorsque JavaScript est activé.

cURL
curl -s https://votre-domaine.tld/api/cours
JavaScript
const response = await fetch('https://votre-domaine.tld/api/cours');
const data = await response.json();

for (const action of data.actions) {
  console.log(action.symbole, action.cloture, action.variation_pct);
}
Python
import requests

data = requests.get(
    "https://votre-domaine.tld/api/cours",
    timeout=10,
).json()

for action in data["actions"]:
    print(action["symbole"], action["cloture"])
Google Sheets / Excel
=IMPORTDATA("https://votre-domaine.tld/api/cours?format=csv")
Astuce : pour un symbole précis, ajoutez ?symbole=ONTBF. Pour un fichier, utilisez ?format=csv.

Endpoints

GET /api/cours

Renvoie toutes les actions cotées, avec la date de mise à jour de la source.

Paramètres de /api/cours
Paramètre Valeurs Défaut Description
symbole texte — Filtre une action par son symbole, insensible à la casse (ex. ONTBF).
format json, csv json Format de la réponse. csv renvoie un fichier téléchargeable.
Réponse JSON (extrait)
{
  "maj": "Vendredi, 6 novembre, 2026 - 22:45",
  "nombre": 48,
  "actions": [
    {
      "symbole": "ABJC",
      "nom": "SERVAIR ABIDJAN COTE D'IVOIRE",
      "volume": 3026,
      "cours_veille": 3395,
      "ouverture": 3400,
      "cloture": 3400,
      "variation_pct": 0.15
    }
  ],
  "source": "https://www.brvm.org/fr/cours-actions/0",
  "recupere_le": "2026-11-08T21:42:07.000Z",
  "mis_a_jour_le": "2026-11-08T21:42:07.000Z",
  "perime": false
}

GET /api/cours?symbole=ONTBF

Renvoie une seule action. Si le symbole n’existe pas : 404 avec la liste symboles_disponibles.

cURL
curl -s "https://votre-domaine.tld/api/cours?symbole=ONTBF"

GET /api/cours?format=csv

Export CSV encodé en UTF-8 avec BOM, compatible Excel et Google Sheets. Les cellules texte sont protégées contre l’injection de formules.

En-têtes HTTP
Content-Type: text/csv; charset=utf-8
Content-Disposition: attachment; filename="cours-brvm-2026-11-08.csv"

symbole,nom,volume,cours_veille,ouverture,cloture,variation_pct
ABJC,"SERVAIR ABIDJAN COTE D'IVOIRE",3026,3395,3400,3400,0.15

GET /api/visites

Statistiques de fréquentation agrégées et anonymes : vues totales, visiteurs uniques cumulés par jour, activité du jour et série sur 30 jours.

Réponse JSON
{
  "vues_total": 1024,
  "visiteurs_uniques": 312,
  "aujourd_hui": { "jour": "2026-11-08", "vues": 48, "uniques": 31 },
  "serie_30_jours": [
    { "jour": "2026-11-08", "vues": 48, "uniques": 31 }
  ]
}

GET /health

Healthcheck pour la supervision : état de la base et du cache. Répond 200 si la base est disponible, 503 sinon.

Réponse JSON
{
  "statut": "ok",
  "version": "2.0.0",
  "uptime_s": 3600,
  "base_de_donnees": "ok",
  "cache": { "etat": "frais", "age_s": 120, "actions": 48 }
}

Format des données

Chaque action contient les champs suivants. Les valeurs numériques peuvent être null si la source ne les fournit pas.

Champs d’une action
Champ Type Description
symbolestringCode de l’action (ex. ABJC).
nomstringRaison sociale.
volumenumber | nullNombre de titres échangés.
cours_veillenumber | nullCours de la veille, en FCFA.
ouverturenumber | nullCours d’ouverture, en FCFA.
cloturenumber | nullCours de clôture, en FCFA.
variation_pctnumber | nullVariation en pourcentage (ex. 0.15 = +0,15 %).
variation_pct peut être recalculée à partir de cloture et cours_veille si la source ne la fournit pas. Les montants sont en francs CFA (XOF) et ne doivent pas être interprétés comme un conseil en investissement.

Cache et fraîcheur

Les données sont mises en cache 30 minutes côté serveur. Si brvm.org est indisponible, la dernière réponse valide peut être servie jusqu’à 24 heures. Les en-têtes suivants permettent de savoir ce que vous recevez.

En-têtes de cache
En-tête Valeurs Signification
X-Data-Sourcecache, fresh, staleOrigine de la donnée servie.
X-Data-Updated-Atdate ISO 8601Dernière récupération réussie.
Cache-Controlpublic, max-age=60, s-maxage=1800, stale-while-revalidate=86400Cache navigateur/proxy.
Warning110 - "Response is stale"Présent uniquement si les données sont périmées (le corps contient alors "perime": true).
Vérifier la fraîcheur
curl -sI https://votre-domaine.tld/api/cours | grep -i 'x-data\|cache-control'

Clé API

L’API est publique par défaut, avec un quota limité par IP. Des clés peuvent être configurées côté serveur pour identifier des consommateurs et leur donner un quota plus élevé.

En-tête X-API-Key
curl -s https://votre-domaine.tld/api/cours \
  -H "X-API-Key: votre-cle-api"
Authorization Bearer
curl -s https://votre-domaine.tld/api/cours \
  -H "Authorization: Bearer votre-cle-api"
Mode privé : avec API_KEYS_REQUIRED=true, toute requête /api/* exige une clé, y compris la page publique. À réserver aux déploiements API-only. Pour un site public, laissez false : les clés donnent seulement un quota supérieur.

Génération d’une clé côté serveur : openssl rand -hex 24, puis renseignez API_KEYS dans le fichier .env. Ne placez jamais une clé dans du code front-end.

Quotas et erreurs

Les quotas sont appliqués par IP sur une fenêtre glissante de 15 minutes.

Quotas par endpoint
Endpoint Quota Fenêtre
/api/cours (anonyme)60 requêtes15 min / IP
/api/cours (clé API)600 requêtes15 min / clé
/api/visites120 requêtes15 min / IP
/admin/login10 échecs15 min / IP
/admin/*240 requêtes15 min / IP
Réponse 429
{
  "erreur": "Trop de requêtes vers l’API, réessayez plus tard.",
  "reessayez_dans_secondes": 900
}
Codes d’erreur
Code Signification Que faire ?
400Paramètres invalides.Vérifiez symbole et format.
401Clé API manquante ou invalide.Ajoutez X-API-Key ou Authorization: Bearer.
404Symbole ou endpoint inconnu.Consultez symboles_disponibles.
429Quota dépassé.Attendez la fin de la fenêtre ou utilisez une clé API.
502Source BRVM indisponible et pas de cache de secours.Réessayez dans quelques minutes.
503Base de données indisponible (/health).Consultez les logs du service.
500Erreur interne.Réessayez ; signalez le problème si cela persiste.

Bonnes pratiques

Besoin d’un quota plus élevé ou d’un accès privé ? Configurez API_KEYS sur le serveur et transmettez la clé via un en-tête — jamais dans l’URL ni dans le code public.