Skip to main content

Stock Market Data API

The Stock Market Data API provides comprehensive real-time and analytical data for the Ghana Stock Exchange (GSE), including stock prices, market indices, sector performance, and trading statistics.

Implementation Status:Fully Implemented - All endpoints are ready and functional with mock data provider.

📈 Overview

Access current stock prices, market data, and analytics for all stocks listed on the Ghana Stock Exchange. The API includes advanced filtering, sorting, and sector-based analysis capabilities.

Key Features

  • Real-time Stock Data - Current prices, changes, and trading volume
  • Market Analytics - Market cap, P/E ratios, dividend yields
  • Sector Analysis - Performance metrics by industry sector
  • Market Summary - GSE Composite Index and market-wide statistics
  • Advanced Search - Filter by price range, sector, market cap
  • Historical Context - 52-week highs/lows and trading trends

🔗 Base Endpoint

https://ghana-api.dev/v1/stock-market

📊 Available Stocks & Sectors

Listed Companies (30 Stocks)

The API covers all major publicly traded companies on GSE across multiple sectors:

Banking (9 stocks)

  • GCB Bank Limited (GCB)
  • Ecobank Ghana Limited (EBG)
  • CAL Bank Limited (CAL)
  • Standard Chartered Bank Ghana (SCB)
  • Access Bank Ghana (ACCESS)
  • Fidelity Bank Ghana (FIDELITY)
  • HFC Bank Ghana (HFC)
  • Agricultural Development Bank (ADB)
  • Trust Bank Limited (TBL)

Mining (2 stocks)

  • AngloGold Ashanti Limited (ANGLOGOLD)
  • Newmont Ghana Gold Limited (NEWMONT)

Telecommunications (1 stock)

  • MTN Ghana Limited (MTNGH)

Oil & Gas (2 stocks)

  • Ghana Oil Company Limited (GOIL)
  • Total Petroleum Ghana Limited (TLW)

Manufacturing (4 stocks)

  • Guinness Ghana Breweries (GGBL)
  • Fan Milk Limited (FML)
  • Aluworks Limited (ALW)
  • Starwin Productions Limited (SPL)

And 12+ more across Insurance, Agriculture, Technology, Healthcare, and other sectors.

📋 Available Endpoints

1. Search Stocks

Search and filter stocks based on multiple criteria.

Endpoint: GET /stock-market/search

Query Parameters

ParameterTypeRequiredDescription
qstringNoStock symbol or company name to search for
sectorstringNoFilter by sector (Banking, Mining, Telecommunications, etc.)
minPricenumberNoMinimum stock price in GHS
maxPricenumberNoMaximum stock price in GHS
minMarketCapnumberNoMinimum market capitalization in GHS
maxMarketCapnumberNoMaximum market capitalization in GHS
sortBystringNoSort by field (price, change, changePercent, volume, marketCap)
sortOrderstringNoSort order (asc, desc)
limitnumberNoMaximum results to return (1-100, default: 20)

Example Request

curl -X GET "https://ghana-api.dev/v1/stock-market/search?sector=Banking&sortBy=marketCap&sortOrder=desc&limit=5" \
-H "Accept: application/json"

Example Response

{
"data": [
{
"symbol": "GCB",
"name": "GCB Bank Limited",
"price": 4.5,
"change": 0.15,
"changePercent": 3.45,
"previousClose": 4.35,
"volume": 125000,
"marketCap": 6750000000,
"sector": "Banking",
"dayHigh": 4.65,
"dayLow": 4.4,
"weekHigh52": 5.2,
"weekLow52": 3.8,
"peRatio": 8.5,
"dividendYield": 12.5,
"lastTradingTime": "2024-01-15T16:00:00Z",
"status": "CLOSED"
}
],
"meta": {
"total": 8,
"page": 1,
"limit": 5,
"searchQuery": null
},
"source": "Ghana Stock Exchange + Market Data Providers",
"timestamp": "2024-01-15T10:30:00Z"
}

JavaScript Example

const searchStocks = async (filters = {}) => {
try {
const params = new URLSearchParams(filters);
const response = await fetch(
`https://ghana-api.dev/v1/stock-market/search?${params}`
);
const result = await response.json();

if (!response.ok) {
throw new Error(`API Error: ${response.status}`);
}

return result;
} catch (error) {
console.error("Failed to search stocks:", error.message);
throw error;
}
};

// Search for banking stocks over GHS 5.00
const bankingStocks = await searchStocks({
sector: "Banking",
minPrice: 5.0,
sortBy: "changePercent",
sortOrder: "desc",
limit: 10,
});

console.log(`Found ${bankingStocks.data.length} banking stocks`);

2. Get Specific Stock

Retrieve detailed data for a specific stock by symbol.

Endpoint: GET /stock-market/stock/{symbol}

Path Parameters

ParameterTypeRequiredDescription
symbolstringYesStock symbol (e.g., "GCB", "MTNGH")

Example Request

curl -X GET "https://ghana-api.dev/v1/stock-market/stock/GCB" \
-H "Accept: application/json"

Example Response

{
"symbol": "GCB",
"name": "GCB Bank Limited",
"price": 4.5,
"change": 0.15,
"changePercent": 3.45,
"previousClose": 4.35,
"volume": 125000,
"marketCap": 6750000000,
"sector": "Banking",
"dayHigh": 4.65,
"dayLow": 4.4,
"weekHigh52": 5.2,
"weekLow52": 3.8,
"peRatio": 8.5,
"dividendYield": 12.5,
"lastTradingTime": "2024-01-15T16:00:00Z",
"status": "CLOSED"
}

3. Get All Stocks

Retrieve current data for all stocks listed on GSE.

Endpoint: GET /stock-market/all

Example Request

curl -X GET "https://ghana-api.dev/v1/stock-market/all" \
-H "Accept: application/json"

4. Get Stocks by Sector

Retrieve all stocks in a specific sector.

Endpoint: GET /stock-market/sector/{sector}

Path Parameters

ParameterTypeRequiredDescription
sectorstringYesSector name (e.g., "Banking")

Example Request

curl -X GET "https://ghana-api.dev/v1/stock-market/sector/Banking" \
-H "Accept: application/json"

5. Get Market Summary

Retrieve overall market statistics and GSE indices.

Endpoint: GET /stock-market/market-summary

Example Request

curl -X GET "https://ghana-api.dev/v1/stock-market/market-summary" \
-H "Accept: application/json"

Example Response

{
"indexValue": 3245.67,
"indexChange": 15.43,
"indexChangePercent": 0.48,
"totalVolume": 2500000,
"totalMarketCap": 75000000000,
"advancing": 25,
"declining": 15,
"unchanged": 5,
"marketStatus": "CLOSED",
"lastUpdated": "2024-01-15T16:00:00Z",
"nextMarketOpen": "2024-01-16T09:00:00Z",
"marketClose": "2024-01-15T15:00:00Z"
}

6. Get Sector Performance

Analyze performance metrics across all sectors.

Endpoint: GET /stock-market/sector-performance

Example Request

curl -X GET "https://ghana-api.dev/v1/stock-market/sector-performance" \
-H "Accept: application/json"

Example Response

[
{
"sector": "Banking",
"stockCount": 9,
"avgChangePercent": 2.15,
"marketCap": 25000000000,
"volume": 850000,
"topPerformer": {
"symbol": "GCB",
"name": "GCB Bank Limited",
"changePercent": 3.45,
"price": 4.5
}
},
{
"sector": "Mining",
"stockCount": 2,
"avgChangePercent": 1.85,
"marketCap": 15000000000,
"volume": 450000,
"topPerformer": {
"symbol": "NEWMONT",
"name": "Newmont Ghana Gold Limited",
"changePercent": 2.1,
"price": 28.75
}
}
]

7. Get Available Sectors

List all available stock sectors on GSE.

Endpoint: GET /stock-market/sectors

Example Request

curl -X GET "https://ghana-api.dev/v1/stock-market/sectors" \
-H "Accept: application/json"

Example Response

[
"Banking",
"Insurance",
"Manufacturing",
"Mining",
"Oil & Gas",
"Telecommunications",
"Agriculture",
"Real Estate",
"Technology",
"Utilities",
"Consumer Goods",
"Healthcare",
"Financial Services"
]

🔍 Advanced Usage Patterns

Portfolio Tracking

const trackPortfolio = async (symbols) => {
const stocks = await Promise.all(
symbols.map((symbol) =>
fetch(`https://ghana-api.dev/v1/stock-market/stock/${symbol}`).then(
(res) => res.json()
)
)
);

const totalValue = stocks.reduce(
(sum, stock) => sum + stock.price * stock.volume,
0
);

const totalChange =
stocks.reduce((sum, stock) => sum + stock.changePercent, 0) / stocks.length;

return {
stocks,
totalValue,
avgChangePercent: totalChange,
};
};

// Track a mixed portfolio
const portfolio = await trackPortfolio(["GCB", "MTNGH", "GOIL", "NEWMONT"]);

Sector Analysis Dashboard

const createSectorDashboard = async () => {
const [summary, sectorPerf, sectors] = await Promise.all([
fetch("https://ghana-api.dev/v1/stock-market/market-summary").then((r) =>
r.json()
),
fetch("https://ghana-api.dev/v1/stock-market/sector-performance").then(
(r) => r.json()
),
fetch("https://ghana-api.dev/v1/stock-market/sectors").then((r) =>
r.json()
),
]);

return {
marketOverview: summary,
sectorPerformance: sectorPerf,
availableSectors: sectors,
topSector: sectorPerf[0],
worstSector: sectorPerf[sectorPerf.length - 1],
};
};

Stock Screener

const screenStocks = async (criteria) => {
const params = new URLSearchParams({
minPrice: criteria.minPrice || 1,
maxPrice: criteria.maxPrice || 100,
minMarketCap: criteria.minMarketCap || 1000000,
sector: criteria.sector,
sortBy: "changePercent",
sortOrder: "desc",
limit: 50,
});

const response = await fetch(
`https://ghana-api.dev/v1/stock-market/search?${params}`
);

return response.json();
};

// Find undervalued banking stocks
const undervaluedBanks = await screenStocks({
sector: "Banking",
maxPrice: 5.0,
minMarketCap: 1000000000,
});

📊 Market Hours & Status

Trading Schedule

  • Trading Days: Monday - Friday
  • Market Open: 09:00 GMT (Accra Time)
  • Market Close: 15:00 GMT (Accra Time)
  • Timezone: Africa/Accra
  • Settlement: T+3 (Trade Date + 3 business days)

Status Values

StatusDescription
OPENMarket is currently trading
CLOSEDMarket is closed
PRE_MARKETPre-market trading hours
AFTER_HOURSAfter-hours trading
SUSPENDEDTrading temporarily suspended
HALTEDStock trading halted

📈 Data Coverage & Accuracy

Data Sources

  • Primary: Ghana Stock Exchange official data
  • Secondary: Market data providers and financial aggregators
  • Updates: Real-time during market hours, cached for 5 minutes
  • Historical: 52-week high/low data included

Reliability

  • Uptime: 99.9% availability during market hours
  • Latency: Sub-second response times
  • Caching: Intelligent caching reduces load and improves performance
  • Fallback: Multiple data source providers ensure reliability

🔧 Error Handling

HTTP Status Codes

CodeDescriptionResponse
200SuccessStock data returned successfully
400Bad RequestInvalid query parameters
404Not FoundStock symbol not found
500Internal Server ErrorServer processing error
503Service UnavailableMarket data temporarily unavailable

Error Response Format

{
"statusCode": 404,
"message": "Stock symbol 'XYZ' not found on Ghana Stock Exchange",
"error": "Not Found",
"timestamp": "2024-01-15T10:30:00Z",
"path": "/stock-market/stock/XYZ"
}

🚀 Integration Examples

React Stock Widget

import React, { useState, useEffect } from "react";

const StockWidget = ({ symbol }) => {
const [stock, setStock] = useState(null);
const [loading, setLoading] = useState(true);

useEffect(() => {
const fetchStock = async () => {
try {
const response = await fetch(
`https://ghana-api.dev/v1/stock-market/stock/${symbol}`
);
const stockData = await response.json();
setStock(stockData);
} catch (error) {
console.error("Error fetching stock:", error);
} finally {
setLoading(false);
}
};

fetchStock();
const interval = setInterval(fetchStock, 60000); // Update every minute

return () => clearInterval(interval);
}, [symbol]);

if (loading) return <div>Loading {symbol}...</div>;
if (!stock) return <div>Stock not found</div>;

return (
<div className="stock-widget">
<h3>
{stock.symbol} - {stock.name}
</h3>
<div className="price">
GHS {stock.price}
<span className={stock.change >= 0 ? "positive" : "negative"}>
{stock.change >= 0 ? "+" : ""}
{stock.change} ({stock.changePercent}%)
</span>
</div>
<div className="details">
<p>Volume: {stock.volume.toLocaleString()}</p>
<p>Market Cap: GHS {(stock.marketCap / 1000000).toFixed(1)}M</p>
<p>Sector: {stock.sector}</p>
</div>
</div>
);
};

export default StockWidget;

Python Data Analysis

import requests
import pandas as pd

class GSEAnalyzer:
def __init__(self):
self.base_url = "https://ghana-api.dev/v1/stock-market"

def get_all_stocks(self):
response = requests.get(f"{self.base_url}/all")
return pd.DataFrame(response.json())

def analyze_sector(self, sector):
response = requests.get(f"{self.base_url}/sector/{sector}")
stocks = pd.DataFrame(response.json())

return {
'count': len(stocks),
'avg_price': stocks['price'].mean(),
'total_market_cap': stocks['marketCap'].sum(),
'top_performer': stocks.loc[stocks['changePercent'].idxmax()],
'worst_performer': stocks.loc[stocks['changePercent'].idxmin()]
}

def find_opportunities(self):
# Find stocks with high dividend yield and low P/E ratio
response = requests.get(f"{self.base_url}/search?sortBy=dividendYield&sortOrder=desc&limit=50")
stocks = pd.DataFrame(response.json()['data'])

opportunities = stocks[
(stocks['dividendYield'] > 10) &
(stocks['peRatio'] < 15) &
(stocks['changePercent'] > 0)
]

return opportunities[['symbol', 'name', 'price', 'dividendYield', 'peRatio', 'changePercent']]

# Usage
analyzer = GSEAnalyzer()
banking_analysis = analyzer.analyze_sector('Banking')
investment_opportunities = analyzer.find_opportunities()

📊 Performance Tips

Optimization Strategies

  1. Use Caching - Results are cached for 5 minutes during market hours
  2. Batch Requests - Use search endpoint instead of multiple individual calls
  3. Filter Early - Apply filters in API calls rather than client-side
  4. Limit Results - Use the limit parameter to reduce payload size
  5. Monitor Status - Check market status before making frequent calls

Rate Limiting

  • Limit: 1000 requests per hour per IP
  • Burst: Up to 10 requests per second
  • Headers: Rate limit info included in response headers

🔐 Security & Data Protection

Data Privacy

  • No user authentication required for public market data
  • IP-based rate limiting for fair usage
  • No personal or account information collected
  • HTTPS encryption for all API calls

Data Accuracy Disclaimer

Market data is provided for informational purposes only. While we strive for accuracy, users should verify critical information with official sources before making investment decisions. Past performance does not guarantee future results.


Ready to start building with Ghana Stock Exchange data? 🚀

Interactive API ExplorerCode ExamplesSupport

Made in Ghana 🇬🇭