curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/macro/trade/by-region \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/macro/trade/by-region"
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/trade/by-region', 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/trade/by-region",
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/trade/by-region"
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/trade/by-region")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/macro/trade/by-region")
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": "jp",
"unit": "JPY",
"unitScale": 1000,
"displayDivisor": 1000000,
"displayUnit": "Billion Yen",
"seasonallyAdjusted": false,
"source": "Ministry of Finance Japan",
"taxonomy": "continent",
"asOfPeriod": "2026-08",
"period": "2026-Q2",
"granularity": "quarter",
"flow": "export",
"isPartial": false,
"total": 25321000000,
"items": [
{
"code": "asia",
"name": "Asia",
"value": 14990000000,
"share": 0.592,
"classification": "RAW"
},
{
"code": "north_america",
"name": "North America",
"value": 5621000000,
"share": 0.222,
"classification": "RAW"
}
],
"reconciliation": {
"sumOfItems": 25321000000,
"total": 25321000000,
"diff": 0
}
},
"meta": {
"timestamp": "2026-10-16T04:00:00.000Z",
"source": "Ministry of Finance Japan",
"as_of": "2026-Q2"
}
}{
"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"
}
}Export/import by region
Exports or imports of one country split by region for one period. There is always an item for the
part not attributed to any region, so the items add up to total. Each item has a classification:
RAW is published by the source, DERIVED is computed. Pick the period with granularity (latest
month / quarter / year) or name it with period; period wins when both are given.
Returns 404 when no data has been collected for the country yet.
curl --request GET \
--url https://api-v2.hayinsights.com/openapi/v1/macro/trade/by-region \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-v2.hayinsights.com/openapi/v1/macro/trade/by-region"
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/trade/by-region', 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/trade/by-region",
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/trade/by-region"
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/trade/by-region")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-v2.hayinsights.com/openapi/v1/macro/trade/by-region")
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": "jp",
"unit": "JPY",
"unitScale": 1000,
"displayDivisor": 1000000,
"displayUnit": "Billion Yen",
"seasonallyAdjusted": false,
"source": "Ministry of Finance Japan",
"taxonomy": "continent",
"asOfPeriod": "2026-08",
"period": "2026-Q2",
"granularity": "quarter",
"flow": "export",
"isPartial": false,
"total": 25321000000,
"items": [
{
"code": "asia",
"name": "Asia",
"value": 14990000000,
"share": 0.592,
"classification": "RAW"
},
{
"code": "north_america",
"name": "North America",
"value": 5621000000,
"share": 0.222,
"classification": "RAW"
}
],
"reconciliation": {
"sumOfItems": 25321000000,
"total": 25321000000,
"diff": 0
}
},
"meta": {
"timestamp": "2026-10-16T04:00:00.000Z",
"source": "Ministry of Finance Japan",
"as_of": "2026-Q2"
}
}{
"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.
Query Parameters
Country.
jp, vn, us "jp"
Trade flow.
export, import Use the latest period of this granularity.
month, quarter, year, fiscal_year Exact period: 2026-06, 2026-Q2, 2026 or 2026-FY.
^\d{4}(-(0[1-9]|1[0-2])|-Q[1-4]|-FY)?$"2026-Q2"
Region grouping. Defaults to continents for Japan and Vietnam and Census regions for the US.
source, continent Backtest: return exactly what the system knew at the end of that day (UTC), not later revisions by the source. Omit for the latest data.
"2026-09-01"
Response
Trade split by region.
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
Show child attributes
Show child attributes
Response metadata. Always present; timestamp is the server time the response was generated.
Show child attributes
Show child attributes