diff --git a/README.md b/README.md
index 1d30bb6b..d31dd4ea 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,8 @@ Bring the VulnCheck API to your Python applications.
- [PURL](#purl)
- [CPE](#cpe)
- [Backup](#backup)
+ - [Advisory](#advisory)
+ - [Backup v4](#backup-v4)
- [Indices](#indices)
- [Index](#index)
- [Pagination](#pagination)
@@ -392,6 +394,160 @@ if __name__ == "__main__":
```
+
+
+### Advisory
+
+List all advisory feeds and query advisories filtered by feed
+
+```python
+import vulncheck_sdk
+from vulncheck_sdk.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue
+from vulncheck_sdk.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue
+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:
+ advisory_client = vulncheck_sdk.AdvisoryApi(api_client)
+
+ # List all available advisory feeds (/v4/advisory)
+ feeds: SearchV4ListFeedReturnValue = advisory_client.v4_list_advisory_feeds()
+ print(f"Available feeds: {feeds.data}")
+
+ # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi)
+ advisories: SearchV4AdvisoryReturnValue = advisory_client.v4_query_advisories(name="wolfi")
+ print(f"Wolfi advisories (page 1): {len(advisories.data)} results")
+ for advisory in advisories.data:
+ print(f" - {advisory.id}")
+```
+
+
+Click to View Async Implementation
+
+```python
+import asyncio
+import os
+import vulncheck_sdk.aio as vcaio
+from vulncheck_sdk.aio.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue
+from vulncheck_sdk.aio.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue
+
+TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
+
+configuration = vcaio.Configuration()
+configuration.api_key["Bearer"] = TOKEN
+
+
+async def main():
+ async with vcaio.ApiClient(configuration) as api_client:
+ advisory_client = vcaio.AdvisoryApi(api_client)
+
+ # List all available advisory feeds (/v4/advisory)
+ feeds: SearchV4ListFeedReturnValue = await advisory_client.v4_list_advisory_feeds()
+ print(f"Available feeds: {feeds.data}")
+
+ # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi)
+ advisories: SearchV4AdvisoryReturnValue = await advisory_client.v4_query_advisories(name="wolfi")
+ print(f"Wolfi advisories (page 1): {len(advisories.data)} results")
+ for advisory in advisories.data:
+ print(f" - {advisory.id}")
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
+```
+
+
+
+
+### Backup v4
+
+List available v4 backups and download a backup by feed name
+
+```python
+import urllib.request
+import vulncheck_sdk
+from vulncheck_sdk.models.backup_list_backups_response import BackupListBackupsResponse
+from vulncheck_sdk.models.backup_feed_item import BackupFeedItem
+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:
+ backup_client = vulncheck_sdk.BackupApi(api_client)
+
+ # List available backups (/v4/backup)
+ available: BackupListBackupsResponse = backup_client.v4_list_backups()
+ for potential in available.data:
+ print(f"found: {potential.name}")
+
+ # Get backup for the wolfi feed (/v4/backup/wolfi)
+ feed = "wolfi"
+ response = backup_client.v4_get_backup_by_name(feed)
+
+ file_path = f"{feed}.zip"
+ with urllib.request.urlopen(response.url) as r:
+ with open(file_path, "wb") as f:
+ f.write(r.read())
+
+ print(f"Successfully saved to {file_path}")
+```
+
+
+Click to View Async Implementation
+
+```python
+import asyncio
+import os
+import urllib.request
+import vulncheck_sdk.aio as vcaio
+from vulncheck_sdk.aio.models.backup_list_backups_response import BackupListBackupsResponse
+from vulncheck_sdk.aio.models.backup_backup_response import BackupBackupResponse
+
+TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
+
+configuration = vcaio.Configuration()
+configuration.api_key["Bearer"] = TOKEN
+
+
+def download_sync(url, file_path):
+ with urllib.request.urlopen(url) as response:
+ with open(file_path, "wb") as file:
+ file.write(response.read())
+
+
+async def main():
+ async with vcaio.ApiClient(configuration) as api_client:
+ backup_client = vcaio.BackupApi(api_client)
+
+ # List available backups (/v4/backup)
+ available: BackupListBackupsResponse = await backup_client.v4_list_backups()
+ for potential in available.data:
+ print(f"Found backup: {potential.name}")
+
+ # Get backup for the wolfi feed (/v4/backup/wolfi)
+ feed = "wolfi"
+ response: BackupBackupResponse = await backup_client.v4_get_backup_by_name(feed)
+
+ file_path = f"{feed}.zip"
+ print(f"Downloading {feed} backup via urllib (offloaded to thread)...")
+
+ await asyncio.to_thread(download_sync, response.url, file_path)
+
+ print(f"Successfully saved to {file_path}")
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
+```
+
+
### Indices
diff --git a/tests/advisory.py b/tests/advisory.py
new file mode 100644
index 00000000..cb5c74ed
--- /dev/null
+++ b/tests/advisory.py
@@ -0,0 +1,25 @@
+import vulncheck_sdk
+from vulncheck_sdk.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue
+from vulncheck_sdk.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue
+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:
+ advisory_client = vulncheck_sdk.AdvisoryApi(api_client)
+
+ # List all available advisory feeds (/v4/advisory)
+ feeds: SearchV4ListFeedReturnValue = advisory_client.v4_list_advisory_feeds()
+ print("Available feeds:")
+ for feed in feeds.data:
+ print(f"name: {feed.name}")
+
+ feed = "wolfi"
+ # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi)
+ advisories: SearchV4AdvisoryReturnValue = advisory_client.v4_query_advisories(name=feed)
+ print(f"{feed.capitalize()} advisories (page 1): {len(advisories.data)} results")
+ for advisory in advisories.data:
+ print(f"cve: {advisory.cve_metadata.cve_id}")
diff --git a/tests/advisory_aio.py b/tests/advisory_aio.py
new file mode 100644
index 00000000..f9964216
--- /dev/null
+++ b/tests/advisory_aio.py
@@ -0,0 +1,32 @@
+import asyncio
+import os
+import vulncheck_sdk.aio as vcaio
+from vulncheck_sdk.aio.models.search_v4_advisory_return_value import SearchV4AdvisoryReturnValue
+from vulncheck_sdk.aio.models.search_v4_list_feed_return_value import SearchV4ListFeedReturnValue
+
+TOKEN = os.environ.get("VULNCHECK_API_TOKEN")
+
+configuration = vcaio.Configuration()
+configuration.api_key["Bearer"] = TOKEN
+
+
+async def main():
+ async with vcaio.ApiClient(configuration) as api_client:
+ advisory_client = vcaio.AdvisoryApi(api_client)
+
+ # List all available advisory feeds (/v4/advisory)
+ feeds: SearchV4ListFeedReturnValue = await advisory_client.v4_list_advisory_feeds()
+ print("Available feeds:")
+ for feed in feeds.data:
+ print(f"name: {feed.name}")
+
+ feed = "wolfi"
+ # Query advisories filtered by feed=wolfi (/v4/advisory?feed=wolfi)
+ advisories: SearchV4AdvisoryReturnValue = await advisory_client.v4_query_advisories(name=feed)
+ print(f"{feed.capitalize()} advisories (page 1): {len(advisories.data)} results")
+ for advisory in advisories.data:
+ print(f"cve: {advisory.cve_metadata.cve_id}")
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
diff --git a/tests/backupv4.py b/tests/backupv4.py
new file mode 100644
index 00000000..d1e5d232
--- /dev/null
+++ b/tests/backupv4.py
@@ -0,0 +1,31 @@
+import urllib.request
+import vulncheck_sdk
+from vulncheck_sdk.models.backup_list_backups_response import BackupListBackupsResponse
+from vulncheck_sdk.models.backup_feed_item import BackupFeedItem
+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:
+ backup_client = vulncheck_sdk.BackupApi(api_client)
+
+ # List available backups (/v4/backup)
+ available: BackupListBackupsResponse = backup_client.v4_list_backups()
+
+ for potential_backup in available.data:
+ print(f"Found backup: {potential_backup.name}")
+
+ # Get backup for the wolfi feed (/v4/backup/wolfi)
+ feed = "wolfi"
+ response: BackupListBackupsResponse = backup_client.v4_get_backup_by_name(feed)
+
+ print(f"Downloading {feed} backup")
+ file_path = f"{feed}.zip"
+ with urllib.request.urlopen(response.url) as r:
+ with open(file_path, "wb") as f:
+ f.write(r.read())
+
+ print(f"Successfully saved to {file_path}")
diff --git a/tests/backupv4_aio.py b/tests/backupv4_aio.py
new file mode 100644
index 00000000..d7ac0747
--- /dev/null
+++ b/tests/backupv4_aio.py
@@ -0,0 +1,47 @@
+import asyncio
+import os
+import urllib.request
+import vulncheck_sdk.aio as vcaio
+from vulncheck_sdk.aio.models.backup_list_backups_response import BackupListBackupsResponse
+from vulncheck_sdk.aio.models.backup_backup_response import BackupBackupResponse
+
+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():
+ async with vcaio.ApiClient(configuration) as api_client:
+ backup_client = vcaio.BackupApi(api_client)
+
+ # List available backups (/v4/backup)
+ available: BackupListBackupsResponse = await backup_client.v4_list_backups()
+ for potential_backup in available.data:
+ print(f"Found backup: {potential_backup.name}")
+
+ # Get backup for the wolfi feed (/v4/backup/wolfi)
+ feed = "wolfi"
+ response: BackupBackupResponse = await backup_client.v4_get_backup_by_name(feed)
+
+
+ file_path = f"{feed}.zip"
+ print(f"Downloading {feed} backup via urllib (offloaded to thread)...")
+
+ await asyncio.to_thread(download_sync, response.url, file_path)
+
+ print(f"Successfully saved to {file_path}")
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
diff --git a/tests/readme_examples_test.py b/tests/readme_examples_test.py
index 7552201e..06d528e0 100644
--- a/tests/readme_examples_test.py
+++ b/tests/readme_examples_test.py
@@ -13,8 +13,12 @@
# List of python programs to test
PROGRAMS = [
+ "./tests/advisory.py",
+ "./tests/advisory_aio.py",
"./tests/backup.py",
+ "./tests/backupv4.py",
"./tests/backup_aio.py",
+ "./tests/backupv4_aio.py",
"./tests/cpe.py",
"./tests/cpe_aio.py",
"./tests/index.py",