Historical ETF price data
curl --request GET \
--url https://api.ngnmarket.com/v1/etfs/{symbol}/chart \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ngnmarket.com/v1/etfs/{symbol}/chart"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ngnmarket.com/v1/etfs/{symbol}/chart', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ngnmarket.com/v1/etfs/{symbol}/chart",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ngnmarket.com/v1/etfs/{symbol}/chart"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ngnmarket.com/v1/etfs/{symbol}/chart")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ngnmarket.com/v1/etfs/{symbol}/chart")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"format": "detailed",
"period": "30d",
"count": 20,
"data": [
{
"date": "2026-05-12",
"close": 4260,
"open": 4650,
"high": 4650,
"low": 4185,
"volume": 9550,
"value_traded": 40683000,
"change_percent": -8.39,
"normalized_value": 100
},
{
"date": "2026-05-13",
"close": 4330,
"open": 4255,
"high": 4590,
"low": 3970,
"volume": 10620,
"value_traded": 45984600,
"change_percent": 1.64,
"normalized_value": 101.64
}
],
"statistics": {
"start_date": "2026-05-12",
"end_date": "2026-06-10",
"start_price": 4260,
"end_price": 4175,
"change": -85,
"change_percent": -2,
"min_price": 3911.5,
"max_price": 4650,
"return_1m": -2,
"return_3m": null,
"return_1y": null,
"return_ytd": null
},
"meta": {
"plan": "hobby",
"calls_used": 143,
"calls_remaining": 9857,
"reset_at": "2026-07-15T23:57:00.000Z"
}
}ETF Endpoints
ETF Chart
Retrieve historical daily price data for any NGX-listed ETF or ETP.
GET
/
etfs
/
{symbol}
/
chart
Historical ETF price data
curl --request GET \
--url https://api.ngnmarket.com/v1/etfs/{symbol}/chart \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ngnmarket.com/v1/etfs/{symbol}/chart"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ngnmarket.com/v1/etfs/{symbol}/chart', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ngnmarket.com/v1/etfs/{symbol}/chart",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ngnmarket.com/v1/etfs/{symbol}/chart"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ngnmarket.com/v1/etfs/{symbol}/chart")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ngnmarket.com/v1/etfs/{symbol}/chart")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"format": "detailed",
"period": "30d",
"count": 20,
"data": [
{
"date": "2026-05-12",
"close": 4260,
"open": 4650,
"high": 4650,
"low": 4185,
"volume": 9550,
"value_traded": 40683000,
"change_percent": -8.39,
"normalized_value": 100
},
{
"date": "2026-05-13",
"close": 4330,
"open": 4255,
"high": 4590,
"low": 3970,
"volume": 10620,
"value_traded": 45984600,
"change_percent": 1.64,
"normalized_value": 101.64
}
],
"statistics": {
"start_date": "2026-05-12",
"end_date": "2026-06-10",
"start_price": 4260,
"end_price": 4175,
"change": -85,
"change_percent": -2,
"min_price": 3911.5,
"max_price": 4650,
"return_1m": -2,
"return_3m": null,
"return_1y": null,
"return_ytd": null
},
"meta": {
"plan": "hobby",
"calls_used": 143,
"calls_remaining": 9857,
"reset_at": "2026-07-15T23:57:00.000Z"
}
}This endpoint returns a time series of daily closing prices for a specific NGX ETF or ETP. Use
period for a named lookback window (7d, 30d, 90d, 1y, 5y, all) or supply from and to for a custom date range.
In detailed format each row includes OHLCV data alongside a normalized field that rebases the price to 100 at the start of the requested period, useful for comparing two ETFs on the same scale. The chart format returns compact [date, price] pairs suited for line charting libraries.
The statistics block includes return_1m, return_3m, return_1y, and return_ytd, percentage returns versus fixed historical reference points, computed independently of the period you requested.
This endpoint requires a Starter plan or higher. Depth also depends on plan: Starter gets 5 years, and Pro, Business, and Enterprise get the full record. Ask for more than your plan allows and the response quietly starts from the earliest date it can, rather than returning an error.
For example, to fetch one year of STANBICETF30 daily closes in chart-ready format:
curl "https://api.ngnmarket.com/v1/etfs/STANBICETF30/chart?period=1y&format=chart" \
-H "Authorization: Bearer ngm_live_YOUR_KEY"
const url = new URL('https://api.ngnmarket.com/v1/etfs/STANBICETF30/chart');
url.searchParams.set('period', '1y');
url.searchParams.set('format', 'chart');
const res = await fetch(url, {
headers: { Authorization: 'Bearer ngm_live_YOUR_KEY' },
});
const { data } = await res.json();
import requests
res = requests.get(
'https://api.ngnmarket.com/v1/etfs/STANBICETF30/chart',
params={'period': '1y', 'format': 'chart'},
headers={'Authorization': 'Bearer ngm_live_YOUR_KEY'},
)
data = res.json()['data']
Authorizations
Pass your API key as a Bearer token: Authorization: Bearer ngm_live_YOUR_KEY.
Generate keys at ngnmarket.com/dashboard/developer.
Path Parameters
ETF ticker symbol (e.g. STANBICETF30). Case-insensitive.
Example:
"STANBICETF30"
Query Parameters
Available options:
7d, 30d, 90d, 1y, 5y, all Start date YYYY-MM-DD (inclusive). Takes priority over period.
Example:
"2026-01-01"
End date YYYY-MM-DD (inclusive).
Example:
"2026-06-10"
detailed returns OHLCV objects; chart returns compact [date, price] pairs.
Available options:
detailed, chart