Full-featured async Python client for PT Sandbox instances
Documentation: https://security-experts-community.github.io/py-ptsandbox
Source Code: https://github.com/Security-Experts-Community/py-ptsandbox
PTSandbox Python Client is a modern async library for interacting with PT Sandbox through API. The library provides a convenient interface for submitting files and URLs for analysis, retrieving scan results, system management, and much more.
- Fully Asynchronous β all operations are performed in a non-blocking manner
- Fully Typed β complete type hints support for better development experience
- Dual API Support β both Public API and UI API for administrative tasks
- Flexible File Upload β support for various input data formats
- High Performance β optimized HTTP requests with connection pooling
- Error Resilience β built-in error handling and retry logic
- Modern Python β requires Python 3.11+
python3 -m pip install ptsandbox
uv add ptsandbox
# Coming soon
- Python 3.11+
- aiohttp 3.11.15+
- pydantic 2.11.1+
- loguru 0.7.3+
import asyncio
from pathlib import Path
from ptsandbox import Sandbox, SandboxKey
async def main():
# Create connection key
key = SandboxKey(
name="test-key-1",
key="<TOKEN_FROM_SANDBOX>",
host="10.10.10.10",
)
# Initialize client
sandbox = Sandbox(key)
# Submit file for analysis
task = await sandbox.create_scan(Path("suspicious_file.exe"))
# Wait for analysis completion
result = await sandbox.wait_for_report(task)
if (report := result.get_long_report()) is not None:
print(report.result.verdict)
asyncio.run(main())
import asyncio
from ptsandbox import Sandbox, SandboxKey
async def main():
key = SandboxKey(
name="test-key-1",
key="<TOKEN_FROM_SANDBOX>",
host="10.10.10.10"
)
sandbox = Sandbox(key)
# Scan suspicious URL
task = await sandbox.create_url_scan("http://malware.com/malicious-file")
result = await sandbox.wait_for_report(task)
if (report := result.get_long_report()) is not None:
print(report.result.verdict)
asyncio.run(main())
import asyncio
from ptsandbox import Sandbox, SandboxKey
async def main():
key = SandboxKey(
name="test-key-1",
key="<TOKEN_FROM_SANDBOX>",
host="10.10.10.10",
ui=SandboxKey.UI(
login="login",
password="password"
)
)
sandbox = Sandbox(key)
# Authorize in UI API
await sandbox.ui.authorize()
# Get system information
system_info = await sandbox.ui.get_system_settings()
print(f"System version: {system_info.data}")
# Get tasks status
tasks = await sandbox.ui.get_tasks()
print(f"Active tasks: {len(tasks.tasks)}")
asyncio.run(main())
- File Scanning β submit files of any type for analysis
- URL Scanning β check web links for threats
- Advanced Scanning β configure analysis parameters (VM image, duration, commands)
- Rescan Analysis β analyze saved traces without re-execution
- File Downloads β retrieve original files and artifacts by hash
- System Information β get version and health status
- Email Analysis β extract and analyze email headers
- Source Checking β specialized source file analysis
- Token Management β create and manage API keys
- Entry Points β configure automatic processing rules
- Task Management β view and manage scan queue
- System Settings β configure sandbox parameters
- License Management β manage licenses and restrictions
- Cluster Monitoring β monitor cluster node status
- Component Management β manage system modules
- Download Files β download files and artifacts via UI API
- Artifacts β work with scan results and artifacts
- Antivirus Engines β manage AV engine integrations
- Queue Management β monitor and manage scan queues
- Authorization β handle UI API authentication
import asyncio
from pathlib import Path
from ptsandbox import Sandbox, SandboxKey
async def scan_multiple_files(files: list[Path]):
sandbox = Sandbox(SandboxKey(...))
# Submit all files in parallel
tasks = []
for file in files:
task = await sandbox.create_scan(file, async_result=True)
tasks.append(task)
# Wait for all tasks to complete
results = []
for task in tasks:
result = await sandbox.wait_for_report(task)
results.append(result)
return results
from ptsandbox.models import SandboxBaseScanTaskRequest, SandboxOptions
# Configure scan options
options = SandboxBaseScanTaskRequest.Options(
sandbox=SandboxOptions(
image_id="ubuntu-jammy-x64", # VM image selection
analysis_duration=300, # Analysis time in seconds
custom_command="python3 {file}", # Custom execution command
save_video=True, # Save process video
)
)
task = await sandbox.create_scan(file, options=options)
from ptsandbox.models import SandboxOptionsAdvanced
# Advanced scanning with custom rules and extra files
task = await sandbox.create_advanced_scan(
Path("malware.exe"),
extra_files=[Path("config.ini"), Path("data.txt")], # Additional files
sandbox=SandboxOptionsAdvanced(
image_id="win10-x64",
analysis_duration=600,
custom_command="python3 {file}", # Custom execution command
save_video=True, # Save process video
mitm_enabled=True, # Enable traffic decryption
bootkitmon=False # Disable bootkitmon analysis
)
)
from ptsandbox.models import (
SandboxUploadException,
SandboxWaitTimeoutException,
SandboxTooManyErrorsException
)
try:
task = await sandbox.create_scan(large_file, upload_timeout=600)
result = await sandbox.wait_for_report(task, wait_time=300)
except SandboxUploadException as e:
print(f"Upload error: {e}")
except SandboxWaitTimeoutException as e:
print(f"Timeout waiting for result: {e}")
except SandboxTooManyErrorsException as e:
print(f"Too many errors occurred: {e}")
# Download large files as stream
async for chunk in sandbox.get_file_stream("sha256_hash"):
# Process chunk by chunk
process_chunk(chunk)
# Get email headers
async for header_chunk in sandbox.get_email_headers(email_file):
print(header_chunk.decode())
sandbox = Sandbox(
key,
proxy="http://proxy.company.com:8080"
)
from aiohttp import ClientTimeout
sandbox = Sandbox(
key,
default_timeout=ClientTimeout(
total=600,
connect=60,
sock_read=300
)
)
# Limit concurrent uploads
sandbox = Sandbox(
key,
upload_semaphore_size=3 # Max 3 concurrent uploads
)
We welcome contributions to the project! Whether you're fixing bugs, adding features, improving documentation, or helping other users, every contribution is valuable.
Please read our Contributing Guide for detailed information.
This project is licensed under the MIT License. See the LICENSE file for details.
- Documentation: https://security-experts-community.github.io/py-ptsandbox
- Issues: GitHub Issues
- PT ESC Malware Detection β PT Sandbox development team
- Security Experts Community β information security experts community
- All project contributors