Skip to main content

PTSandbox Python Client

PTSandbox Logo

Full-featured async Python client for PT Sandbox instances

PyPI Version Python Versions License


Documentation: https://security-experts-community.github.io/py-ptsandbox

Source Code: https://github.com/Security-Experts-Community/py-ptsandbox


📖 Overview

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.

✨ Key Features

  • 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+

📦 Installation

PyPI

python3 -m pip install ptsandbox

uv (recommended)

uv add ptsandbox

Nix

# Coming soon

🔧 Requirements

  • python 3.11+
  • aiohttp 3.14.1+
  • pydantic 2.13.4+
  • orjson 3.11.9+
  • aiohttp-socks 0.11.0+

🚀 Quick Start

Basic File Scanning

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())

URL Scanning

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())

Working with UI API (Administrative Functions)

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())

🛠️ Core Features

Public API

UI API (Administrative)

🔄 Advanced Usage

Batch Scanning

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

Custom Scan Configuration

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)

Advanced File Analysis

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
    )
)

Error Handling

from ptsandbox.exceptions 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}")

Stream File Downloads

# 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())

🔧 Configuration

Proxy Support

sandbox = Sandbox(
    key,
    proxy="http://proxy.company.com:8080"
)

Custom Timeouts

from aiohttp import ClientTimeout

sandbox = Sandbox(
    key,
    default_timeout=ClientTimeout(
        total=600,
        connect=60,
        sock_read=300
    )
)

Upload Semaphore Control

# Limit concurrent uploads
sandbox = Sandbox(
    key,
    upload_semaphore_size=3  # Max 3 concurrent uploads
)

🤝 Contributing

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.

📋 License

This project is licensed under the MIT License. See the LICENSE file for details.

📞 Support

🙏 Acknowledgments

  • PT ESC Malware Detection — PT Sandbox development team
  • Security Experts Community — information security experts community
  • All project contributors

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ptsandbox-5.1.2.tar.gz (58.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ptsandbox-5.1.2-py3-none-any.whl (78.7 kB view details)

Uploaded Python 3

File details

Details for the file ptsandbox-5.1.2.tar.gz.

File metadata

  • Download URL: ptsandbox-5.1.2.tar.gz
  • Upload date:
  • Size: 58.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.7

File hashes

Hashes for ptsandbox-5.1.2.tar.gz
Algorithm Hash digest
SHA256 1ad1981feac45384bf5ac5f396f9003b336147950ab09366eac831a47eb491cd
MD5 d0653ae0dd6f669231f6b3c81118b8fc
BLAKE2b-256 e2aa93639767f872eff839df3fccccaf5cdcf7595fd286a4c6b82d43a37eda70

See more details on using hashes here.

File details

Details for the file ptsandbox-5.1.2-py3-none-any.whl.

File metadata

  • Download URL: ptsandbox-5.1.2-py3-none-any.whl
  • Upload date:
  • Size: 78.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.7

File hashes

Hashes for ptsandbox-5.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 cee853dc8a5b7f3dc5fed33603fd8a6ffeb54235a1186139331a4310c146f55c
MD5 257fe513649077fd32c328805c11ff4d
BLAKE2b-256 b248af2aa67f0431e2b6026da777587ed8eab5d67191c21f8f1a774bc154f3ef

See more details on using hashes here.

Release history Release notifications | RSS feed

5.1.5

2 files

5.1.4

2 files

5.1.3

2 files

This release

5.1.2 This release

2 files

5.1.1

2 files

5.1.0

2 files

5.0.14

2 files

5.0.13

2 files

5.0.12

2 files

5.0.11

2 files

5.0.10

2 files

5.0.9

2 files

5.0.8

2 files

5.0.7

2 files

5.0.6

2 files

5.0.5

2 files

5.0.4

2 files

5.0.3

2 files

5.0.2

2 files

5.0.1

2 files

5.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page