VulnCheck API
Project description
The VulnCheck SDK For Python
Bring the VulnCheck API to your Python applications.
Installation
# From PyPi
pip install vulncheck-sdk
[!IMPORTANT] Windows users may need to enable Long Path Support
Resources
Quickstart
import urllib.request
import vulncheck_sdk
import os
# First let's setup a few variables to help us
TOKEN = os.environ["VULNCHECK_API_TOKEN"] # Remember to store your token securely!
# Now let's create a configuration object
configuration = vulncheck_sdk.Configuration()
configuration.api_key["Bearer"] = TOKEN
# Pass that config object to our API client and now...
with vulncheck_sdk.ApiClient(configuration) as api_client:
# We can use two classes to explore the VulnCheck API: EndpointsApi & IndicesApi
### EndpointsApi has methods to query every endpoint except `/v3/index`
# See the full list of endpoints here: https://docs.vulncheck.com/api
endpoints_client = vulncheck_sdk.EndpointsApi(api_client)
# PURL
api_response = endpoints_client.purl_get("pkg:hex/coherence@0.1.2")
data = V3controllersPurlResponseData = api_response.data
print(data.cves)
# CPE
cpe = "cpe:/a:microsoft:internet_explorer:8.0.6001:beta"
api_response = endpoints_client.cpe_get(cpe)
for cve in api_response.data:
print(cve)
# Download a Backup
index = "initial-access"
api_response = endpoints_client.backup_index_get(index)
file_path = f"{index}.zip"
with urllib.request.urlopen(api_response.data[0].url) as response:
with open(file_path, "wb") as file:
file.write(response.read())
### IndicesApi has methods for each index
indices_client = vulncheck_sdk.IndicesApi(api_client)
# Add query parameters to filter what you need
api_response = indices_client.index_vulncheck_nvd2_get(cve="CVE-2019-19781")
print(api_response.data)
Click to View Async Implementation
import asyncio
import os
import aiohttp
import vulncheck_sdk.aio as vcaio
# Configuration
TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
configuration = vcaio.Configuration()
configuration.api_key["Bearer"] = TOKEN
async def run_vulnerability_checks():
# Use 'async with' to manage the ApiClient connection pool
async with vcaio.ApiClient(configuration) as api_client:
endpoints_client = vcaio.EndpointsApi(api_client)
indices_client = vcaio.IndicesApi(api_client)
# --- PURL Search ---
# 'await' the coroutine to get results
purl_response = await endpoints_client.purl_get("pkg:hex/coherence@0.1.2")
if purl_response.data:
print(f"PURL CVEs: {purl_response.data.cves}")
# --- CPE Search ---
cpe = "cpe:/a:microsoft:internet_explorer:8.0.6001:beta"
# 'await' the coroutine to get results
cpe_response = await endpoints_client.cpe_get(cpe)
print(f"CPE Results for {cpe}:")
for cve in cpe_response.data:
print(f" - {cve}")
# --- Index Query (NVD2) ---
# 'await' the coroutine to get results
nvd_response = await indices_client.index_vulncheck_nvd2_get(
cve="CVE-2019-19781"
)
print(f"NVD2 Data: {nvd_response.data}")
# --- Download Backup (Async) ---
index_name = "initial-access"
# 'await' the coroutine to get results
backup_response = await endpoints_client.backup_index_get(index_name)
if backup_response.data:
download_url = backup_response.data[0].url
file_path = f"{index_name}.zip"
print(f"Downloading backup from {download_url}...")
# Use aiohttp (already in your environment) for async download
async with aiohttp.ClientSession() as session:
async with session.get(download_url) as resp:
if resp.status == 200:
# 'await' the coroutine to get results
content = await resp.read()
with open(file_path, "wb") as f:
f.write(content)
print(f"Saved backup to {file_path}")
if __name__ == "__main__":
# Entry point to start the event loop
asyncio.run(run_vulnerability_checks())
Examples
PURL
Get the CVE's for a given PURL
import vulncheck_sdk
from vulncheck_sdk.models.v3controllers_purl_response_data import (
V3controllersPurlResponseData,
)
import os
TOKEN = os.environ["VULNCHECK_API_TOKEN"]
configuration = vulncheck_sdk.Configuration()
configuration.api_key["Bearer"] = TOKEN
with vulncheck_sdk.ApiClient(configuration) as api_client:
endpoints_client = vulncheck_sdk.EndpointsApi(api_client)
purl = "pkg:hex/coherence@0.1.2"
api_response = endpoints_client.purl_get(purl)
data: V3controllersPurlResponseData = api_response.data
print(data.cves)
Click to View Async Implementation
import asyncio
import os
import vulncheck_sdk.aio as vcaio
from vulncheck_sdk.aio.models.v3controllers_purl_response_data import (
V3controllersPurlResponseData,
)
# Configuration
TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
configuration = vcaio.Configuration()
configuration.api_key["Bearer"] = TOKEN
async def get_data(client, purl: str):
# Await the client call directly
api_response = await client.purl_get(purl)
# Access the data attribute from the response object
return api_response.data
async def main():
async with vcaio.ApiClient(configuration) as api_client:
endpoints_client = vcaio.EndpointsApi(api_client)
purl = "pkg:hex/coherence@0.1.2"
# 'await' the async function call
data: V3controllersPurlResponseData = await get_data(endpoints_client, purl)
if data and data.cves:
print(f"Found {len(data.cves)} CVEs:")
for cve in data.cves:
print(f"- {cve}")
else:
print("No CVEs found or data is empty.")
if __name__ == "__main__":
asyncio.run(main())
CPE
Get all CPE's related to a CVE
import vulncheck_sdk
import os
TOKEN = os.environ["VULNCHECK_API_TOKEN"]
configuration = vulncheck_sdk.Configuration()
configuration.api_key["Bearer"] = TOKEN
with vulncheck_sdk.ApiClient(configuration) as api_client:
endpoints_client = vulncheck_sdk.EndpointsApi(api_client)
cpe = "cpe:/a:microsoft:internet_explorer:8.0.6001:beta"
api_response = endpoints_client.cpe_get(cpe)
for cve in api_response.data:
print(cve)
Click to View Async Implementation
import asyncio
import os
import vulncheck_sdk.aio as vcaio
# Configuration
TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
configuration = vcaio.Configuration()
configuration.api_key["Bearer"] = TOKEN
async def get_cpe_vulnerabilities():
# 'async with' to manage the connection life-cycle
async with vcaio.ApiClient(configuration) as api_client:
endpoints_client = vcaio.EndpointsApi(api_client)
cpe = "cpe:/a:microsoft:internet_explorer:8.0.6001:beta"
# 'await' the coroutine to get the actual response data
api_response = await endpoints_client.cpe_get(cpe)
# Iterate through the results
if api_response.data:
for cve in api_response.data:
print(cve)
else:
print(f"No vulnerabilities found for CPE: {cpe}")
if __name__ == "__main__":
# Run the main async entry point
asyncio.run(get_cpe_vulnerabilities())
Backup
Download the backup for an index
import urllib.request
import vulncheck_sdk
import os
TOKEN = os.environ["VULNCHECK_API_TOKEN"]
configuration = vulncheck_sdk.Configuration()
configuration.api_key["Bearer"] = TOKEN
with vulncheck_sdk.ApiClient(configuration) as api_client:
endpoints_client = vulncheck_sdk.EndpointsApi(api_client)
index = "initial-access"
api_response = endpoints_client.backup_index_get(index)
file_path = f"{index}.zip"
with urllib.request.urlopen(api_response.data[0].url) as response:
with open(file_path, "wb") as file:
file.write(response.read())
Click to View Async Implementation
import asyncio
import os
import urllib.request
import vulncheck_sdk.aio as vcaio
# Configuration
TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
configuration = vcaio.Configuration()
configuration.api_key["Bearer"] = TOKEN
def download_sync(url, file_path):
"""
Standard synchronous download using urllib.request.
This runs in a separate thread to avoid blocking the event loop.
"""
with urllib.request.urlopen(url) as response:
with open(file_path, "wb") as file:
file.write(response.read())
async def main():
# Use 'async with' to manage the connection life-cycle
async with vcaio.ApiClient(configuration) as api_client:
endpoints_client = vcaio.EndpointsApi(api_client)
index = "initial-access"
# 'await' the coroutine to get the actual response data
api_response = await endpoints_client.backup_index_get(index)
if not api_response.data:
print("No backup URL found.")
return
download_url = api_response.data[0].url
file_path = f"{index}.zip"
print(f"Downloading {index} via urllib (offloaded to thread)...")
# Use asyncio.to_thread to run the blocking call safely
# 'await' the coroutine to get the actual response data
await asyncio.to_thread(download_sync, download_url, file_path)
print(f"Successfully saved to {file_path}")
if __name__ == "__main__":
asyncio.run(main())
Indices
Get all available indices
import vulncheck_sdk
import os
TOKEN = os.environ["VULNCHECK_API_TOKEN"]
configuration = vulncheck_sdk.Configuration()
configuration.api_key["Bearer"] = TOKEN
with vulncheck_sdk.ApiClient(configuration) as api_client:
endpoints_client = vulncheck_sdk.EndpointsApi(api_client)
api_response = endpoints_client.index_get()
for index in api_response.data:
print(index.name)
Click to View Async Implementation
import asyncio
import os
import vulncheck_sdk.aio as vcaio
# Configuration
TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
configuration = vcaio.Configuration()
configuration.api_key["Bearer"] = TOKEN
async def list_indices():
# Use 'async with' to manage the connection life-cycle
async with vcaio.ApiClient(configuration) as api_client:
endpoints_client = vcaio.EndpointsApi(api_client)
# 'await' the coroutine to get the actual response
api_response = await endpoints_client.index_get()
# Iterate through the results
if api_response.data:
print(f"{'Index Name':<30} | {'Description'}")
print("-" * 50)
for index in api_response.data:
print(f"{index.name:<30}")
else:
print("No indices found.")
if __name__ == "__main__":
# 4. Entry point to run the asynchronous event loop
asyncio.run(list_indices())
Index
Query VulnCheck-NVD2 for CVE-2019-19781
import vulncheck_sdk
import os
TOKEN = os.environ["VULNCHECK_API_TOKEN"]
configuration = vulncheck_sdk.Configuration()
configuration.api_key["Bearer"] = TOKEN
with vulncheck_sdk.ApiClient(configuration) as api_client:
indices_client = vulncheck_sdk.IndicesApi(api_client)
api_response = indices_client.index_vulncheck_nvd2_get(cve="CVE-2019-19781")
print(api_response.data)
Click to View Async Implementation
import asyncio
import os
import vulncheck_sdk.aio as vcaio
# Configuration
TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
configuration = vcaio.Configuration()
configuration.api_key["Bearer"] = TOKEN
async def get_cve_details():
# Use 'async with' for the ApiClient
async with vcaio.ApiClient(configuration) as api_client:
indices_client = vcaio.IndicesApi(api_client)
# 'await' the API call
api_response = await indices_client.index_vulncheck_nvd2_get(
cve="CVE-2019-19781"
)
# Access and print the data
if api_response.data:
print(api_response.data)
else:
print("No data found for the specified CVE.")
if __name__ == "__main__":
# Start the async event loop
asyncio.run(get_cve_details())
Pagination
Paginate over results for a query to VulnCheck-KEV using cursor
import vulncheck_sdk
import os
TOKEN = os.environ["VULNCHECK_API_TOKEN"]
configuration = vulncheck_sdk.Configuration()
configuration.api_key["Bearer"] = TOKEN
with vulncheck_sdk.ApiClient(configuration) as api_client:
indices_client = vulncheck_sdk.IndicesApi(api_client)
api_response = indices_client.index_vulncheck_kev_get(
start_cursor="true",
# `limit` increases the size of each page, making it faster
# to download large datasets
limit=300,
)
print(api_response.data)
while api_response.meta.next_cursor is not None:
api_response = indices_client.index_vulncheck_kev_get(
cursor=api_response.meta.next_cursor
)
print(api_response.data)
Click to View Async Implementation
import asyncio
import os
import vulncheck_sdk.aio as vcaio
# Configuration
TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
configuration = vcaio.Configuration()
configuration.api_key["Bearer"] = TOKEN
async def fetch_kev_data():
# Use 'async with' to properly manage the lifecycle of the async client
async with vcaio.ApiClient(configuration) as api_client:
indices_client = vcaio.IndicesApi(api_client)
# 'await' the coroutine to get the actual response data
api_response = await indices_client.index_vulncheck_kev_get(
start_cursor="true", limit=300
)
print(f"Fetched {len(api_response.data)} records...")
# Process initial data
# (e.g., save to a list or database)
# Pagination loop
while api_response.meta and api_response.meta.next_cursor:
print(f"Fetching next page: {api_response.meta.next_cursor}")
# 'await' the coroutine to get the actual response data
api_response = await indices_client.index_vulncheck_kev_get(
cursor=api_response.meta.next_cursor, limit=300
)
if api_response.data:
print(f"Fetched {len(api_response.data)} records...")
else:
break
if __name__ == "__main__":
# Entry point to run the async event loop
asyncio.run(fetch_kev_data())
Contributing
Please see CONTRIBUTING for details.
Security
If you discover any security related issues, please create an issue.
Sponsorship
Development of this project is sponsored by VulnCheck learn more about us!
License
Apache License 2.0. Please see License File for more information.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vulncheck_sdk-0.0.44.tar.gz.
File metadata
- Download URL: vulncheck_sdk-0.0.44.tar.gz
- Upload date:
- Size: 1.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91217451ae8a13d50f59cc017994af28e3ebe50f0b89755834ae9a31bd4e3f91
|
|
| MD5 |
e806083ed7194c0523cfd412d2b9ee1c
|
|
| BLAKE2b-256 |
ae28a7cf33c2e8d46bfa772dfc36aa68e3ba07c58065b08681716fb55091fd0c
|
Provenance
The following attestation bundles were made for vulncheck_sdk-0.0.44.tar.gz:
Publisher:
release.yml on vulncheck-oss/sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vulncheck_sdk-0.0.44.tar.gz -
Subject digest:
91217451ae8a13d50f59cc017994af28e3ebe50f0b89755834ae9a31bd4e3f91 - Sigstore transparency entry: 1200127825
- Sigstore integration time:
-
Permalink:
vulncheck-oss/sdk-python@db65e69fbddf5c66c21aaae358bc936257643393 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/vulncheck-oss
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@db65e69fbddf5c66c21aaae358bc936257643393 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vulncheck_sdk-0.0.44-py3-none-any.whl.
File metadata
- Download URL: vulncheck_sdk-0.0.44-py3-none-any.whl
- Upload date:
- Size: 5.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2284809664a7a6f0866873c0605a82523c595655a1da11157fd53568a8c551ec
|
|
| MD5 |
8ed2fa3991a51346f43deff4085df229
|
|
| BLAKE2b-256 |
70470ee135fc4cda60519c567451534f077d74456ad054d107bc05a43abeda21
|
Provenance
The following attestation bundles were made for vulncheck_sdk-0.0.44-py3-none-any.whl:
Publisher:
release.yml on vulncheck-oss/sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vulncheck_sdk-0.0.44-py3-none-any.whl -
Subject digest:
2284809664a7a6f0866873c0605a82523c595655a1da11157fd53568a8c551ec - Sigstore transparency entry: 1200127830
- Sigstore integration time:
-
Permalink:
vulncheck-oss/sdk-python@db65e69fbddf5c66c21aaae358bc936257643393 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/vulncheck-oss
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@db65e69fbddf5c66c21aaae358bc936257643393 -
Trigger Event:
push
-
Statement type: