curl --request GET \
--url https://api.worldmonitor.app/api/economic/v1/get-capital-flows \
--header 'X-WorldMonitor-Key: <api-key>'import requests
url = "https://api.worldmonitor.app/api/economic/v1/get-capital-flows"
headers = {"X-WorldMonitor-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-WorldMonitor-Key': '<api-key>'}};
fetch('https://api.worldmonitor.app/api/economic/v1/get-capital-flows', 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.worldmonitor.app/api/economic/v1/get-capital-flows",
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-WorldMonitor-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.worldmonitor.app/api/economic/v1/get-capital-flows"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-WorldMonitor-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.worldmonitor.app/api/economic/v1/get-capital-flows")
.header("X-WorldMonitor-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.worldmonitor.app/api/economic/v1/get-capital-flows")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-WorldMonitor-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"countries": [
{
"bank": {
"householdDepositsAbroad": {
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
},
"latestPeriod": "2026-Q1",
"nonBankBorrowingFromAbroad": {
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
},
"nonBankDepositsAbroad": {
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
},
"publishesBilateral": true
},
"bop": {
"episodes": {
"flight": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
],
"retrenchment": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
],
"stop": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
],
"surge": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
]
},
"frequency": "example",
"latestPeriod": "2026-Q1",
"series": [
{
"errorsOmissions": 1.5,
"inflows": {
"fdi": 1.5,
"other": 1.5,
"portfolio": 1.5,
"total": 1
},
"outflows": {
"fdi": 1.5,
"other": 1.5,
"portfolio": 1.5,
"total": 1
},
"period": "2026-Q1"
}
],
"state": {
"inflow": "example",
"inflowZ": 1.5,
"outflow": "example",
"outflowZ": 1.5
}
},
"country": "US",
"fdi": {
"inwardUsdBn": 1.5,
"outwardUsdBn": 1.5,
"topDestinations": [
{
"country": "US",
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
}
],
"topInvestors": [
{
"country": "US",
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
}
],
"year": 1
},
"gdpUsdBn": 1.5
}
],
"latest": {
"bisQuarter": "2026-Q1",
"bopQuarter": "2026-Q1",
"bopYear": "example",
"fdiYear": 1,
"pipYear": 1
},
"method": {
"exampleKey": "example"
},
"pair": {
"aBorrowingFromB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"aDepositsInB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"aFdiInB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"aHoldingsOfB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"bBorrowingFromA": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
}
},
"seededAt": 1717200000000
}{
"violations": [
{
"field": "<string>",
"description": "<string>"
}
]
}{
"error": "<string>"
}{
"error": "<string>",
"code": "subscription_lapsed",
"requiredTier": 123,
"currentTier": 123,
"planKey": "<string>"
}{
"message": "<string>"
}{
"error": "<string>",
"code": "renewal_verification_pending",
"requiredTier": 123
}{
"message": "<string>"
}GetCapitalFlows
GetCapitalFlows returns where money enters and leaves about 230 economies, and between any two, from official statistics. Per country: IMF balance-of-payments gross inflows and outflows by FDI, portfolio and other investment (quarterly where reported, annual otherwise) with derived Forbes and Warnock surge, stop, flight and retrenchment states; BIS cross-border deposits and borrowing of non-bank residents; IMF portfolio holdings of the country’s securities; and IMF direct-investment positions. With country and counterpart: both directions of the pair across bank deposits and lending (with eight quarters of adjusted flows), portfolio holdings and direct investment (with both sides’ figures), each leg marked reported, not_itemized or not_published. A person changing residence is not a balance-of-payments flow, so wealth migration does not appear.
curl --request GET \
--url https://api.worldmonitor.app/api/economic/v1/get-capital-flows \
--header 'X-WorldMonitor-Key: <api-key>'import requests
url = "https://api.worldmonitor.app/api/economic/v1/get-capital-flows"
headers = {"X-WorldMonitor-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-WorldMonitor-Key': '<api-key>'}};
fetch('https://api.worldmonitor.app/api/economic/v1/get-capital-flows', 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.worldmonitor.app/api/economic/v1/get-capital-flows",
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-WorldMonitor-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.worldmonitor.app/api/economic/v1/get-capital-flows"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-WorldMonitor-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.worldmonitor.app/api/economic/v1/get-capital-flows")
.header("X-WorldMonitor-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.worldmonitor.app/api/economic/v1/get-capital-flows")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-WorldMonitor-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"countries": [
{
"bank": {
"householdDepositsAbroad": {
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
},
"latestPeriod": "2026-Q1",
"nonBankBorrowingFromAbroad": {
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
},
"nonBankDepositsAbroad": {
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
},
"publishesBilateral": true
},
"bop": {
"episodes": {
"flight": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
],
"retrenchment": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
],
"stop": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
],
"surge": [
{
"end": "2026-Q1",
"peakPeriod": "2026-Q1",
"peakZ": 1.5,
"quarters": 1,
"start": "2026-Q1"
}
]
},
"frequency": "example",
"latestPeriod": "2026-Q1",
"series": [
{
"errorsOmissions": 1.5,
"inflows": {
"fdi": 1.5,
"other": 1.5,
"portfolio": 1.5,
"total": 1
},
"outflows": {
"fdi": 1.5,
"other": 1.5,
"portfolio": 1.5,
"total": 1
},
"period": "2026-Q1"
}
],
"state": {
"inflow": "example",
"inflowZ": 1.5,
"outflow": "example",
"outflowZ": 1.5
}
},
"country": "US",
"fdi": {
"inwardUsdBn": 1.5,
"outwardUsdBn": 1.5,
"topDestinations": [
{
"country": "US",
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
}
],
"topInvestors": [
{
"country": "US",
"flow4qUsdBn": 1.5,
"stockUsdBn": 1.5
}
],
"year": 1
},
"gdpUsdBn": 1.5
}
],
"latest": {
"bisQuarter": "2026-Q1",
"bopQuarter": "2026-Q1",
"bopYear": "example",
"fdiYear": 1,
"pipYear": 1
},
"method": {
"exampleKey": "example"
},
"pair": {
"aBorrowingFromB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"aDepositsInB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"aFdiInB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"aHoldingsOfB": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
},
"bBorrowingFromA": {
"basis": "example",
"counterpartReportUsdBn": 1,
"flow4qUsdBn": 1.5,
"history": [
{
"period": "2026-Q1",
"usdBn": 1.5
}
],
"instrument": "example"
}
},
"seededAt": 1717200000000
}{
"violations": [
{
"field": "<string>",
"description": "<string>"
}
]
}{
"error": "<string>"
}{
"error": "<string>",
"code": "subscription_lapsed",
"requiredTier": 123,
"currentTier": 123,
"planKey": "<string>"
}{
"message": "<string>"
}{
"error": "<string>",
"code": "renewal_verification_pending",
"requiredTier": 123
}{
"message": "<string>"
}Authorizations
User-issued WorldMonitor API key.
Query Parameters
Optional ISO 3166-1 alpha-2 filter. When set, only that country is returned (and the counterpart, if given).
When true, include each returned country's period-by-period BOP series. Defaults to false.
Optional ISO 3166-1 alpha-2 partner. With country, the response adds pair (both directions) and the counterpart's own view. Ignored without country, and when equal to country.
Optional JMESPath expression applied server-side to project or reduce the JSON response before it is returned (mirrors the MCP jmespath argument). Invalid expressions, expressions larger than 1024 UTF-8 bytes, or projections that exceed the 256 KB output cap return HTTP 400 with a {_jmespath_error, original_keys} envelope. Grammar and worked examples: https://www.worldmonitor.app/docs/mcp-jmespath.
Response
Successful response
GetCapitalFlowsResponse is cross-country capital-flow data from IMF and BIS official statistics. Amounts are USD billions.
Show child attributes
Show child attributes
CapitalFlowLatest names the newest period of each source.
Show child attributes
Show child attributes
When the dataset was built, Unix epoch milliseconds. 0 when unavailable.. Warning: Values > 2^53 may lose precision in JavaScript
True when the seeded dataset is unavailable. An empty country list is not zero flow.
Source URLs.
Short method notes keyed by view: bop, episodes, bank, portfolio, fdi, pairs, caveat.
Show child attributes
Show child attributes
CapitalFlowPair carries a country (a) and a counterpart (b) in both directions across bank, portfolio and direct-investment channels.
Show child attributes
Show child attributes
Was this page helpful?
