Query the Reporting Data API
To read OpenLM Platform reporting data, send GraphQL queries or CSV export requests to the endpoints on this page. This page lists the endpoints, query parameters, and every GraphQL query the OpenLM Reporting Data API exposes. Authentication is covered in Authenticate to the Reporting Data API. For the fields each query returns, see the Reporting Data API field reference.
All requests require a valid Authorization: Bearer <token> header. The Reporting Data API is a GraphQL API: you read all data through a single GraphQL endpoint, plus a set of REST endpoints for CSV exports.
Endpoints
The following table lists the endpoints:
| Endpoint | Method | Purpose |
|---|---|---|
{API_BASE_URL}/graphql | POST | All data queries (and the in-browser GraphQL explorer on GET). |
{API_BASE_URL}/api/reporting/{report} | POST | CSV exports of the six main reports. |
{API_BASE_URL}/health | GET | Health check. |
Schema names are camelCase (licenseUsage, pageInfo, totalCount, orderBy). Report node fields are snake_case (user_name), except the devices query, whose fields are camelCase (deviceName). The groupBy and orderBy argument values are raw column names in snake_case (for example, "feature_name").
Reporting period
Report queries cover a rolling 90-day period, applied to each report's event-time column:
- If you don't filter on dates, you get the last 90 days.
- A requested date range must be 90 days or less. The API refuses a wider range with the GraphQL error code
DATE_RANGE_TOO_WIDE. - Filter-value lookup queries also cover the last 90 days, so they stay consistent with the report they belong to.
projectData,procuredItems,inventoryItems,licenseServerStatus, and the dashboard widget queries are not limited to 90 days. They always return current data.
The column the window applies to, per report:
| Report | Event-time column |
|---|---|
licenseUsage | start_time_utc |
licenseDenials | denial_date |
sessionDetails | session_start_time |
touchpointDetails | event_date_time |
dongleMonitoring, devices | device_connected_date_time |
utilizationByFeature, utilizationByVendor | start_date_utc |
Write date bounds as literal values inside the where argument (or, for the utilization queries, in startDate/endDate). The API can't validate date bounds passed as GraphQL variables. It then applies the default last-90-days window on top of your filter instead of raising an error.
Query parameters
These parameters apply to the queries on this page:
| Parameter | Type | What it does |
|---|---|---|
first | Int | (Cursor paging) How many records to retrieve from the start, for example first: 25. |
after | String | (Cursor paging) A cursor string from a previous response that retrieves the next page after it. |
last / before | Int / String | (Cursor paging) Same idea but paging backwards from the end. |
skip | Int | (Offset paging) How many records to skip before reading. |
take | Int | (Offset paging) How many records to read after skipping. |
searchTerm | String | (Filter lists) Optional text to narrow the values in a drop-down list. Leave empty to get all distinct values. |
limit | Int | (Widgets only) How many rows the widget returns. See notes per query. |
where | (filter object) | Optional filter on any field of the result (autogenerated by the server). |
order | (sort object) | Optional sort on any field of the result (autogenerated by the server). |
The available queries depend on the deployment mode. Queries marked (On-premises only) exist only in on-premises deployments. Queries marked (Cloud only) exist only in OpenLM Platform. Everything else is in both.
Main report queries
These return paged data. Use cursor-paging parameters: first, after, last, before. They also accept where (filter) and order (sort) on any field. A page returns at most 250 records. The following table lists the main report queries:
| Query | Parameters | Notes |
|---|---|---|
licenseUsage | first, after, last, before, where, order | License usage records. |
licenseDenials | first, after, last, before, where, order | License denial records. |
sessionDetails | first, after, last, before, where, order | Application/session records. |
projectData | first, after, last, before, where, order | Project records. |
touchpointDetails | first, after, last, before, where, order | Touchpoint (web activity) records. |
dongleMonitoring | first, after, last, before, where, order | Dongle/device monitoring records. |
devices | first, after, last, before, where, order | Device records. Field names are camelCase, unlike the other reports. |
utilizationByFeature (Cloud only) | featureName: String, startDate: DateTime, endDate: DateTime, plus paging, where, order | Concurrent license utilization. All three arguments are optional: featureName limits the result to a single feature, startDate/endDate limit it to a period. |
utilizationByVendor (Cloud only) | vendor: String, startDate: DateTime, endDate: DateTime, plus paging, where, order | The same utilization data, limited to a single vendor. |
procuredItems (Cloud only) | first, after, last, before, where, order | Purchased licenses, with quantity allocated and available. |
inventoryItems (Cloud only) | first, after, last, before, where, order | License inventory details. |
Request, for example, licenseUsage(first: 25). The response includes pageInfo.hasNextPage and an endCursor. Pass that cursor as after to get the next page: licenseUsage(first: 25, after: "<endCursor>"). totalCount gives the full record count.
Count queries (Cloud only)
These queries return a single number and take no parameters. The following table lists them:
| Query | Returns | Meaning |
|---|---|---|
licenseUsageActiveLicenseCount | Int | Count of active licenses. |
licenseUsageHostRunningCount | Int | Count of running hosts. |
licenseDenialsDenialCountInLast24Hours | Int | Denials in the last 24 hours. |
licenseDenialsNewAlertsCountIn24Hours | Int | Distinct new denial alerts in the last 24 hours. |
To use a count query, call it directly, for example { licenseUsageActiveLicenseCount }.
Filter-value lookup queries
These return a paged list of distinct, sorted values for a single field, for building filter drop-down lists. Every query takes an optional searchTerm plus the offset-paging parameters skip (Int) and take (Int). Each of the following tables lists the searchTerm type for that query.
The following table lists the License Usage queries:
| Query | searchTerm |
|---|---|
licenseUsageLicenseTypeFilterValues | String |
licenseUsageVersionFilterValues | String |
licenseUsageUserNameFilterValues | String |
licenseUsageWorkstationFilterValues | String |
licenseUsageVendorFilterValues | String |
licenseUsageFeaturePackageFilterValues | String |
licenseUsageFeatureProductFilterValues | String |
licenseUsageFeaturePackageItemFilterValues | String |
licenseUsageIsTokenBasedFilterValues | String |
The following table lists the License Denials queries:
| Query | searchTerm |
|---|---|
licenseDenialsUserNameFilterValues | String |
licenseDenialsWorkstationFilterValues | String |
licenseDenialsMinorErrorFilterValues | String |
licenseDenialsMajorErrorFilterValues | String |
licenseDenialsErrorTextFilterValues | String |
licenseDenialsFeatureNameFilterValues | String |
licenseDenialsStatusFilterValues | String |
licenseDenialsGroupIdFilterValues (Cloud only) | String |
licenseDenialsGroupNameFilterValues (Cloud only) | String |
licenseDenialsCategoryFilterValues | String |
licenseDenialsVendorFilterValues | String |
licenseDenialsFeatureVersionFilterValues (Cloud only) | String |
licenseDenialsLicenseTypeFilterValues | String |
licenseDenialsAdditionalKeyFilterValues | String |
licenseDenialsHostnameFilterValues | String |
licenseDenialsLicenseServerFilterValues (Cloud only) | String |
The following table lists the Session Details queries:
| Query | searchTerm |
|---|---|
sessionDetailsUserFilterValues | String |
sessionDetailsWorkstationFilterValues | String |
sessionDetailsIdleTimeFilterValues | Float |
sessionDetailsSessionEndTimeHolidaysFilterValues | DateTime |
sessionDetailsSessionEndTimeWeekdaysFilterValues | DateTime |
sessionDetailsSessionFilterValues | Float |
sessionDetailsProcessFilterValues | String |
sessionDetailsDependencyFilterValues | String |
sessionDetailsCustomerFilterValues | String |
sessionDetailsReasonFilterValues | String |
sessionDetailsAgentStatusFilterValues | Int |
sessionDetailsVersionFilterValues | String |
The following table lists the Touchpoint Details queries:
| Query | searchTerm |
|---|---|
touchpointDetailsUsernameFilterValues | String |
touchpointDetailsWorkstationFilterValues | String |
touchpointDetailsEventDateTimeFilterValues | DateTime |
The following table lists the Dongle Monitoring queries:
| Query | searchTerm |
|---|---|
dongleMonitoringDeviceNameFilterValues | String |
dongleMonitoringDeviceDescriptionFilterValues | String |
dongleMonitoringManufacturerFilterValues | String |
dongleMonitoringUserNameFilterValues | String |
dongleMonitoringHostNameFilterValues | String |
dongleMonitoringBlacklistedFilterValues | String |
dongleMonitoringAgentStatusFilterValues | Int |
The following table lists the Project Data queries:
| Query | searchTerm |
|---|---|
projectDataProjectNameFilterValues | String |
projectDataUserNameFilterValues | String |
projectDataPriorityFilterValues | String |
projectDataSourceFilterValues | String |
projectDataGroupNameFilterValues (On-premises only) | String |
The following table lists the device filter queries:
| Query | searchTerm | Notes |
|---|---|---|
deviceNameFilterValues | String | None |
deviceManufacturersFilterValues | String | None |
deviceHostNameFilterValues | String | Accepts an optional deviceId (String) to restrict results to a single device. |
deviceUserNameFilterValues | String | Accepts an optional deviceId (String) to restrict results to a single device. |
For example, licenseUsageVendorFilterValues(searchTerm: "auto", take: 20) returns up to 20 distinct vendors containing "auto". Omit searchTerm to list all values.
Dashboard widget queries (Cloud only)
These return a simple list (not paged). The key parameter is limit.
The limit parameter works as follows:
- Top-N widgets:
limitaccepts only 5 or 10. Any other value (or omitting it) defaults to 10. Solimit: 5returns 5 rows, and any other value returns 10 rows. - Full-list widgets (
activeUsersReport,licenseServerStatus, andhostAvailability):limitaccepts 1 to 100. Out-of-range or omitted values default to 100 (a safety cap).
The following table lists the widget queries:
| Query | Parameter | Notes (what it returns / ordering) |
|---|---|---|
topDeniedFeatures | limit: Int (5/10) | Most-denied features, highest first. |
topDeniedUsers | limit: Int (5/10) | Users with the most denials, highest first. |
topMostUsedFeatures | limit: Int (5/10) | Most-used features, highest usage first. |
topLeastUsedFeatures | limit: Int (5/10) | Least-used features, lowest usage first. |
topLongestSessions | limit: Int (5/10) | Longest sessions, longest first. |
topIdleSessions | limit: Int (5/10) | Most idle sessions, highest idle time first. |
topProductNames | limit: Int (5/10) | Top products by usage. |
topVendorNames | limit: Int (5/10) | Top vendors by usage. |
topMostActiveUsers | limit: Int (5/10) | Most-active users (only users with at least 1 session). |
topLeastActiveUsers | limit: Int (5/10) | Least-active users (only users with at least 1 session). |
activeUsersReport | limit: Int (1 to 100, default 100) | Active sessions. |
licenseServerStatus | limit: Int (1 to 100, default 100) | License server status list. |
hostAvailability | limit: Int (1 to 100, default 100) | Host availability list. |
For example, topDeniedFeatures(limit: 5) returns the top 5. activeUsersReport(limit: 50) returns up to 50 active sessions.
CSV exports
You can download six reports as CSV files. Send a POST to {API_BASE_URL}/api/reporting/{report}, with {report} set to any of:
GetLicenseUsageCSVGetLicenseDenialsCSVGetSessionDetailsCSVGetTouchpointDetailsCSVGetDongleMonitoringCSVGetProjectDataCSV
The request body has three parts:
filterColumns: the columns you want in the file, in order. Use the same field names as the matching report in the Reporting Data API field reference.filterOptions: which records to include.startDateTimeandendDateTimeset the period. Each takes an interval object with optionalstartIntervalDateTimeandendIntervalDateTimebounds, as in the example.- Each
selected...list narrows the results to those values. Omit a list to include everything.
userConfigurations: the value formatting for the file:timezone,dateFormat,decimalSymbol,thousandsSeparator.timezonetakes an IANA time zone ID, such asEurope/BerlinorAmerica/New_York. OpenLM converts the times in the file from UTC to that zone. Leave it empty for UTC. An unrecognized ID fails the request.dateFormatmust be one of the six UI Configurations date formats:dd/MM/yyyy hh:mm:ss,MM/dd/yyyy hh:mm:ss,yyyy-MM-dd hh:mm:ss,dd/MM/yyyy HH:mm:ss,MM/dd/yyyy HH:mm:ss, oryyyy-MM-dd HH:mm:ss. Leave it empty foryyyy-MM-dd HH:mm:ss. Any other value fails the request. Thehhformats use a 12-hour clock without AM or PM, so use anHHformat unless you add the period yourself.
The selected... lists each report accepts:
| Report | selected... lists |
|---|---|
GetLicenseUsageCSV | selectedLicInvVendor, selectedLicInvType, selectedLicInvVersion, selectedUserName, selectedHostName, selectedProductName, selectedIsTokenBased |
GetLicenseDenialsCSV | selectedUserName, selectedWorkstation, selectedMinorErr, selectedMajorErr, selectedErrorMessage, selectedFeatureName, selectedStatus, selectedGrpId, selectedGrpName, selectedCategory, selectedVendor, selectedVersion, selectedLicenseType, selectedAdditionalKey, selectedHostName, selectedLicsrvDescription |
GetSessionDetailsCSV | selectedUserNames, selectedHostNames, selectedProcessNames, selectedDllNames, selectedShutdownReasons, selectedVersion, selectedAgentStatuses |
GetTouchpointDetailsCSV | selectedUserNames, selectedWorkstations |
GetDongleMonitoringCSV | selectedDeviceName, selectedDeviceDescription, selectedManufacturer, selectedUserName, selectedHostName, selectedAgentStatus |
GetProjectDataCSV | selectedProjectName, selectedUserName, selectedPriority, selectedSource, selectedGroupName |
The response is the CSV file itself.
Example
This request exports license usage records to license_usage.csv:
curl -X POST "{API_BASE_URL}/api/reporting/GetLicenseUsageCSV" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filterColumns": ["user_name", "feature_name", "vendor", "start_time_utc"],
"filterOptions": {
"startDateTime": { "startIntervalDateTime": "2026-06-01T00:00:00Z" },
"endDateTime": { "endIntervalDateTime": "2026-08-01T00:00:00Z" },
"selectedUserName": [],
"selectedProductName": []
},
"userConfigurations": {
"timezone": "UTC",
"dateFormat": "dd/MM/yyyy HH:mm:ss",
"decimalSymbol": ".",
"thousandsSeparator": ","
}
}' \
--output license_usage.csv
Related pages
For more information, see these pages:
- Authenticate to the Reporting Data API: get a Bearer token before calling these queries.
- Reporting Data API field reference: the fields each query returns.
The documentation team might draft this page using a large language model. A technical writer reviews every page and verifies it against the product before publishing it. A human makes the final decision.