Stocks
Delayed and historical price data for equities and ETFs across supported African exchanges — quotes, charts, news pulse, company fundamentals, canonical tickers, and curated market intelligence. All read-only and data-key safe.
Delayed and historical price data for equities and ETFs across all supported African exchanges.
GET /stocks returns equity data; GET /etfs mirrors the same shape for ETFs. All price endpoints
accept exchange-qualified symbols (SCOM.KE) and bare tickers (SCOM) when unambiguous.
Examples use the production base. Swap /api/v1/partner for /api/sandbox/v1/partner (and an
sk_sandbox_ key) to run any of them against the sandbox. Both environments read the same
exchange-supplied, 15-minute-delayed feed. The API refresh target is 900 seconds; inspect asOf
and stale on every quote and never label the price real-time.
List stocks
Returns a cursor-paginated catalogue of tradeable equities. Follow nextCursor while hasMore is
true; narrow the catalogue with the filters below.
/stocks
List stocks (NSE, NGX, JSE, GSE, BRVM, etc.)
Full endpoint documentationlistStocksReturns the full tradeable stock and ETF universe across all supported African exchanges. Provides exchange-supplied, 15-minute-delayed stock price data. The API refresh target is 900 seconds during the published coverage window. These are not real-time prices. MyStocks holds full data rights for every supported exchange. - Nairobi Stock Exchange (NSE) in Kenya (KES) - Nigerian Exchange Group (NGX) in Nigeria (NGN) - Johannesburg Stock Exchange (JSE) in South Africa (ZAR) - Ghana Stock Exchange (GSE) in Ghana (GHS) - BRVM serving 8 West African French-speaking countries (XOF) - LuSE (Zambia), USE (Uganda), BSE (Botswana), DSE (Tanzania), ZSE (Zimbabwe), EGX (Egypt), MSE (Malawi), CSE (Morocco), and SEM (Mauritius). Filter by exchange, sector, asset type, or free-text search. Results are cursor-paginated to keep catalogue responses fast as market coverage grows. Use nextCursor while hasMore is true.
Parameters
exchangestringqueryFilter by exchange code. One of: NSE, NGX, JSE, GSE, BRVM, ZSE, BSE, LUSE, EGX, DSE, USE, MSE, CSE, SEM.
Example: NSE
sectorstringqueryFilter by GICS sector name.
Example: Telecommunications
assetTypeSTOCK | ETFqueryFilter to stocks or ETFs.
searchstringqueryFree-text match against symbol or company name.
Example: safaricom
limitintegerqueryPage size. Defaults to 50 and is capped at 200.
Example: 50
cursorstringqueryContinuation cursor returned as nextCursor by the previous page.
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
stocksobject[]stocks[].idstringUnique stock identifier.
Example: "SCOM.KE"
stocks[].symbolstringExchange-qualified ticker symbol.
Example: "SCOM.KE"
stocks[].namestringFull company name.
Example: "Safaricom PLC"
stocks[].slugstring | nullURL-safe identifier. Interchangeable with symbol.
Example: "safaricom"
stocks[].exchangestringExchange code: NSE, NGX, JSE, GSE, BRVM, ZSE, BSE, LUSE, EGX, DSE, USE, MSE, CSE, SEM.
Example: "NSE"
stocks[].exchangeMicstring | nullISO 10383 operating Market Identifier Code for the listing exchange.
Example: "XNAI"
stocks[].currencystringLocal trading currency.
Example: "KES"
stocks[].sectorstring | nullExample: "Telecommunications"
stocks[].assetTypeSTOCK | ETFstocks[].listingStatusACTIVE | SUSPENDED | DELISTEDstocks[].pricenumber | nullLatest price in local currency.
Example: 16.5
stocks[].usdPricenumber | nullLatest price converted to USD at live spot rate.
Example: 0.1274
stocks[].changenumber | nullAbsolute price change from previous close.
Example: 0.25
stocks[].changePctnumber | nullPercentage price change from previous close.
Example: 1.54
stocks[].opennumber | nullSession opening price in local currency.
stocks[].dayHighnumber | nullIntraday high in local currency.
stocks[].dayLownumber | nullIntraday low in local currency.
stocks[].volumeinteger | nullCurrent session trading volume.
stocks[].previousClosenumber | nullPrior session closing price.
stocks[].logoUrlstring | nullSelf-hosted SVG logo. Safe to use as img src.
Example: "https://mystocks.africa/logos/scom-ke.svg"
stocks[].lastPriceUpdatestring | nullstocks[].marketStatusstringExchange state at quote time: OPEN or CLOSED. Present on /market/quotes and /market/movers responses.
stocks[].bidnumber | nullBest bid. Currently always null (no order-book depth in the data source).
stocks[].asknumber | nullBest ask. Currently always null (no order-book depth in the data source).
stocks[].dataFreshnessSecondsinteger | nullSeconds since the last price update. Present on /market/quotes and /market/movers responses.
stocks[].asOfstring | nullTimestamp of the exchange observation — NOT when the API answered. African equity data is 15-minute delayed and the API refresh target is 900 seconds, so display and evaluate freshness against this value.
stocks[].stalebooleanTrue when the price is older than two refresh intervals (30 minutes). The feed for this symbol is genuinely behind — do not trust the price for pricing a trade.
stocks[].dataQualityobjectThe published market-data freshness contract. African equity quotes are supplied by the exchanges on a 15-minute-delayed basis, not in real time. MyStocks holds full exchange data rights. The API refresh target is 900 seconds during the published coverage window, with an end-of-day pass after market close.
countintegerNumber of stocks in this page.
totalCountinteger | nullExact matching count when known; null for bounded cursor scans.
hasMorebooleannextCursorstringResponse codes
200List of stocks.Single quote
Delayed quote for a single stock. Returns the full StockSummary shape plus open, dayHigh,
dayLow, previousClose, volume, and a self-hosted logoUrl. The symbol path accepts
exchange-qualified (SCOM.KE), slug (safaricom), or bare ticker (SCOM).
/stocks/{symbol}
Get stock detail (NSE, NGX, JSE, etc.)
Full endpoint documentationgetStocksReturns full delayed price and detail data for a single stock. Accepts exchange-qualified symbols (e.g. SCOM.KE for Safaricom PLC on the Nairobi Stock Exchange, DANGCEM.NG for Dangote Cement on the Nigerian Exchange Group, MTN.ZA on the Johannesburg Stock Exchange) or bare tickers (SCOM) when unambiguous.
Parameters
symbolstringpathRequiredExchange-qualified ticker (e.g. SCOM.KE, DANGCEM.NG) or bare ticker.
Example: SCOM.KE
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
idstringUnique stock identifier.
Example: "SCOM.KE"
symbolstringExchange-qualified ticker symbol.
Example: "SCOM.KE"
namestringFull company name.
Example: "Safaricom PLC"
slugstring | nullURL-safe identifier. Interchangeable with symbol.
Example: "safaricom"
exchangestringExchange code: NSE, NGX, JSE, GSE, BRVM, ZSE, BSE, LUSE, EGX, DSE, USE, MSE, CSE, SEM.
Example: "NSE"
exchangeMicstring | nullISO 10383 operating Market Identifier Code for the listing exchange.
Example: "XNAI"
currencystringLocal trading currency.
Example: "KES"
sectorstring | nullExample: "Telecommunications"
assetTypeSTOCK | ETFlistingStatusACTIVE | SUSPENDED | DELISTEDpricenumber | nullLatest price in local currency.
Example: 16.5
usdPricenumber | nullLatest price converted to USD at live spot rate.
Example: 0.1274
changenumber | nullAbsolute price change from previous close.
Example: 0.25
changePctnumber | nullPercentage price change from previous close.
Example: 1.54
opennumber | nullSession opening price in local currency.
dayHighnumber | nullIntraday high in local currency.
dayLownumber | nullIntraday low in local currency.
volumeinteger | nullCurrent session trading volume.
previousClosenumber | nullPrior session closing price.
logoUrlstring | nullSelf-hosted SVG logo. Safe to use as img src.
Example: "https://mystocks.africa/logos/scom-ke.svg"
lastPriceUpdatestring | nullmarketStatusstringExchange state at quote time: OPEN or CLOSED. Present on /market/quotes and /market/movers responses.
bidnumber | nullBest bid. Currently always null (no order-book depth in the data source).
asknumber | nullBest ask. Currently always null (no order-book depth in the data source).
dataFreshnessSecondsinteger | nullSeconds since the last price update. Present on /market/quotes and /market/movers responses.
asOfstring | nullTimestamp of the exchange observation — NOT when the API answered. African equity data is 15-minute delayed and the API refresh target is 900 seconds, so display and evaluate freshness against this value.
stalebooleanTrue when the price is older than two refresh intervals (30 minutes). The feed for this symbol is genuinely behind — do not trust the price for pricing a trade.
dataQualityobjectThe published market-data freshness contract. African equity quotes are supplied by the exchanges on a 15-minute-delayed basis, not in real time. MyStocks holds full exchange data rights. The API refresh target is 900 seconds during the published coverage window, with an end-of-day pass after market close.
dataQuality.asOfstring | nullRequiredTimestamp of the exchange observation, not the time the API response was generated.
dataQuality.ageSecondsinteger | nullRequiredAge of the price in seconds (now − asOf).
dataQuality.stalebooleanRequiredTrue when the price is older than two refresh intervals.
dataQuality.delayModeDELAYED | END_OF_DAYRequiredDELAYED — exchange-supplied data in the 15-minute-delayed latency class. END_OF_DAY — outside the window; this is the most recent close, not a live quote.
dataQuality.delayMinutesintegerRequiredExchange feed latency class in minutes. This is distinct from the API refresh target.
Example: 15
dataQuality.refreshIntervalSecondsintegerRequiredTarget interval between API ingestion refreshes during the published coverage window.
Example: 900
dataQuality.providermstocks | mansaRequiredMyStocks ingestion connector for this exchange feed. This field does not describe exchange licensing or partner entitlement.
dataQuality.disclaimerstringRequiredPlain-English statement of what this price is and is not.
Response codes
200Stock detail.404Symbol not found.Price chart
The canonical stock-chart contract is GET /stocks/{symbol}/candles.
Its response reports per-candle ohlcAvailable and series-level qualityStatus, qualityIssues,
ohlcCoveragePct, volumeCoveragePct, and recommendedChartType. Use those fields to choose a
candlestick, line, or unavailable state instead of assuming every listed symbol has complete OHLCV.
It returns universal EOD closes plus OHLCV where available, in the listing currency with instrument and quality metadata. Intraday bucket requests can be sparse; inspect SPARSE_INTRADAY_COVERAGE and observed cadence.
The /stocks/{symbol}/chart and /history routes are deprecated compatibility shapes scheduled for
removal on 2026-10-01. New integrations should not depend on their parallel-array schemas.
/stocks/{symbol}/candles
Historical stock candles
Full endpoint documentationgetStockCandlesReturns chart-ready OHLCV candles in the listing currency, sorted oldest-first. from and to define an inclusive date window; interval selects intraday bucket sizes or daily/weekly/monthly aggregation. African equity observations are exchange-supplied and 15-minute delayed. The API refresh target is 900 seconds during the published coverage window. This is pull-based market data—not a real-time or tick feed. Every listed African equity has EOD data for a line chart; complete reported OHLCV is instrument-dependent. Intraday candles are built only from observations captured after the intraday rollout; missing observations are never interpolated. The current delayed capture can be materially coarser than the requested 15m or 1h bucket, so inspect SPARSE_INTRADAY_COVERAGE, samplingCadenceSeconds, and intradayObservationCount before rendering an intraday chart. Older daily source rows may contain only close, or omit volume. Use each candle's volumeAvailable and the series coverage metadata before enabling volume-dependent indicators. Prices are raw and unadjusted for splits and dividends. MyStocks holds market-data rights for every supported exchange, so endpoint availability is not gated by missing exchange licences. Authenticated partners may display these candles to their end-users under their Partner Agreement. Raw-feed redistribution, bulk export, and standalone data products remain governed by that agreement and applicable downstream-use terms.
Parameters
symbolstringpathRequiredExchange-qualified ticker (recommended) or an unambiguous bare ticker.
Example: SCOM.KE
interval15m | 1h | 1d | 1w | 1moqueryCandle bucket interval. 15m and 1h never interpolate missing observations and may be sparse on the delayed capture; 1mo means one calendar month. 1m is not supported.
Example: 1d
fromstringqueryInclusive start date. Defaults to 30 calendar days ago.
Example: 2026-01-01
tostringqueryInclusive end date. Defaults to today.
Example: 2026-08-10
adjustmentrawqueryPrice-adjustment mode. Only raw, unadjusted exchange prices are currently available.
Example: raw
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
symbolstringRequiredExample: "SCOM.KE"
namestring | nullRequiredExample: "Safaricom PLC"
exchangestring | nullRequiredExample: "NSE"
currencystringRequiredExample: "KES"
interval15m | 1h | 1d | 1w | 1moRequiredadjustmentrawRequiredcandlesobject[]Requiredcandles[].timestampstringRequiredUTC start of the 15-minute, hourly, daily, ISO-week, or calendar-month bucket.
Example: "2026-08-03T00:00:00.000Z"
candles[].opennumberRequiredExample: 16.2
candles[].highnumberRequiredExample: 16.75
candles[].lownumberRequiredExample: 16.1
candles[].closenumberRequiredExample: 16.5
candles[].volumeintegerRequiredReported or sampled volume in the candle bucket. Check volumeAvailable before using it.
Example: 2450000
candles[].ohlcAvailablebooleanRequiredTrue when OHLC was reported or sampled; false when open/high/low are close-derived fallbacks.
candles[].volumeAvailablebooleanRequiredTrue when the source supplied volume for every observation in this candle.
metaobjectRequiredmeta.request_idstringUnique identifier for this request. Include in support tickets for tracing.
Example: "4f6e1a2b-3c4d-5e6f-7a8b-9c0d1e2f3a4b"
meta.timestampstringISO 8601 UTC timestamp of when the response was generated.
Example: "2026-06-04T10:23:45.123Z"
meta.exchangestring | nullExchange code the request was scoped to, when applicable.
Example: "NSE"
meta.symbolstring | nullTicker symbol the request was scoped to, when applicable.
Example: "SCOM.KE"
meta.fromstringRequiredmeta.tostringRequiredmeta.countintegerRequiredmeta.sourcedelayed_eod | delayed_intradayRequiredmeta.asOfstring | nullRequiredTimestamp of the latest returned candle, or null when the range is empty.
meta.ohlcQualityreported | mixed | close_derived | sampledRequiredmeta.ohlcAvailablebooleanRequiredmeta.ohlcCoveragePctnumberRequiredmeta.flatCandlePctnumberRequiredmeta.volumeAvailablebooleanRequiredmeta.volumeCoveragePctnumberRequiredmeta.volumeStatusunavailable | partial | completeRequiredmeta.zeroVolumePctnumberRequiredmeta.qualityStatuscomplete | partial | degraded | unavailableRequiredmeta.qualityIssuesstring[]Requiredmeta.recommendedChartTypecandlestick | line | noneRequiredServer recommendation derived from price quality. Any missing OHLC, a flat-candle rate of 25% or more, or sparse intraday observations produces line; incomplete volume alone does not prevent candlesticks.
meta.samplingCadenceSecondsinteger | nullMedian observed same-session gap between source snapshots, not a promised target cadence.
Example: 14400
meta.intradayObservationCountinteger | nullSource observations available for the requested intraday window before bucketing.
meta.coverageStartsAtstring | nullmeta.adjustedfalseRequiredmeta.sandboxbooleanResponse codes
200Historical candles and data-quality metadata.400Invalid date, interval, adjustment, or interval-specific date range.401Unauthorized.404Symbol not found or ambiguous.News pulse
Recent news headlines, corporate announcements, and analyst sentiment for a stock. Use it to populate a "News" tab or price-movement explanation in your UI.
/stocks/{symbol}/pulse
Stock Pulse (news)
Full endpoint documentationlistPulseReturns recent news articles and exchange announcements for a specific stock. Sourced from African financial news networks and official exchange feeds.
Parameters
symbolstringpathRequiredExample: SCOM.KE
limitintegerqueryExample: 10
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
articlesobject[]articles[].titlestringarticles[].summarystringarticles[].urlstringarticles[].sourcestringarticles[].publishedAtstringarticles[].imageUrlstring | nullResponse codes
200News articles for this stock.Company profiles
Company fundamentals: description, sector, market cap, P/E ratio, EPS, 52-week high/low, and financial
highlights. Also available as a list via GET /companies with ?exchange= and ?sector= filters.
GET /companies/{symbol}/news returns curated news and regulatory announcements (same shape as
/pulse, sourced from exchange filings and newswires; supports ?limit= and ?cursor=).
Cursor-paginated canonical ticker list containing each symbol, slug, display name, and exchange. Use
it to build a local symbol-resolution map or search index, following nextCursor until hasMore is
false.
/companies/{symbol}
Company profile
Full endpoint documentationgetCompaniesReturns detailed company profile including description, headquarters, sector, key financials, and links.
Parameters
symbolstringpathRequiredExample: SCOM.KE
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
symbolstringnamestringexchangestringsectorstring | nullcountrystringdescriptionstring | nullwebsitestring | nulllogoUrlstring | nullmarketCapnumber | nullpeRationumber | nullResponse codes
200Company profile.404Company not found./companies
List companies
Full endpoint documentationlistCompaniesReturns company profiles with fundamental data (description, sector, country, financials). Supports exchange and sector filtering.
Parameters
exchangestringqueryExample: JSE
sectorstringquerycursorstringqueryOpaque cursor returned by the previous page.
limitintegerqueryExample: 50
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
companiesobject[]companies[].symbolstringcompanies[].namestringcompanies[].exchangestringcompanies[].sectorstring | nullcompanies[].countrystringcompanies[].descriptionstring | nullcompanies[].logoUrlstring | nullcountintegerhasMorebooleannextCursorstring | nullResponse codes
200Company list./companies/{symbol}/news
Company news & corporate actions
Full endpoint documentationlistNewsReturns a merged, reverse-chronological feed for a single company: MyStocks' curated market-intelligence items (source: MARKET_NEWS) plus corporate actions such as dividends, splits, and rights issues (source: CORPORATE_ACTION). This is the same curated editorial content shown in the MyStocks consumer app — not a high-volume third-party newswire. Filter to one kind with ?type=NEWS.
Parameters
symbolstringpathRequiredExample: SCOM.KE
typestringqueryOptional filter by item type, e.g. NEWS or a corporate-action type (DIVIDEND, SPLIT, ...).
Example: NEWS
limitintegerqueryExample: 50
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
symbolstringExample: "SCOM.KE"
namestringExample: "Safaricom PLC"
countintegerExample: 5
itemsobject[]items[].idstringitems[].sourceMARKET_NEWS | CORPORATE_ACTIONitems[].typestringNEWS for market intel; the action type (e.g. DIVIDEND) for corporate actions.
Example: "NEWS"
items[].titlestringitems[].descriptionstringitems[].urlstringitems[].exDatestringEx-date (corporate actions only).
items[].payDatestringPay-date (corporate actions only).
items[].amountnumberDistribution amount (corporate actions only).
items[].currencystringitems[].createdAtstringResponse codes
200Merged company news and corporate-action feed./companies/tickers
Ticker symbols
Full endpoint documentationlistTickersReturns a cursor-paginated ticker catalogue across exchanges. Useful for symbol autocomplete or validation.
Parameters
exchangestringqueryassetTypestringquerysearchstringquerylimitintegerqueryExample: 50
cursorstringqueryOpaque cursor returned by the previous page.
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
tickersstring[]Example: ["SCOM.KE","EQTY.KE","DANGCEM.NG","NPN.ZA"]
countintegerhasMorebooleannextCursorstring | nullResponse codes
200All ticker symbols.Market intelligence
Editorial market-intelligence articles and exchange announcements curated by the MyStocks research
team. Filter the list by ?exchange=NGX or ?symbol=SCOM.KE (returns { articles, count }, newest
first). The detail route resolves by document ID or URL slug and includes the full body field.
/market-intel
Market Intel feed
Full endpoint documentationlistMarketIntelReturns curated editorial articles across all African exchanges — macro analysis, sector reports, earnings commentary, and exchange announcements. Updated throughout the trading day.
Parameters
exchangestringquerysymbolstringquerylimitintegerqueryExample: 20
cursorstringqueryLast returned article ID; keep filters unchanged. Unknown cursors return 400.
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
articlesobject[]Requiredarticles[].idstringRequiredarticles[].titlestring | nullRequiredarticles[].summarystring | nullRequiredarticles[].categorystring | nullRequiredarticles[].exchangestring | nullRequiredarticles[].publishedAtstring | nullRequiredarticles[].createdAtstring | nullRequiredcountintegerRequiredhasMorebooleanRequirednextCursorstring | nullRequiredResponse codes
200Market intelligence articles.400Invalid limit or cursor./market-intel/{id}
Market intel article detail
Full endpoint documentationgetMarketIntelArticleReturns full detail for a single market intelligence article, including the full body. Resolves by Firestore document ID or slug.
Parameters
idstringpathRequiredArticle document ID or URL slug.
Example: nse-q1-2026-outlook
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Response fields
idstringtitlestringsummarystring | nullbodystring | nullFull article HTML or markdown content.
slugstring | nullcategorystring | nullsymbolsstring[]exchangestring | nullimageUrlstring | nullsourcestring | nullsourceUrlstring | nullauthorstring | nulltagsstring[]publishedAtstring | nullcreatedAtstring | nullResponse codes
200Article detail with full body.404Article not found.Was this page useful?
Your signal helps us tighten partner onboarding docs.
Last updated on