{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Working with Application Programming Interfaces (APIs)\n",
"\n",
"Application Programming Interfaces (APIs) are a set of rules and protocols that allow different software applications to communicate with each other. They enable developers to access data and functionality from external services, libraries, or platforms without needing to understand the underlying code or infrastructure. Rather than downloading data files manually, APIs allow us to programmatically request and retrieve data directly from a web service.\n",
"\n",
"In this section, we will have a brief look at how to use some common APIs for economic data retrieval using Python. We will cover the following:\n",
"\n",
"- [Banco de España's Statistics Web Service](https://www.bde.es/webbe/en/estadisticas/recursos/api-estadisticas-bde.html)\n",
"- [ECB Data Portal](https://data.ecb.europa.eu/help/api/overview)\n",
"- [Fred API](https://fred.stlouisfed.org/docs/api/fred/) by the Federal Reserve Bank of St. Louis\n",
"\n",
"These APIs provide access to a wide range of economic and financial data, including interest rates, exchange rates, inflation rates, GDP figures, and more. By using these APIs, we can automate the process of data retrieval, ensuring that we always have access to the most up-to-date information for our analyses. I highly recommend that you make use of APIs whenever possible to streamline your data collection process.\n",
"\n",
"### Banco de España's Statistics Web Service\n",
"\n",
"[Banco de España's Statistics Web Service](https://www.bde.es/webbe/en/estadisticas/recursos/api-estadisticas-bde.html) provides a way to programmatically retrieve data from the Banco de España's databases including data from [BIEST](https://app.bde.es/bie_www/bie_wwwias/xml/Arranque.html). Since Banco de España does not provide an official Python package to access their API, we can use the `requests` library to make HTTP requests and retrieve data in JSON (JavaScript Object Notation) format. We can then parse the JSON data and convert it into a Pandas DataFrame for further analysis. \n",
"\n",
"To this end, we first import the necessary libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:20:56.619161Z",
"iopub.status.busy": "2026-01-19T18:20:56.618930Z",
"iopub.status.idle": "2026-01-19T18:20:57.187099Z",
"shell.execute_reply": "2026-01-19T18:20:57.186480Z"
}
},
"outputs": [],
"source": [
"import requests\n",
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we define a class to interact with the Banco de España API^[Note that creating the class is not strictly necessary, but it helps to organize the code.]"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:20:57.190091Z",
"iopub.status.busy": "2026-01-19T18:20:57.189778Z",
"iopub.status.idle": "2026-01-19T18:20:57.195154Z",
"shell.execute_reply": "2026-01-19T18:20:57.194667Z"
}
},
"outputs": [],
"source": [
"class BancoDeEspanaAPI:\n",
" def __init__(self, language='en'):\n",
" self.language = language\n",
"\n",
" def request(self, url):\n",
" response = requests.get(url)\n",
" return response.json()\n",
"\n",
" def get_series(self, series, time_range='MAX'):\n",
"\n",
" # Prepare the series parameter\n",
" if isinstance(series, list):\n",
" series_list = ','.join(series)\n",
" else:\n",
" series_list = series\n",
"\n",
" # Download the data for the specified series\n",
" url = f\"https://app.bde.es/bierest/resources/srdatosapp/listaSeries?idioma={self.language}&series={series_list}&rango={time_range}\"\n",
" json_response = self.request(url)\n",
"\n",
" # Initialize an empty dataframe to store the results\n",
" df = pd.DataFrame()\n",
"\n",
" # Go over each series in the response and extract the data\n",
" for series_data in json_response:\n",
"\n",
" # Extract series name, dates, and values\n",
" series_name = series_data['serie']\n",
" dates = series_data['fechas']\n",
" values = series_data['valores']\n",
"\n",
" # Add the data to the dataframe\n",
" df[series_name] = pd.Series(data=values, index=pd.to_datetime(dates).date)\n",
"\n",
" # Sort the dataframe by index (date)\n",
" df = df.sort_index()\n",
"\n",
" return df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can then create an instance of the `BancoDeEspanaAPI` class and use its methods to retrieve data. For example, to get the latest data for a specific series, we can use the `get_series()` method"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:20:57.197385Z",
"iopub.status.busy": "2026-01-19T18:20:57.197172Z",
"iopub.status.idle": "2026-01-19T18:20:57.458797Z",
"shell.execute_reply": "2026-01-19T18:20:57.458006Z"
}
},
"outputs": [],
"source": [
"bde = BancoDeEspanaAPI()\n",
"df = bde.get_series(['DTNPDE2010_P0000P_PS_APU', 'DTNSEC2010_S0000P_APU_SUMAMOVIL'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, the requested series are in the DataFrame `df` and we can manipulate or analyze them as needed. For example, we can display the retrieved data"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:20:57.461959Z",
"iopub.status.busy": "2026-01-19T18:20:57.461672Z",
"iopub.status.idle": "2026-01-19T18:20:57.472945Z",
"shell.execute_reply": "2026-01-19T18:20:57.472314Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is a very basic implementation of how to interact with the Banco de España API using Python. You can extend this class to include more functionality, such as handling different data formats, error handling, and more advanced data processing as needed. To get the series keys for the data you want to retrieve, you can use the [BIEST](https://app.bde.es/bie_www/bie_wwwias/xml/Arranque.html) tool provided by Banco de España.\n",
"\n",
"\n",
"### ECB Data Portal & Other SDMX APIs\n",
"\n",
"The [ECB Data Portal](https://data.ecb.europa.eu/help/api/overview) provides access to a wide range of economic and financial data from the European Central Bank. Similar to Banco de España, the ECB does not provide an official Python package for their API. However, the ECB follows the [SDMX](https://sdmx.org/) standard for data exchange, which allows us to retrieve data in a structured format. We can use the `sdmx` library in Python to interact with the ECB API and retrieve data.\n",
"\n",
"First, we import the necessary libraries"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:20:58.144320Z",
"iopub.status.busy": "2026-01-19T18:20:58.144021Z",
"iopub.status.idle": "2026-01-19T18:20:58.323794Z",
"shell.execute_reply": "2026-01-19T18:20:58.323121Z"
}
},
"outputs": [],
"source": [
"import sdmx\n",
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then, we initialize a connection to the ECB API"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:20:58.326650Z",
"iopub.status.busy": "2026-01-19T18:20:58.326120Z",
"iopub.status.idle": "2026-01-19T18:20:58.329259Z",
"shell.execute_reply": "2026-01-19T18:20:58.328774Z"
}
},
"outputs": [],
"source": [
"ecb = sdmx.Client(\"ECB\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Suppose we want to retrieve the HICP inflation rate for Spain from January 2019 to June 2019. This series has the following key: `ICP.M.ES.N.000000.4.ANR`.\n",
"\n",
"To download it we need to specify the appropriate parameters and make a request to the ECB API"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:20:58.331474Z",
"iopub.status.busy": "2026-01-19T18:20:58.331256Z",
"iopub.status.idle": "2026-01-19T18:29:55.443452Z",
"shell.execute_reply": "2026-01-19T18:29:55.442605Z"
}
},
"outputs": [],
"source": [
"key = 'M.ES.N.000000.4.ANR' # Need key without the 'ICP.' prefix\n",
"params = dict(startPeriod=\"2019-01\", endPeriod=\"2019-06\") # This is optional\n",
"data = ecb.data(\"ICP\", key=key, params=params).data[0] # ICP prefix needs to be specified here\n",
"df = sdmx.to_pandas(data).to_frame()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, the requested data is in the DataFrame `df` and we can manipulate or analyze it as needed. For example, we can display the retrieved data"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:29:55.446681Z",
"iopub.status.busy": "2026-01-19T18:29:55.446400Z",
"iopub.status.idle": "2026-01-19T18:29:55.456507Z",
"shell.execute_reply": "2026-01-19T18:29:55.455805Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
value
\n",
"
\n",
"
\n",
"
FREQ
\n",
"
REF_AREA
\n",
"
ADJUSTMENT
\n",
"
ICP_ITEM
\n",
"
STS_INSTITUTION
\n",
"
ICP_SUFFIX
\n",
"
TIME_PERIOD
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
M
\n",
"
ES
\n",
"
N
\n",
"
000000
\n",
"
4
\n",
"
ANR
\n",
"
2019-02
\n",
"
1.1
\n",
"
\n",
"
\n",
"
2019-03
\n",
"
1.3
\n",
"
\n",
"
\n",
"
2019-04
\n",
"
1.6
\n",
"
\n",
"
\n",
"
2019-05
\n",
"
0.9
\n",
"
\n",
"
\n",
"
2019-06
\n",
"
0.6
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" value\n",
"FREQ REF_AREA ADJUSTMENT ICP_ITEM STS_INSTITUTION ICP_SUFFIX TIME_PERIOD \n",
"M ES N 000000 4 ANR 2019-02 1.1\n",
" 2019-03 1.3\n",
" 2019-04 1.6\n",
" 2019-05 0.9\n",
" 2019-06 0.6"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that this is a multi-index DataFrame. We can reset the index to make it easier to work with"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:29:55.459282Z",
"iopub.status.busy": "2026-01-19T18:29:55.458884Z",
"iopub.status.idle": "2026-01-19T18:29:55.465387Z",
"shell.execute_reply": "2026-01-19T18:29:55.464907Z"
}
},
"outputs": [],
"source": [
"df = df.reset_index()\n",
"df = df.set_index('TIME_PERIOD')\n",
"df = df.loc[:, ['value']]\n",
"df = df.rename(columns={'value': 'inflation_rate'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can plot the data as usual"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:29:55.467711Z",
"iopub.status.busy": "2026-01-19T18:29:55.467486Z",
"iopub.status.idle": "2026-01-19T18:29:55.584053Z",
"shell.execute_reply": "2026-01-19T18:29:55.583524Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These are just basic examples of how to interact with the ECB API using Python. The `sdmx` library supports many more features. \n",
"\n",
"\n",
":::{.callout-tip}\n",
"\n",
"### Other SDMX Data Providers\n",
"\n",
"The SDMX standard is used by various international organizations for data exchange. Some other notable SDMX APIs include:\n",
"\n",
"- Eurostat\n",
"- Bank for International Settlements (BIS)\n",
"- International Monetary Fund (IMF)\n",
"- OECD\n",
"\n",
"You can find a list of SDMX data providers implemented in the `sdmx` package [here](https://sdmx1.readthedocs.io/en/latest/). To use them in the code above you simply need to replace `'ECB'` with the appropriate provider name.\n",
":::\n",
"\n",
"\n",
"### Fred API\n",
"\n",
"The [Fred API](https://fred.stlouisfed.org/docs/api/fred/) by the Federal Reserve Bank of St. Louis provides access to a vast amount of economic data, including interest rates, inflation rates, GDP figures, and more. To use the Fred API, we need to sign up for an API key on the Fred website. Once we have the API key, we can use the `pyfredapi` library in Python to interact with the Fred API and retrieve data.\n",
"\n",
"The Fred API works a little differently from the previous two APIs we have seen since it requires an API key for authentication. You can sign up for a free API key on the [Fred website](https://fred.stlouisfed.org/docs/api/api_key.html). Note that these keys are personal and should not be shared publicly. For this reason, the key is not included directly in the code examples below. Instead, you should follow the [instructions](https://pyfredapi.readthedocs.io/en/latest/) in the `pyfredapi` documentation to set up your API key securely. \n",
"\n",
"Once we have set the API key, we import the necessary libraries"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:29:55.586563Z",
"iopub.status.busy": "2026-01-19T18:29:55.586312Z",
"iopub.status.idle": "2026-01-19T18:29:55.760404Z",
"shell.execute_reply": "2026-01-19T18:29:55.759738Z"
}
},
"outputs": [],
"source": [
"import pyfredapi as pf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then, we can download the series for GDP (series ID: `GDP`) as follows"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:29:55.762988Z",
"iopub.status.busy": "2026-01-19T18:29:55.762758Z",
"iopub.status.idle": "2026-01-19T18:29:56.010478Z",
"shell.execute_reply": "2026-01-19T18:29:56.009857Z"
}
},
"outputs": [],
"source": [
"df = pf.get_series('GDP') # Note that you can provide the API key manually by adding the parameter api_key='YOUR_API_KEY' if you have not set it up as an environment variable"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can then display the retrieved data"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"execution": {
"iopub.execute_input": "2026-01-19T18:29:56.013669Z",
"iopub.status.busy": "2026-01-19T18:29:56.013380Z",
"iopub.status.idle": "2026-01-19T18:29:56.022792Z",
"shell.execute_reply": "2026-01-19T18:29:56.022013Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"