Denodo - Using the Built-In REST Service
There are several ways to access views in Denodo. The most common methods are to use JDBC or ODBC, but another method is to use Denodo’s built in REST service. This method is especially useful when accessing Denodo for lightweight applications, like Python applications. All Denodo views get a corresponding REST service automatically. While it is possible to create Data Services to implement more specific requirements that also use web protocols, you do not need to create or deploy a dedicated Data Service to use the REST service for a given view.
The Denodo REST service uses Basic with VDP authentication. In other words, when authenticating, simply use the same username and password that you would when logging into Denodo. This applies to both personal accounts and service/application accounts.
Official documentation for Denodo’s REST service
Accessing Views via URL (Swagger page)
A Swagger page is an interactive, web-based documentation interface that allows developers to visualize and test REST APIs. You can reach the Denodo REST Swagger page with the following URL: https://[ServerName]:9443/denodo-restfulws/
- Example (Denodo Development environment): https://urbdenododev2.admin.uillinois.edu:9443/denodo-restfulws/
To see all records of a view using the Swagger page, simply navigate to a VDB, to a view of your choice, and click it. Below is an example of the logical_data_warehouse.

Alternatively, you can use the following URL format to access a view directly: https://urbdenododev2.admin.uillinois.edu:9443/denodo-restfulws/[VDB]/views/[ViewName]
- Example (Denodo Development environment): https://urbdenododev2.admin.uillinois.edu:9443/denodo-restfulws/logical_data_warehouse/views/t_rs_time
Searching Views via URL (Swagger page)
To search (filter) the view, click the search link. Add your filter or output criteria and click search at the bottom.

Results:

As you may have noticed, the Swagger search page adds parameters to the URL when you add search criteria. These parameters can be manipulated manually or programmatically as well.
For example, let’s say you want to search the t_rs_time table for all registration snapshot records for the 120268 term_cd (as in the previous example). You can do that with the following URL. The yellow highlighted part below is the filter.
- https://urbdenododev2.admin.uillinois.edu:9443/denodo-restfulws/logical_data_warehouse/views/t_rs_time?term_cd=120268
Changing Output Format
The default output format of the Denodo REST service is HTML. HTML representation is useful for testing as it is human readable, but applications will likely want to use JSON or XML.
To output the results as JSON, add the $format=json parameter to the end of the URL. As an example, we'll use the URL above, just output in JSON format instead of HTML:
- https://urbdenododev2.admin.uillinois.edu:9443/denodo-restfulws/logical_data_warehouse/views/t_rs_time?term_cd=120268&$format=json
Results:

Using the Denodo REST Service with Python
One of the most useful use cases for the Denodo REST service is when developing a data driven application. While you can consume the Denodo REST service from virtually any programming language, we’ve included a code snippet for Python below.
The following code snippet assumes that credentials and the Denodo REST URL are stored as environment variables. The code snippet calls the REST service and displays the results in a data frame.
import os
import requests
import pandas as pd
from dotenv import load_dotenv
from requests.auth import HTTPBasicAuth
import logging
import sys
load_dotenv()
USERNAME = os.getenv('DEN_USER')
PASSWORD = os.getenv('DEN_PASS')
BASE_URL = os.getenv('DEN_API_URL')
def fetch_api_data():
headers = {
'Accept': 'application/json',
'User-Agent': 'python-requests/2.31.0' # Some servers block empty user-agents
}
try:
response = requests.get(
BASE_URL,
auth=HTTPBasicAuth(USERNAME, PASSWORD),
headers=headers,
timeout=10,
verify=False
)
data = response.json()
# Denodo packs rows inside 'elements'
df = pd.DataFrame(data.get('elements', []))
row_count = len(df)
return df
except Exception as err:
print(f"An error occurred: {err}")
# Execute and view the first 5 rows
df = fetch_api_data()
if df is not None:
display(df.head())

