Tenable Cloud Exposure
Tenable Cloud Exposure is a powerful cloud-native application protection platform (CNAPP) designed to simplify even the most complex cloud security challenges. By combining full asset discovery, deep risk analysis, runtime threat detection, and compliance, it rapidly exposes and closes priority security gaps caused by misconfigurations, risky entitlements, and vulnerabilities. With its unique identity-first approach, Tenable Cloud Exposure dramatically reduces the cloud attack surface and enforces least privilege at scale, helping organizations minimize risk and strengthen their overall security posture.
Validation Criteria
Your integration with Tenable Cloud Exposure should meet the following criteria:
- Ensure that all API calls from your integration use a standard User-Agent string as outlined in the User-Agent Header guide. This enables Tenable to identify your integration's API calls to assist with debugging and troubleshooting.
- Contact Tenable via the Tech Alliances Email ([email protected]) to validate your third-party integration with Tenable's product or platform.
- Explain how your integration uses Tenable's API and the specific endpoints utilized. Tenable may request read access to your integration's codebase to validate scalability and recommend best practices.
- Ensure that your integration uses the proper naming conventions, trademarks, and logos in your integration's user interface. You can download a Media Kit on Tenable's media page.
GraphQL
Tenable Cloud Exposure uses a GraphQL API, providing flexibility and precise control over the data you retrieve. The API is available via a single endpoint (/graphql) and follows the standard GraphQL schema defined in the official GraphQL documentation. For more information, see the Tenable Cloud Exposure API documentation.
Best Practices
To build robust and reliable integrations with the Tenable Cloud Exposure GraphQL API, follow these best practices:
Set a Sensible Polling Interval
- Limit automated polling to once per day.
- For user-triggered, on-demand requests, enforce a cooldown period (e.g., 12 hours).
Use Documented and Supported Fields
- Restrict integrations to documented fields; avoid relying on undocumented fields, which may change without notice.
- Do not use deprecated fields. Always refer to the documentation for recommended replacements.
- If Tenable updates field structures or naming conventions, advance notice will be provided. Third parties should update their integrations within 30 days of notification to maintain compatibility.
Query Only Relevant Fields
- Retrieve only the fields you actually need.
- Avoid unnecessary fields to maintain efficiency and reduce system overhead.
Prefer Broad Filters
- Use broader filters instead of highly complex, granular queries.
- For detailed views, export the full dataset and apply filtering on locally cached data.
Rate Limiting and Quotas
Tenable may enforce rate limits or usage quotas to safeguard system performance, maintain security, and ensure fair usage across all customers.
Use Pagination
GraphQL APIs support cursor-based pagination, which enables you to efficiently retrieve large datasets in smaller chunks. Instead of requesting everything at once, you request a limited number of results and fetch additional pages as needed. For more details, see Pagination in the official GraphQL documentation.
To paginate through results, use the first and after arguments:
first: {number}— The number of results to return in the request.after: {cursor}— The cursor pointing to where the next page of results should begin.
Best practices for pagination:
- Always check
pageInfo.hasNextPageto determine if more data is available. - Use reasonable page sizes (50–100 results depending on query type) to avoid performance issues.
- Store and reuse cursors when needed to navigate through result sets.
Example: Fetch First Five Items
The following query retrieves the first five virtual instances with critical or high vulnerabilities:
query {
VulnerabilityInstances(first: 5, filter: {VulnerabilitySeverities: [Critical, High]}) {
pageInfo {
endCursor
hasNextPage
}
nodes {
Resolved
Software {
Name
}
Resource {
Id
Name
}
Vulnerability {
Id
Severity
CvssScore
}
}
}
}Example: Paginate Through Findings
Step 1: Initial Query
Start by setting after: null to retrieve the first set of results:
query {
Findings(first: 10, after: null) {
nodes {
Policy {
Name
}
Status
CreationTime
}
pageInfo {
hasNextPage
endCursor
}
}
}Sample Response
{
"data": {
"Findings": {
"nodes": [
{
"Policy": {
"Name": "Inactive IAM role"
},
"Status": "Open",
"CreationTime": "2024-08-13T00:49:10.532Z"
},
...
],
"pageInfo": {
"hasNextPage": true,
"endCursor": "cursor10"
}
}
}
}Since pageInfo.hasNextPage is true, use pageInfo.endCursor (cursor10) to fetch the next page.
Step 2: Fetch the Next Page
Use after: "cursor10" to fetch the next set of results:
query {
Findings(first: 10, after: "cursor10"){
nodes {
Policy {
Name
}
Status
CreationTime
}
pageInfo {
hasNextPage
endCursor
}
}
}Sample Response
{
"data": {
"Findings": {
"nodes": [
{
"Policy": {
"Name": "Virtual Machine has vulnerabilities that should be addressed"
},
"Status": "Open",
"CreationTime": "2024-09-14T00:43:10.578Z"
},
...
],
"pageInfo": {
"hasNextPage": false,
"endCursor": "cursor20"
}
}
}
}When pageInfo.hasNextPage is false, all results have been retrieved. Otherwise, continue paginating using the most recent endCursor.
Supported Use Cases
Tenable Cloud Exposure supports several common integration patterns that partners can use to retrieve cloud security data through the GraphQL API. These use cases describe high-level workflows and provide example queries that illustrate the recommended approach. Each example request selects every field the use case supports, so that you can see what is available; select only the fields your integration needs. For more information, see Query Only Relevant Fields.
Access to these use cases is granted as part of Tenable's partner validation process. If your integration has not yet completed validation, these queries may return no results.
For validation requirements, see the Validation Criteria.
Each query type has an associated pagination limit. Queries that exceed these limits will not be blocked, but the resulting performance issues or timeouts are not supported. For guidance on improving performance, see Best Practices.
Query Inventory
Retrieve all cloud inventory entities across accounts and providers. This use case is suitable for partners building asset inventories, CMDB enrichment, or resource-level reporting. Optionally, you can include custom properties, labels, tags, and cloud-specific identifiers such as ARNs for AWS resources.
Pagination limit: 100
Supported filters:
filter: {
AccountIds: ["***"]
Providers: [***]
}
TipYou can optionally filter inventory by account, provider, region, or resource type to reduce query scope and improve performance.
Example request:
query {
Entities(first: 100, after: null, filter: {
AccountIds: ["***"]
Providers: [***]
}) {
nodes {
AccountId
AccountName
CustomProperties {
Name
Values { Value }
}
CreatorOriginator { Id }
CreatorIdentity { Id }
CreationTime
Id
Labels
Name
Provider
Region
SyncTime
Tags { Key Value }
Type: __typename
... on AwsResource { Arn }
... on ContainerImage {
OperatingSystem
OperatingSystemType
}
... on VirtualMachine {
OperatingSystem
OperatingSystemType
}
}
pageInfo { hasNextPage endCursor }
}
}Query Findings
Retrieve all findings across accounts and cloud providers. You may optionally include related resource information. This use case is suitable for partners building security dashboards, compliance views, alerting systems, and correlation pipelines.
Pagination limit: 100
Supported filters:
filter: {
AccountIds: ["***"]
Categories: [***]
Families: [***]
Providers: [***]
Severities: [***]
Statuses: [***]
SubStatuses: [***]
Types: [***]
}Example request:
query {
Findings {
nodes {
AccountId
AccountName
AccountPath
Context
CreationTime
Description
Id
Link
OpenTime
Policy {
Category
Description
Id
Name
ScopeId
}
Provider
Remediation {
Console {
Steps
}
}
Resources {
Id
}
Severity
Status
SubStatus
StatusUpdateTime
}
pageInfo {
hasNextPage
endCursor
}
}
}Query Vulnerabilities
Retrieve vulnerability details, including severity scores, exploitability indicators, and the sources that reported each vulnerability. This use case is suitable for partners enriching their own vulnerability records, or correlating Tenable severity and VPR data with other sources.
Pagination limit: 10,000
Supported filters:
filter: {
VprSeverities: [***]
}
NoteHigh-volume integrations should use pagination and query only required fields. Additionally, use the
VprSeveritiesfilter to narrow results to the severities you need.
Example request:
query {
Findings {
nodes {
AttackVector
CvssScore
CvssSeverity
Description
EpssScore
Exploitable
ExploitMaturity
Id
Links
Names
Severity
Sources {
CvssScore
CvssVector
CvssVersion
Name
Severity
}
VprScore
VprSeverity
}
pageInfo {
hasNextPage
endCursor
}
}
}Query Vulnerabilities by Virtual Machine
List all scanned virtual machines and retrieve both open and resolved vulnerabilities associated with each instance. This use case supports partners performing vulnerability tracking, CMDB enrichment, and risk analytics.
Pagination limit: 10,000
Supported filters:
filter: {
Resolved: ***
VprSeverities: [***]
}
NoteHigh-volume integrations should use pagination and query only required fields. Additionally, use filters to narrow results to relevant severities or resolved/unresolved instances.
Example request:
query {
VulnerabilityInstances {
nodes {
FirstScanTime
ResolutionTime
Resolved
Software {
Name
Type
Version
}
Resource {
Id
Name
}
SoftwarePaths
SoftwareResolutionVersions
Vulnerability {
Id
Severity
CvssScore
Description
}
}
pageInfo {
hasNextPage
endCursor
}
}
}Query Vulnerability Findings Only
Retrieve findings specific to vulnerabilities, excluding configuration, compliance, and entitlement findings. This use case is intended for partners focused solely on vulnerability enrichment or correlation.
Pagination limit: 100
Supported filters:
filter: {
Types: [***]
}
TipUse the
Typesfilter to focus only on vulnerability-related findings.
Example request:
query {
Findings(
filter: {
Types: [
VirtualMachineOperatingSystemUnpatchedFinding,
VirtualMachineVulnerabilityFinding
]
}
) {
nodes {
Id
Policy { Name }
Status
Remediation {
Console {
Steps
}
}
Description
Resources {
Name
... on VirtualMachine {
Vulnerabilities {
Id
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}Updated 17 days ago
