curl -H "X-FH-APIKEY: $FINHAY_API_KEY" \
"https://open-api.fhsc.com.vn/market/stocks/VNM/analyst-reports?recommendation=BUY"
import requests
url = "https://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports"
headers = {"X-FH-APIKEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-FH-APIKEY': '<api-key>'}};
fetch('https://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports', 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://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports",
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-FH-APIKEY: <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://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-FH-APIKEY", "<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://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports")
.header("X-FH-APIKEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-FH-APIKEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"symbol": "VNM",
"data": [
{
"id": "rp_9f2c1ab34de5f607",
"title": "VNM — Cập nhật KQKD Q1/2026",
"source": "SSI Research",
"published_date": "2026-04-18",
"recommendation": "BUY",
"target_price": 85000,
"report_type": "Báo cáo phân tích doanh nghiệp",
"file_url": "https://example.com/reports/vnm-q1-2026.pdf"
}
],
"total": 37,
"page": 1,
"page_size": 20,
"updated_at": "2026-05-27T14:30:15+07:00"
},
"error_code": "0",
"message": "success"
}{
"error_code": "400",
"message": "Invalid parameter"
}{
"error_code": "401",
"message": "Invalid signature"
}{
"error_code": "404",
"message": "Not found"
}{
"error_code": "429",
"message": "Too many requests"
}{
"error_code": "500",
"message": "Internal server error"
}Báo cáo phân tích của stock
Báo cáo phân tích / khuyến nghị của các công ty chứng khoán cho 1 mã: tiêu đề, nguồn phát hành, khuyến nghị, giá mục tiêu, ngày phát hành và link tải bản gốc.
Lọc theo source (công ty chứng khoán), recommendation, và khoảng ngày phát hành from/to (YYYY-MM-DD, bỏ trống → 1 năm gần nhất). Phân trang qua page/page_size (tối đa 50).
curl -H "X-FH-APIKEY: $FINHAY_API_KEY" \
"https://open-api.fhsc.com.vn/market/stocks/VNM/analyst-reports?recommendation=BUY"
import requests
url = "https://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports"
headers = {"X-FH-APIKEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-FH-APIKEY': '<api-key>'}};
fetch('https://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports', 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://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports",
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-FH-APIKEY: <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://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-FH-APIKEY", "<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://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports")
.header("X-FH-APIKEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://open-api.fhsc.com.vn/market/stocks/{symbol}/analyst-reports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-FH-APIKEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"symbol": "VNM",
"data": [
{
"id": "rp_9f2c1ab34de5f607",
"title": "VNM — Cập nhật KQKD Q1/2026",
"source": "SSI Research",
"published_date": "2026-04-18",
"recommendation": "BUY",
"target_price": 85000,
"report_type": "Báo cáo phân tích doanh nghiệp",
"file_url": "https://example.com/reports/vnm-q1-2026.pdf"
}
],
"total": 37,
"page": 1,
"page_size": 20,
"updated_at": "2026-05-27T14:30:15+07:00"
},
"error_code": "0",
"message": "success"
}{
"error_code": "400",
"message": "Invalid parameter"
}{
"error_code": "401",
"message": "Invalid signature"
}{
"error_code": "404",
"message": "Not found"
}{
"error_code": "429",
"message": "Too many requests"
}{
"error_code": "500",
"message": "Internal server error"
}Authorizations
API key dài hạn của client. Cấu hình 1 lần lúc khởi tạo; có thể wire thẳng
vào static setter của SDK tự-gen. Đi kèm với FINHAY_API_SECRET — secret
này chỉ dùng ở phía client để tính X-FH-SIGNATURE, không bao giờ
gửi qua mạng.
Path Parameters
Mã cổ phiếu niêm yết (3–10 ký tự chữ/số, không phân biệt hoa thường). VD: VNM, FPT.
"VNM"
Query Parameters
Ngày phát hành bắt đầu (bao gồm), dạng YYYY-MM-DD. Bỏ trống → to trừ 1 năm.
"2026-01-01"
Ngày phát hành kết thúc (bao gồm), dạng YYYY-MM-DD. Bỏ trống → hôm nay.
"2026-03-31"
Lọc theo công ty chứng khoán phát hành. Bỏ trống → mọi nguồn.
255"SSI Research"
Lọc theo khuyến nghị. Bỏ trống → mọi khuyến nghị. Khuyến nghị đã chuẩn hoá.
BUY, SELL, NEUTRAL, OTHER "BUY"
Trang cần lấy, bắt đầu từ 1. Mặc định 1.
x >= 11
Số bản ghi mỗi trang, tối đa 50. Mặc định 20.
1 <= x <= 5020
Response
data.data là danh sách báo cáo phân tích của trang hiện tại.
Các field chung của envelope trong mọi response của Finhay API.
error_codelà"0"(string) khi thành công, mã khác"0"khi lỗi.messagelà thông điệp ngắn từ server.