BRVM Market Data — West African Stock Exchange API
Pricing
from $0.25 / quotes snapshot
BRVM Market Data — West African Stock Exchange API
The only API for BRVM equity data — delayed quotes, 25+ years of price history, indices, and company fundamentals for all ~47 stocks across 8 West African nations (WAEMU).
BRVM Market Data
The only structured API for the BRVM — West Africa's regional stock exchange. Get delayed quotes, indices, historical prices, company fundamentals, and official announcements for all ~47 listed equities across 8 WAEMU countries.
What is BRVM?
The Bourse Régionale des Valeurs Mobilières (BRVM) is the single regional stock exchange shared by eight francophone West African nations: Côte d'Ivoire, Senegal, Burkina Faso, Benin, Mali, Niger, Togo, and Guinea-Bissau. Founded in 1998 and headquartered in Abidjan, it is the primary capital market for the West African Economic and Monetary Union (WAEMU).
BRVM equities are not covered by mainstream data providers such as Yahoo Finance or Bloomberg at the retail API tier. This Actor provides the only readily accessible, structured API for BRVM data — pulling directly from brvm.org and the BRVM financial database.
What does BRVM Market Data do?
Five data modes in one Actor:
| Mode | What you get |
|---|---|
quotes | Latest delayed prices, change, volume for all ~47 equities |
indices | BRVM Composite, BRVM 30, and BRVM Prestige index values |
historical | Daily close prices and volume per ticker — back to September 1998 |
company | Company fundamentals: ISIN, sector, listing date, shares outstanding, market cap |
announcements | Official issuer press releases and regulatory filings |
All data is delayed by ~15 minutes and sourced exclusively from publicly available pages.
Running on the Apify platform gives you scheduling, automatic retries, proxy rotation, monitoring dashboards, and export in JSON, CSV, or Excel — no infrastructure to manage.
Why use BRVM Market Data?
- Fintech and diaspora investing apps — display portfolio values for users holding BRVM stocks; no other off-the-shelf API covers this exchange
- Quantitative research — 25+ years of daily price history (6,700+ trading sessions) for emerging African market studies
- ESG and impact investing — screen WAEMU-listed companies by sector and country across 8 nations in one call
- Financial dashboards and BI tools — embed BRVM data into Power BI, Tableau, or custom dashboards on a schedule
- Price monitoring and alerts — run on a schedule, compare to a stored baseline, trigger webhooks on moves
How to use BRVM Market Data
- Go to the Actor page on Apify Store and click Try for free
- Select a mode from the dropdown (default:
quotes) - Optionally enter specific Tickers (e.g.
SNTS, SGBC, ETIT) — leave blank for all equities - For
historicalmode, set Start date and End date; set Max items to cap cost - Click Start — a typical quotes run finishes in under 10 seconds
- Download from the Output tab in JSON, CSV, or Excel, or read via the Apify API
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | enum | "quotes" | quotes · indices · historical · company · announcements |
tickers | string[] | all | Filter to specific BRVM symbols, e.g. ["SNTS", "SGBC"]. Leave empty for all. |
dateFrom | string | -30 days | ISO date. historical mode only. |
dateTo | string | today | ISO date. historical mode only. |
maxItems | integer | 1000 | Hard cap on output records — directly bounds cost. |
Quotes (all 47 equities):
{ "mode": "quotes" }
Filtered quotes (3 tickers):
{ "mode": "quotes", "tickers": ["SNTS", "ETIT", "SGBC"] }
Historical (one ticker, full year, capped at 300 rows):
{"mode": "historical","tickers": ["SNTS"],"dateFrom": "2024-01-01","dateTo": "2024-12-31","maxItems": 300}
Output
All modes push records to the default Apify Dataset. Download as JSON, CSV, or Excel from the Output tab.
Every record includes source, fetched_at, and delay_minutes: 15.
quotes
{"ticker": "SNTS","isin": "SN0000000019","name": "SONATEL SENEGAL","country": "SN","sector": "Telecommunications","currency": "XOF","last": 28500,"previous_close": 28900,"change": -400,"change_pct": -1.38,"volume": 2514,"value_xof": 71673000,"trading_date": "2026-05-22","source": "brvm.org","fetched_at": "2026-05-28T11:04:00.000Z","delay_minutes": 15}
indices
{"code": "BRVMC","name": "BRVM Composite","value": 223.08,"change": 1.46,"change_pct": 0.66,"trading_date": "2026-05-28","source": "brvm.org","fetched_at": "2026-05-28T11:04:00.000Z","delay_minutes": 15}
Index codes: BRVMC (Composite), BRVM30, BRVMPR (Prestige).
historical
{"ticker": "SNTS","date": "2026-05-22","open": 28900,"high": 28900,"low": 28500,"close": 28500,"volume": 2514,"source": "brvm.org","fetched_at": "2026-05-28T11:04:00.000Z","delay_minutes": 15}
Note on OHLCV: The BRVM publishes only daily closing prices and volumes — no intraday ticks.
openis set to the previous session's closing price;highandloware derived fromopenandclose. For long-term trend analysis this is accurate; for intraday range analysis it is not.
company
{"ticker": "SNTS","isin": "SN0000000019","name": "SONATEL SENEGAL","country": "SN","sector": "Telecommunications","listing_date": "1998-09-16","shares_outstanding": 100000000,"market_cap_xof": 2850000000000,"website": "https://www.sonatel.sn","source": "brvm.org","fetched_at": "2026-05-28T11:04:00.000Z","delay_minutes": 15}
announcements
{"ticker": "SNTS","title": "SNTS | Notation financière","published_at": "2025-07-07","url": "https://www.brvm.org/sites/default/files/...","summary": null,"source": "brvm.org","fetched_at": "2026-05-28T11:04:00.000Z"}
Field reference — quotes mode
| Field | Description |
|---|---|
ticker | BRVM symbol (e.g. SNTS) |
isin | 12-character ISIN code |
name | Full registered company name |
country | ISO 3166-1 alpha-2 country of incorporation |
sector | Sector classification |
currency | Always XOF (West African CFA franc) |
last | Last traded price in XOF |
previous_close | Prior session closing price |
change | last − previous_close |
change_pct | Percentage change |
volume | Shares traded in the session |
value_xof | Approximate turnover (volume × last) |
trading_date | ISO date of the session |
Scheduling
BRVM trading hours are 09:00–15:00 GMT, Monday–Friday. Use the Apify Scheduler to run on a cron expression:
| Goal | Cron expression | Cost/month (all tickers) |
|---|---|---|
| Every 15 min during trading hours | */15 9-15 * * 1-5 | ~$22 |
| Every 30 min during trading hours | */30 9-15 * * 1-5 | ~$11 |
| Once per trading day (open) | 0 9 * * 1-5 | ~$1.10 |
| Weekly snapshot | 0 9 * * 1 | ~$0.25 |
Combine a quotes run with a webhook to trigger downstream processing when new data arrives.
Pricing
This Actor uses Pay-Per-Event pricing — you pay per data record, not per CPU-minute.
| Event | Price | When |
|---|---|---|
apify-actor-start | $0.00005 | Every run (covers ~5 s compute) |
quotes-snapshot | $0.25 | Once per unfiltered quotes run (~47 records) |
quote-filtered | $0.05 | Per ticker when using the tickers filter |
index-snapshot | $0.10 | Once per indices run (3 records) |
historical-row | $0.01 | Per daily row |
company-record | $0.10 | Per company |
announcement | $0.01 | Per announcement |
Cost examples:
- Full quotes snapshot (all 47 equities, once): $0.25
- 5 filtered tickers (quotes): 5 × $0.05 = $0.25
- One year of history for 1 ticker (~250 rows): $2.50
- Full historical dataset (47 tickers × 6,700 days): ~$3,150 — use
maxItemsand ticker filters to stay within budget
API usage
JavaScript / Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('malmon/brvm-market-data').call({mode: 'quotes',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("malmon/brvm-market-data").call(run_input={"mode": "quotes"})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
curl:
curl -X POST \"https://api.apify.com/v2/acts/malmon~brvm-market-data/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"quotes"}'
For AI agents
This Actor is available via the Apify MCP server at mcp.apify.com. Call it with {"mode": "quotes"} for a full market snapshot or {"mode": "historical", "tickers": ["SNTS"], "dateFrom": "2025-01-01", "dateTo": "2025-12-31"} for historical data. Supports agentic payments via x402 and Skyfire.
FAQ
Is this data real-time? No. All data carries a ~15-minute delay per BRVM's public data policy. Do not use it for live execution decisions.
How far back does historical data go? The BRVM financial database holds records from September 1998 (the exchange's founding). That is 6,700+ trading sessions as of 2026.
Where does the data come from?
quotes, indices, company, and announcements are sourced from brvm.org. historical prices come from bfin.brvm.org, the BRVM's own financial database. No login-gated or paid data sections are accessed.
Is scraping brvm.org permitted?
The Actor scrapes only publicly available pages, without authentication, at a maximum rate of one request per second, and identifies itself via a User-Agent header. Users are responsible for compliance with brvm.org's Terms of Service and applicable law in their jurisdiction.
What countries and currencies are covered? All eight WAEMU member states: Côte d'Ivoire, Senegal, Burkina Faso, Benin, Mali, Niger, Togo, Guinea-Bissau. All prices are in XOF (West African CFA franc).
Why are open/high/low the same in some historical rows?
The BRVM publishes only daily close prices and volumes — no intraday data. open approximates the previous session's close; if the price did not move, open = high = low = close. See the note in the historical output section above.
Known limitations:
- No real-time or order book data
- ISIN codes may be
nullfor some tickers inquotesmode if the company page is unavailable companymode financial fields (shares_outstanding,market_cap_xof) may benullif not published on the issuer's page
Issues and feature requests: Report on the Issues tab or via the Apify console.