curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/market/vn/equities/{code}/financial-statements \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/market/vn/equities/{code}/financial-statements"
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/market/vn/equities/{code}/financial-statements', 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/market/vn/equities/{code}/financial-statements",
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/market/vn/equities/{code}/financial-statements"
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/market/vn/equities/{code}/financial-statements")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/market/vn/equities/{code}/financial-statements")
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": {
"statement": "income-statement",
"currency": "VND",
"template": "corporate",
"latestQuarter": "Q2 2026",
"columns": [
{
"key": "ttm",
"label": "TTM",
"periodType": "ttm",
"periodEnd": "2026-06-30"
},
{
"key": "2025-12-31",
"label": "2025",
"periodType": "annual",
"periodEnd": "2025-12-31"
}
],
"rows": [
{
"key": "NetRevenue",
"label": "Net Revenue",
"unit": "VND",
"values": {
"ttm": 68512000000000,
"2025-12-31": 62850000000000
},
"children": []
}
],
"dataAsOf": "2026-06-30",
"lastUpdatedAt": "2026-10-01T14:00:12.000Z"
},
"meta": {
"source": [
"vnsc:/v2/financial-statement/statement"
],
"as_of": "2026-06-30",
"unit": "VND",
"classification": "RAW+COMPUTED",
"formula_version": "vnsc-statement-catalog-v1, vn-fins-ttm-v1",
"was_restated": false,
"served_from_cache": true,
"cache_expires_at": "2026-10-02T08:00:00.000Z",
"timestamp": "2026-10-01T08:00:00.000Z"
}
}{
"success": false,
"statusCode": 401,
"error": {
"code": "API_KEY_INVALID",
"message": "Invalid API key"
},
"meta": {
"timestamp": "2026-06-19T08:31:59.478Z"
}
}{
"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": "EQUITY_NOT_FOUND",
"message": "Không tìm thấy mã cổ phiếu XYZ"
},
"meta": {
"error": "Not Found",
"statusCode": 404,
"timestamp": "2026-10-01T08:00:00.000Z"
}
}{
"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"
}
}Vietnam equity financial statements
Income statement (TTM + 3 fiscal years) or balance sheet (4 fiscal years, no
TTM) of one Vietnamese stock, as line items arranged in a tree. Same route as
the Japan endpoint with market = vn.
All rows share columns; read a figure with row.values[column.key]. Column
labels are fiscal years (TTM, 2025, 2024, 2023). TTM is computed for the
income statement only.
On top of the Japan shape, the Vietnam response carries:
template— which line-item layout applies:bank,corporate,securitiesorinsurance.latestQuarter— the newest quarter included in TTM (e.g.Q2 2026), ornull.
columns and rows are empty while the statement has not been collected yet.
curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/market/vn/equities/{code}/financial-statements \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/market/vn/equities/{code}/financial-statements"
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/market/vn/equities/{code}/financial-statements', 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/market/vn/equities/{code}/financial-statements",
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/market/vn/equities/{code}/financial-statements"
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/market/vn/equities/{code}/financial-statements")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/market/vn/equities/{code}/financial-statements")
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": {
"statement": "income-statement",
"currency": "VND",
"template": "corporate",
"latestQuarter": "Q2 2026",
"columns": [
{
"key": "ttm",
"label": "TTM",
"periodType": "ttm",
"periodEnd": "2026-06-30"
},
{
"key": "2025-12-31",
"label": "2025",
"periodType": "annual",
"periodEnd": "2025-12-31"
}
],
"rows": [
{
"key": "NetRevenue",
"label": "Net Revenue",
"unit": "VND",
"values": {
"ttm": 68512000000000,
"2025-12-31": 62850000000000
},
"children": []
}
],
"dataAsOf": "2026-06-30",
"lastUpdatedAt": "2026-10-01T14:00:12.000Z"
},
"meta": {
"source": [
"vnsc:/v2/financial-statement/statement"
],
"as_of": "2026-06-30",
"unit": "VND",
"classification": "RAW+COMPUTED",
"formula_version": "vnsc-statement-catalog-v1, vn-fins-ttm-v1",
"was_restated": false,
"served_from_cache": true,
"cache_expires_at": "2026-10-02T08:00:00.000Z",
"timestamp": "2026-10-01T08:00:00.000Z"
}
}{
"success": false,
"statusCode": 401,
"error": {
"code": "API_KEY_INVALID",
"message": "Invalid API key"
},
"meta": {
"timestamp": "2026-06-19T08:31:59.478Z"
}
}{
"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": "EQUITY_NOT_FOUND",
"message": "Không tìm thấy mã cổ phiếu XYZ"
},
"meta": {
"error": "Not Found",
"statusCode": 404,
"timestamp": "2026-10-01T08:00:00.000Z"
}
}{
"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
Stock code — the 3-character ticker (FPT, VCB, A32). Case-insensitive.
^[A-Za-z0-9]{3}$"FPT"
Query Parameters
Which statement to return.
income-statement, balance-sheet Response
The requested financial statement.
Standard success envelope shared by every endpoint. Each operation's response
wrapper extends this (via allOf) and adds a typed data property.
Always true for a successful response.
true
Mirrors the HTTP status code.
200
Financial statement as a table: columns are periods, rows are a tree of line
items. The income statement has TTM + 3 fiscal years; the balance sheet has 4
fiscal years (no TTM). columns and rows are empty while the statement has not
been collected yet.
Show child attributes
Show child attributes
Response metadata for the Equities domain. On top of timestamp, every equities
response says where the numbers came from and how fresh they are.
Show child attributes
Show child attributes