curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/macro/pmi/vn/manufacturing \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/macro/pmi/vn/manufacturing"
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/macro/pmi/vn/manufacturing', 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/macro/pmi/vn/manufacturing",
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/macro/pmi/vn/manufacturing"
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/macro/pmi/vn/manufacturing")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/macro/pmi/vn/manufacturing")
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": {
"country": "vn",
"seriesCode": "manufacturing_pmi",
"threshold": 50,
"period": "3M",
"from": "2026-07",
"to": "2026-09",
"latest": {
"month": "2026-09",
"value": 51.9,
"previousMonth": "2026-08",
"previousValue": 53.3,
"change": -1.4,
"status": "expansion",
"streak": {
"months": 15,
"since": "2025-07",
"isLowerBound": false
},
"releasedAt": "2026-10-01T00:30:00.000Z"
},
"points": [
{
"month": "2026-07",
"value": 52.9,
"change": 1.1,
"status": "expansion"
},
{
"month": "2026-08",
"value": 53.3,
"change": 0.4,
"status": "expansion"
},
{
"month": "2026-09",
"value": 51.9,
"change": -1.4,
"status": "expansion"
}
],
"source": "S&P Global",
"unit": "index_points",
"wasRestated": false
},
"meta": {
"source": "S&P Global",
"series": "S&P Global Vietnam Manufacturing PMI — headline, seasonally adjusted",
"as_of": "2026-09",
"released_at": "2026-10-01T00:30:00.000Z",
"unit": "index_points",
"classification": {
"value": "RAW",
"change": "COMPUTED",
"status": "COMPUTED",
"streak": "COMPUTED"
},
"formula_version": "pmi-summary-v1",
"was_restated": false,
"served_from_cache": true,
"cache_expires_at": "2026-10-17T01:12:40.000Z",
"timestamp": "2026-10-16T03:00:00.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": 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 Manufacturing PMI (S&P Global)
Monthly S&P Global Vietnam Manufacturing PMI — the headline, seasonally adjusted index, in index points. 50 means no change from the previous month; above 50 is expansion, below 50 contraction.
points has one entry per month in the window, oldest first; a month without a
reading stays in the list with value: null — never 0. latest summarises the
newest reading: the change from the previous month in points, the status against
50, and how many consecutive months it has held that status.
S&P Global publishes each month’s reading on the first working day of the
following month. Pass asOf to get the series as it was known at the end of a
past day (point-in-time, for backtests).
Source: S&P Global.
curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/macro/pmi/vn/manufacturing \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/macro/pmi/vn/manufacturing"
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/macro/pmi/vn/manufacturing', 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/macro/pmi/vn/manufacturing",
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/macro/pmi/vn/manufacturing"
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/macro/pmi/vn/manufacturing")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/macro/pmi/vn/manufacturing")
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": {
"country": "vn",
"seriesCode": "manufacturing_pmi",
"threshold": 50,
"period": "3M",
"from": "2026-07",
"to": "2026-09",
"latest": {
"month": "2026-09",
"value": 51.9,
"previousMonth": "2026-08",
"previousValue": 53.3,
"change": -1.4,
"status": "expansion",
"streak": {
"months": 15,
"since": "2025-07",
"isLowerBound": false
},
"releasedAt": "2026-10-01T00:30:00.000Z"
},
"points": [
{
"month": "2026-07",
"value": 52.9,
"change": 1.1,
"status": "expansion"
},
{
"month": "2026-08",
"value": 53.3,
"change": 0.4,
"status": "expansion"
},
{
"month": "2026-09",
"value": 51.9,
"change": -1.4,
"status": "expansion"
}
],
"source": "S&P Global",
"unit": "index_points",
"wasRestated": false
},
"meta": {
"source": "S&P Global",
"series": "S&P Global Vietnam Manufacturing PMI — headline, seasonally adjusted",
"as_of": "2026-09",
"released_at": "2026-10-01T00:30:00.000Z",
"unit": "index_points",
"classification": {
"value": "RAW",
"change": "COMPUTED",
"status": "COMPUTED",
"streak": "COMPUTED"
},
"formula_version": "pmi-summary-v1",
"was_restated": false,
"served_from_cache": true,
"cache_expires_at": "2026-10-17T01:12:40.000Z",
"timestamp": "2026-10-16T03:00:00.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": 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.
Query Parameters
Window length, counted back from the latest month that has a reading (that month included). Case-insensitive.
| Value | Months |
|---|---|
3M | 3 |
6M | 6 |
1Y | 12 |
3Y | 36 |
3M, 6M, 1Y, 3Y "3M"
Point-in-time date (YYYY-MM-DD): return only what was known by the end of
that day (UTC), leaving out readings and revisions published later. Omit for
the latest data.
"2026-10-01"
Response
Monthly PMI series for the requested window.
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
S&P Global Vietnam Manufacturing PMI over the requested window, with a summary of
the latest reading. When nothing is on record (for example an asOf before the
first reading), from, to and latest are null and points is empty.
Show child attributes
Show child attributes
Response metadata for the PMI series. On top of timestamp, it says where the
numbers came from, which fields HayInsights computes, and how fresh the response is.
Show child attributes
Show child attributes