curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail', 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-v2.hayinsights.com/openapi/v1/etf/{code}/detail",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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-v2.hayinsights.com/openapi/v1/etf/{code}/detail"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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-v2.hayinsights.com/openapi/v1/etf/{code}/detail")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"statusCode": 200,
"data": {
"etfCode": "1306",
"etfName": "NEXT FUNDS TOPIX Exchange Traded Fund",
"managementCompany": "Nomura Asset Management",
"MER": 0.0505,
"etfType": "Japanese Equity(Market)",
"indexName": "TOPIX Total Return Index",
"listingDate": "2001-07-13",
"currentPrice": 425.5,
"change": 2.4,
"changePct": 0.57,
"lastUpdateDate": "2026-06-17",
"totalAssetValue": 32511066650608.5,
"AssetAllocation": [
{
"name": "TOYOTA MOTOR CORP",
"value": 1074907641000
},
{
"name": "MITSUBISHI UFJ FIN",
"value": 1063805290650
}
],
"equityHoldings": {
"PE": "0.0600",
"PB": "0.6400",
"PS": "0.8400",
"PC": "0.0900"
},
"sectorWeight": [
{
"sector": null,
"weight": 0.2803,
"month": 4,
"year": 2026
}
],
"distributionYield": 0.0176,
"netflow": {
"data": [
{
"date": "2025-10-17",
"aum": 26913496133220,
"netflow": -26107300968,
"netflowAumPct": -0.097
}
],
"periodAvailability": {
"1M": true,
"3M": true,
"6M": true
}
},
"performance": {
"periodAvailability": {
"1M": true,
"3M": true,
"6M": true,
"1Y": true,
"3Y": true
},
"periods": {
"1M": [
{
"date": "15-05-2026",
"nav": 409.9,
"cumulativeReturn": 0
},
{
"date": "18-05-2026",
"nav": 405.9,
"cumulativeReturn": -0.98
}
]
}
}
},
"meta": {
"timestamp": "2026-06-19T08:50:39.000Z"
}
}{
"success": false,
"statusCode": 400,
"error": {
"code": "INTERNAL_ERROR",
"message": [
"Invalid type parameter. Must be \"gdp\", \"cpi\", \"pce\", or \"import-export\"",
"Type parameter is required"
]
},
"meta": {
"error": "Bad Request",
"statusCode": 400,
"timestamp": "2026-06-19T08:34:08.081Z"
}
}{
"success": false,
"statusCode": 401,
"error": {
"code": "API_KEY_INVALID",
"message": "Invalid API key"
},
"meta": {
"timestamp": "2026-06-19T08:34:08.023Z"
}
}{
"success": false,
"statusCode": 403,
"error": {
"code": "FEATURE_NOT_IN_PLAN",
"message": "Your plan does not include this feature"
},
"meta": {
"timestamp": "2026-06-19T08:34:08.100Z"
}
}{
"success": false,
"statusCode": 404,
"error": {
"code": "INTERNAL_ERROR",
"message": "Commodity 'zzz-nope' not found"
},
"meta": {
"error": "Not Found",
"statusCode": 404,
"timestamp": "2026-06-19T08:34:08.205Z"
}
}{
"success": false,
"statusCode": 429,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded"
},
"meta": {
"timestamp": "2026-06-19T08:34:09.000Z"
}
}{
"success": false,
"statusCode": 500,
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error"
},
"meta": {
"timestamp": "2026-06-19T08:34:10.000Z"
}
}ETF detail
Full detail view for a single ETF — descriptive metadata, latest price, top
holdings, valuation ratios, sector weights, net-flow history and
cumulative-return performance by period. Use the exchange ticker (e.g. a TSE
code like 1306) as the {code} path param.
curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail', 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-v2.hayinsights.com/openapi/v1/etf/{code}/detail",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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-v2.hayinsights.com/openapi/v1/etf/{code}/detail"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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-v2.hayinsights.com/openapi/v1/etf/{code}/detail")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/etf/{code}/detail")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"statusCode": 200,
"data": {
"etfCode": "1306",
"etfName": "NEXT FUNDS TOPIX Exchange Traded Fund",
"managementCompany": "Nomura Asset Management",
"MER": 0.0505,
"etfType": "Japanese Equity(Market)",
"indexName": "TOPIX Total Return Index",
"listingDate": "2001-07-13",
"currentPrice": 425.5,
"change": 2.4,
"changePct": 0.57,
"lastUpdateDate": "2026-06-17",
"totalAssetValue": 32511066650608.5,
"AssetAllocation": [
{
"name": "TOYOTA MOTOR CORP",
"value": 1074907641000
},
{
"name": "MITSUBISHI UFJ FIN",
"value": 1063805290650
}
],
"equityHoldings": {
"PE": "0.0600",
"PB": "0.6400",
"PS": "0.8400",
"PC": "0.0900"
},
"sectorWeight": [
{
"sector": null,
"weight": 0.2803,
"month": 4,
"year": 2026
}
],
"distributionYield": 0.0176,
"netflow": {
"data": [
{
"date": "2025-10-17",
"aum": 26913496133220,
"netflow": -26107300968,
"netflowAumPct": -0.097
}
],
"periodAvailability": {
"1M": true,
"3M": true,
"6M": true
}
},
"performance": {
"periodAvailability": {
"1M": true,
"3M": true,
"6M": true,
"1Y": true,
"3Y": true
},
"periods": {
"1M": [
{
"date": "15-05-2026",
"nav": 409.9,
"cumulativeReturn": 0
},
{
"date": "18-05-2026",
"nav": 405.9,
"cumulativeReturn": -0.98
}
]
}
}
},
"meta": {
"timestamp": "2026-06-19T08:50:39.000Z"
}
}{
"success": false,
"statusCode": 400,
"error": {
"code": "INTERNAL_ERROR",
"message": [
"Invalid type parameter. Must be \"gdp\", \"cpi\", \"pce\", or \"import-export\"",
"Type parameter is required"
]
},
"meta": {
"error": "Bad Request",
"statusCode": 400,
"timestamp": "2026-06-19T08:34:08.081Z"
}
}{
"success": false,
"statusCode": 401,
"error": {
"code": "API_KEY_INVALID",
"message": "Invalid API key"
},
"meta": {
"timestamp": "2026-06-19T08:34:08.023Z"
}
}{
"success": false,
"statusCode": 403,
"error": {
"code": "FEATURE_NOT_IN_PLAN",
"message": "Your plan does not include this feature"
},
"meta": {
"timestamp": "2026-06-19T08:34:08.100Z"
}
}{
"success": false,
"statusCode": 404,
"error": {
"code": "INTERNAL_ERROR",
"message": "Commodity 'zzz-nope' not found"
},
"meta": {
"error": "Not Found",
"statusCode": 404,
"timestamp": "2026-06-19T08:34:08.205Z"
}
}{
"success": false,
"statusCode": 429,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded"
},
"meta": {
"timestamp": "2026-06-19T08:34:09.000Z"
}
}{
"success": false,
"statusCode": 500,
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error"
},
"meta": {
"timestamp": "2026-06-19T08:34:10.000Z"
}
}Authorizations
Your HayInsights API key (prefixed apk_). Create and manage keys in the
HayInsights dashboard (Account → API keys).
Send it in the X-API-Key header on every request to /openapi/v1/*.
Which data domains you may access and your request quota are both governed by
the subscription plan attached to the key — see the Plans & features and
Rate limits guides.
Path Parameters
Response
Full detail view for the ETF.
Standard success envelope shared by every endpoint. Each operation's response
wrapper extends this (via allOf) and adds a typed data property.