API Explorer

Financial Reporting

IDA Country Exposures

Data as of Dec 31, 2025

The IDA Country Exposure dataset provides detailed information on the IDA's exposures of loss due to a borrowing country not meeting its contractual obligations. It includes data on loans, guarantees, and financial commitments across various countries.

The dataset provides quarterly data to offer a historical perspective for analysis. For the most up-to-date insights, please ensure you use data pertaining to the latest available quarter to assess the current status.

The data excludes Private Sector Window (PSW) activities.

Instructions:

We recommend using the API service only for datasets with over a million records. For smaller datasets, please use the JSON link in the "Actions and Tools" section to extract all records at once.

The API supports extraction of up to 1,000 records per request/page. To extract all records, we recommend using the code snippets provided in the Code Snippets tab.

Parameter guidelines:

  • Use DD-MMM-YYYY format for date fields.
  • To filter multiple values, separate them with "|". Example: Country = India|Afghanistan.
  • To filter for blank values, pass "IS NULL". Example: Country = IS NULL.
  • To filter for non-blank values, pass "IS NOT NULL". Example: Country = IS NOT NULL.
Parameters
ParameterValueDescriptionAPI FIELD NAMEData Type
Country CodeCountry Code according to the World Bank country list. Might be different from the ISO country code.country_codeSTRING
Country NameCountry to which loan has been issued. Loans to the IFC are included under the country “World”.country_nameSTRING
Debt Relief (US$)Provision related to HIPC and MDRIdebt_relief_us_NUMBER
Deferred Drawdown Option (DDO) (US$)Undisbursed balance of signed credits with Deferred Drawdown Option (DDO)deferred_drawdown_option_ddo_us_NUMBER
EOP DateEnd of Period Date represents the date as of which balances are shown in the report.eop_dateDATE
FinancierFinancier indicates if the lending is under IBRD or IDA.financierSTRING
IDA Exposure - PV of Guarantees provided (US$)Present value of IDA guarantees (excluding IDA Private Sector Window - PSW)ida_exposure__pv_of_guarantees_provided_us_NUMBER
Loans (Debt Relief + Net loans) (US$)Disbursed and outstanding balance of credits (excluding IDA Private Sector Window - PSW)loans_debt_relief__net_loans_us_NUMBER
Net Loans (US$)Disbursed and outstanding balance of credits (excluding IDA Private Sector Window - PSW) less Debt Reliefnet_loans_us_NUMBER
Repaying PPFs (US$)Amounts disbursed for IDA PPF Advances that are due for repayment from borrowersrepaying_ppfs_us_NUMBER
Special Commitments (US$)Undisbursed balance for financial arrangements made by the Bank to ensure payment for eligible project expenditures, regardless of any subsequent changes or disruptionsspecial_commitments_us_NUMBER
Total IDA Exposure - Loans (US$)"Total IDA Exposure - Loans" is the sum of "Loans", "Deferred Drawdown options", "Repaying PPFs" and "Special commitments".total_ida_exposure__loans_us_NUMBER
Total IDA Exposure (US$)"Total IDA Exposure" is the sum of "Total Exposure - Credits" and "IDA Exposure - PV of Guarantees provided"total_ida_exposure_us_NUMBER
Resource IDID of the associated ResourceSTRING
SelectFields that required E.g (fiscal_year|supplier_country|total_amount)STRING
TopNumber of records to fetchNUMBER
SkipSkip the records from the ascending orderNUMBER

https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json

No Data Available

DS04622
Feb 25, 2025
Feb 5, 2026
Licensing and Attribution
Creative Commons Attribution 4.0
Creative Commons Attribution 4.0
Additional Information
Time Series
Country Name
Quarter
National
official
Quarterly
World
eop_date
Query tool,API,Mobile App,Bulk download
English
Within 10 business days following the end of the quarter
Dec 31, 2025
Feb 5, 2026
Oct 29, 2025
Scope
What's in this Dataset?
1,313
13
JavaScript makes it super simple to fetch from an API endpoint.

fetch('https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json')
.then(response => {
    if (!response.ok) {
        throw new Error('');
    }
    return response.json();
})
.then(data => {
    // Do something with the response data
    // console.log(data);
})
.catch(error => {
    console.error('Error:', error);
});
    

async function fetchAllData(url) {
    let allData = [];
    let hasMoreData = true;
    let top = 1000;
    let skip = 0;
    while (hasMoreData) {
      const response = await fetch(`${url}&top=${top}&skip=${skip}`);
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        const res = await response.json();
        allData = allData.concat(res);
        // Check if we received less data than requested, indicating no more data
        if (res.data.length < top) {
            hasMoreData = false;
        } else {
            skip += top;
        }
    }
    return allData;
}
let url = 'https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json';   
fetchAllData(`${url}`).then(allData => {
    // Do something with all the data
    // console.log(allData);
})
.catch(error => {
    console.error('Error:', error);
});
Python for easily work with data.

import requests
url = 'https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json'
try:
    response = requests.get(url)
    response.raise_for_status()  # Raise an exception for 4XX and 5XX status codes
    data = response.json()  # Parse the JSON response
    print(data)  # Print the response data
except requests.RequestException as e:
    print(f'Error: {e}')

import requests
def fetch_all_data():
    base_url = 'https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice'
    dataset_id = 'DS04622'
    resource_id = 'RS03879'
    top = 1000
    skip = 0
    all_data = []
    total_count = 0
    page = 1
    while True:
        url = f'{base_url}?datasetId={dataset_id}&resourceId={resource_id}&top={top}&type=json&skip={1000*(page-1)}'
        try:
            response = requests.get(url, timeout=10)
            #print(response)
            response.raise_for_status()  # Raise an exception for 4XX and 5XX status codes
            data = response.json()  # Parse the JSON response

            # Assuming the actual data is in the 'data' key of the response
            if 'data' not in data or not data['data']:  # Exit the loop if no more data is returned
                break

            if page == 1 and 'count' in data:
                total_count = data['count']  # Store the total count from the first response

            all_data.extend(data['data'])  # Add the fetched data to the list
            page += 1  # Increment the page value to get the next set of records
            #print(f'Page: {page}, Status Code: {response.status_code}')
        except requests.RequestException as e:
            print(f'Error: {e}')
            break
    return {'count': total_count, 'data': all_data}
# Fetch all data and print it
all_data = fetch_all_data()
print(all_data)
PowerShell code to extract data.

$url = 'https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json'
try {
    $response = Invoke-RestMethod -Uri $url -Method Get
    # Print the response
    Write-Output $response
} catch {
    # Print error message if request fails
    Write-Error "Error: $_"
}

function Fetch-AllData {
    param (
        [string]$baseUrl
    )
    $allData = @()
    $top = 1000
    $skip = 0
    $hasMoreData = $true
    while ($hasMoreData) {
        $url = "$baseUrl&top=$top&skip=$skip"
        try {
            $response = Invoke-RestMethod -Uri $url -Method Get
            $allData += $response.data

            # Check if we received less data than requested, indicating no more data
            if ($response.data.Count -lt $top) {
                $hasMoreData = $false
            } else {
                $skip += $top
            }
        } catch {
            Write-Error "Error: $_"
            $hasMoreData = $false
        }
    }
    return $allData
}
$baseUrl = 'https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json'
$allData = Fetch-AllData -baseUrl $baseUrl
# Do something with all the data
$allData | ConvertTo-Json | Write-Output
The following snippet brings data into your application.

require 'net/http'
url = URI('https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json')
begin
response = Net::HTTP.get_response(url)
if response.is_a?(Net::HTTPSuccess)
    puts response.body
else
    puts "Error: #{response.code} - #{response.message}"
end
rescue StandardError => e
puts "Error: #{e.message}"
end

require 'net/http'
require 'json'
require 'uri'
 
def fetch_all_data(base_url)
  all_data = []
  has_more_data = true
  top = 1000
  skip = 0
  while has_more_data
 
    url = URI("#{base_url}&top=#{top}&skip=#{skip}")
    response = Net::HTTP.get_response(url)
    if response.is_a?(Net::HTTPSuccess)
      begin
        data = JSON.parse(response.body)
        if data.key?('data')
          all_data.concat(data['data'])
          # Check if we received less data than requested, indicating no more data
          if data['data'].length < top
            has_more_data = false
          else
            skip += top
          end
        else
          has_more_data = false
        end
      rescue JSON::ParserError => e
        puts "JSON parsing error: #{e.message}"
        has_more_data = false
      end
    else
      puts "Error: #{response.code} - #{response.message}"
      has_more_data = false
    end
  end
  all_data
rescue StandardError => e
  puts "Error: #{e.message}"
end
base_url = 'https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json'
all_data = fetch_all_data(base_url)
puts all_data
Below code that makes usage with .NET more natural.

using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
    static async Task Main(string[] args)
    {
        var response = await new HttpClient().GetStringAsync("https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json");
        Console.WriteLine(response);
    }
}

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
class Program
{
    static async Task Main(string[] args)
    {
        string baseUrl = "https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json";
        var allData = await FetchAllData(baseUrl);
        // Do something with all the data
        Console.WriteLine(allData);
    }
    static async Task<JArray> FetchAllData(string baseUrl)
    {
        var allData = new JArray();
        int top = 1000;
        int skip = 0;
        bool hasMoreData = true;
        using (HttpClient client = new HttpClient())
        {
            while (hasMoreData)
            {
                string url = $"{baseUrl}&top={top}&skip={skip}";
                var response = await client.GetStringAsync(url);
                var data = JArray.Parse(JObject.Parse(response)["data"].ToString());
                allData.Merge(data);
                // Check if we received less data than requested, indicating no more data
                if (data.Count < top)
                {
                    hasMoreData = false;
                }
                else
                {
                    skip += top;
                }
            }
        }
        return allData;
    }
}
JAVA for easily work with data.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
    public static void main(String[] args) throws Exception {
        URL url = new URL("https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        StringBuffer response = new StringBuffer();
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        reader.close();
        System.out.println(response.toString());
    }
}

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONObject;
public class Main {
    public static void main(String[] args) throws Exception {
        String baseUrl = "https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json";
        int top = 1000;
        int skip = 0;
        boolean hasMoreData = true;
        JSONArray allData = new JSONArray();
        while (hasMoreData) {
            String urlWithParams = baseUrl + "&top=" + top + "&skip=" + skip;
            URL url = new URL(urlWithParams);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            StringBuffer response = new StringBuffer();
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            JSONObject jsonResponse = new JSONObject(response.toString());
            JSONArray data = jsonResponse.getJSONArray("data");
            for (int i = 0; i < data.length(); i++) {
                allData.put(data.getJSONObject(i));
            }
            // Check if we received less data than requested, indicating no more data
            if (data.length() < top) {
                hasMoreData = false;
            } else {
                skip += top;
            }
        }
        // Do something with all the data
        System.out.println(allData.toString());
    }
}
The following snippet brings data into your application.

shell "curl -X GET https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json"

#!/bin/bash
top=1000
skip=0
has_more_data=true
all_data="[]"
while $has_more_data; do
    url="https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json&top=$top&skip=$skip"
    response=$(curl -s -X GET "$url")
    # Extract data from the response
    data=$(echo "$response" | jq '.data')
    # Append the new data to all_data
    all_data=$(echo "$all_data $data" | jq -s '[.[][]]')
    # Check if we received less data than requested, indicating no more data
    data_length=$(echo "$data" | jq 'length')
    if [[ "$data_length" -lt "$top" ]]; then
        has_more_data=false
    else
        skip=$((skip + top))
    fi
done
# Output all the data
echo "$all_data" | jq
PHP code to brings the data.

<?php
// Specify the URL you want to send the GET request to
$url = "https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json";
// Initialize cURL session
$curl = curl_init();
// Set the cURL options
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// Execute cURL session
$response = curl_exec($curl);
// Close cURL session
curl_close($curl);
// Print the response
echo $response;
?>
            

<?php
function fetchAllData($baseUrl) {
    $allData = [];
    $hasMoreData = true;
    $top = 1000;
    $skip = 0;
 
    while ($hasMoreData) {
        $url = "{$baseUrl}&top={$top}&skip={$skip}";
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($curl);
 
        if (curl_errno($curl)) {
            echo 'Curl error: ' . curl_error($curl);
            curl_close($curl);
            break;
        }
 
        curl_close($curl);
        $data = json_decode($response, true);
 
        if (isset($data['data'])) {
            $allData = array_merge($allData, $data['data']);
            // Check if we received less data than requested, indicating no more data
            if (count($data['data']) < $top) {
                $hasMoreData = false;
            } else {
                $skip += $top;
            }
        } else {
            $hasMoreData = false;
        }
    }
 
    return $allData;
}
 
$baseUrl = 'https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json';
$allData = fetchAllData($baseUrl);
 
print_r($allData);
Copy and paste the following to import this dataset into Stata.

clear
. import delimited "https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&top=100&type=json"

clear
local base_url "https://datacatalogapi.worldbank.org/dexapps/fone/api/apiservice?datasetId=DS04622&resourceId=RS03879&type=json"
local top 1000
local skip 0
local has_more_data 1
tempfile all_data
save `all_data', emptyok
while `has_more_data' {
    local url "`base_url'&top=`top'&skip=`skip'"
    import delimited "`url'", clear
    // Check if we received less data than requested, indicating no more data
    local n = _N
    if `n' < `top' {
        local has_more_data 0
    } else {
        local skip = `skip' + `top'
    }
    append using `all_data'
    save `all_data', replace
}
use `all_data'

GET
https://datacatalogapi.worldbank.org/dexapps/fone/api/metadata?assetId=DS04622