curl -H "X-FH-APIKEY: $FINHAY_API_KEY" \
"https://open-api.fhsc.com.vn/market/indices/VNINDEX/trading/foreign"import requests
url = "https://open-api.fhsc.com.vn/market/indices/{symbol}/trading/foreign"
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/indices/{symbol}/trading/foreign', 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/indices/{symbol}/trading/foreign",
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/indices/{symbol}/trading/foreign"
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/indices/{symbol}/trading/foreign")
.header("X-FH-APIKEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://open-api.fhsc.com.vn/market/indices/{symbol}/trading/foreign")
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": {
"index": "VNINDEX",
"buy": {
"total": {
"volume": 12543200,
"value": 341175200000
},
"matched": {
"volume": 12543200,
"value": 341175200000
},
"put_through": {
"volume": 12543200,
"value": 341175200000
}
},
"sell": {
"total": {
"volume": 12543200,
"value": 341175200000
},
"matched": {
"volume": 12543200,
"value": 341175200000
},
"put_through": {
"volume": 12543200,
"value": 341175200000
}
},
"net": {
"total": {
"volume": 12543200,
"value": 341175200000
},
"matched": {
"volume": 12543200,
"value": 341175200000
},
"put_through": {
"volume": 12543200,
"value": 341175200000
}
},
"date": "2026-08-17",
"constituent_count": 218,
"updated_at": "2026-08-17T14: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"
}Khối ngoại theo chỉ số (phiên gần nhất)
Tổng mua / bán / ròng của khối ngoại trên toàn universe của một chỉ số trong phiên gần nhất có dữ liệu — VNINDEX ≈ toàn sàn HOSE, VN30 chỉ gồm 30 mã trong rổ.
Trả lời “khối ngoại mua ròng BAO NHIÊU trên sàn”. Muốn biết MÃ NÀO thì dùng screener GET /market/stocks với index/exchange + sort=-foreign_net_value.
curl -H "X-FH-APIKEY: $FINHAY_API_KEY" \
"https://open-api.fhsc.com.vn/market/indices/VNINDEX/trading/foreign"import requests
url = "https://open-api.fhsc.com.vn/market/indices/{symbol}/trading/foreign"
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/indices/{symbol}/trading/foreign', 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/indices/{symbol}/trading/foreign",
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/indices/{symbol}/trading/foreign"
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/indices/{symbol}/trading/foreign")
.header("X-FH-APIKEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://open-api.fhsc.com.vn/market/indices/{symbol}/trading/foreign")
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": {
"index": "VNINDEX",
"buy": {
"total": {
"volume": 12543200,
"value": 341175200000
},
"matched": {
"volume": 12543200,
"value": 341175200000
},
"put_through": {
"volume": 12543200,
"value": 341175200000
}
},
"sell": {
"total": {
"volume": 12543200,
"value": 341175200000
},
"matched": {
"volume": 12543200,
"value": 341175200000
},
"put_through": {
"volume": 12543200,
"value": 341175200000
}
},
"net": {
"total": {
"volume": 12543200,
"value": 341175200000
},
"matched": {
"volume": 12543200,
"value": 341175200000
},
"put_through": {
"volume": 12543200,
"value": 341175200000
}
},
"date": "2026-08-17",
"constituent_count": 218,
"updated_at": "2026-08-17T14: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ã chỉ số. Chỉ các chỉ số có membership tra được mới dùng được ở nhóm endpoint này; chỉ số quốc tế không được hỗ trợ.
VNINDEX, HNXINDEX, UPCOMINDEX, VN30, HNX30 "VNINDEX"
Response
data là dòng tiền khối ngoại cộng dồn của chỉ số trong phiên.
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.