# PTSandbox Python Client

<p align="center">
<em>Full-featured async Python client for PT Sandbox instances</em>
</p>
<p align="center">
<a href="https://pypi.org/project/ptsandbox"><img src="https://badgen.net/pypi/v/ptsandbox" alt="PyPI Version"></a>
<a href="https://pypi.org/project/ptsandbox"><img src="https://badgen.net/pypi/python/ptsandbox" alt="Python Versions"></a>
<a href="https://github.com/Security-Experts-Community/py-ptsandbox/blob/main/LICENSE"><img src="https://badgen.net/github/license/Security-Experts-Community/py-ptsandbox" alt="License"></a>
</p>
---
**Documentation**: <a href="https://security-experts-community.github.io/py-ptsandbox" target="_blank">https://security-experts-community.github.io/py-ptsandbox</a>
**Source Code**: <a href="https://github.com/Security-Experts-Community/py-ptsandbox" target="_blank">https://github.com/Security-Experts-Community/py-ptsandbox</a>
---
## 📖 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
```bash
python3 -m pip install ptsandbox
```
### uv (recommended)
```bash
uv add ptsandbox
```
### Nix
```bash
# Coming soon
```
## 🔧 Requirements
- Python 3.11+
- aiohttp 3.11.15+
- pydantic 2.11.1+
- loguru 0.7.3+
## 🚀 Quick Start
### Basic File Scanning
```python
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
```python
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)
```python
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
- **[File Scanning](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/default-scan/)** — submit files of any type for analysis
- **[URL Scanning](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/scan/#url)** — check web links for threats
- **[Advanced Scanning](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/scan/#advanced-scan)** — configure analysis parameters (VM image, duration, commands)
- **[Rescan Analysis](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/rescan/)** — analyze saved traces without re-execution
- **[File Downloads](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/download-files/)** — retrieve original files and artifacts by hash
- **[System Information](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/system/)** — get version and health status
- **[Email Analysis](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/email/)** — extract and analyze email headers
- **[Source Checking](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/source/)** — specialized source file analysis
### UI API (Administrative)
- **[Token Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/api-tokens/)** — create and manage API keys
- **[Entry Points](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/entry-points/)** — configure automatic processing rules
- **[Task Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/tasks/)** — view and manage scan queue
- **[System Settings](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/system/)** — configure sandbox parameters
- **[License Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/license/)** — manage licenses and restrictions
- **[Cluster Monitoring](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/cluster/)** — monitor cluster node status
- **[Component Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/components/)** — manage system modules
- **[Download Files](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/download-files/)** — download files and artifacts via UI API
- **[Artifacts](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/artifacts/)** — work with scan results and artifacts
- **[Antivirus Engines](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/antiviruses/)** — manage AV engine integrations
- **[Queue Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/baqueue/)** — monitor and manage scan queues
- **[Authorization](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/authorization/)** — handle UI API authentication
## 🔄 Advanced Usage
### Batch Scanning
```python
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
```python
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
```python
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
```python
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}")
```
### Stream File Downloads
```python
# 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
```python
sandbox = Sandbox(
key,
proxy="http://proxy.company.com:8080"
)
```
### Custom Timeouts
```python
from aiohttp import ClientTimeout
sandbox = Sandbox(
key,
default_timeout=ClientTimeout(
total=600,
connect=60,
sock_read=300
)
)
```
### Upload Semaphore Control
```python
# 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](CONTRIBUTING.md) for detailed information.
## 📋 License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
## 📞 Support
- **Documentation**: [https://security-experts-community.github.io/py-ptsandbox](https://security-experts-community.github.io/py-ptsandbox)
- **Issues**: [GitHub Issues](https://github.com/Security-Experts-Community/py-ptsandbox/issues)
## 🙏 Acknowledgments
- **PT ESC Malware Detection** — PT Sandbox development team
- **Security Experts Community** — information security experts community
- All project contributors
---
<p align="center">
<img width="60%" src="https://raw.githubusercontent.com/Security-Experts-Community/py-ptsandbox/refs/heads/main/docs/assets/pic_right.svg">
</p>
Raw data
{
"_id": null,
"home_page": null,
"name": "ptsandbox",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.11",
"maintainer_email": null,
"keywords": "ptsandbox, sandbox",
"author": "Alexey Kolesnikov, Dmitry Zotov, PT ESC Malware Detection",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/3f/e0/192ae8080ad4f75147a3156aa4bb6f9bca554b8161bab0f656d1398a70f3/ptsandbox-5.0.5.tar.gz",
"platform": null,
"description": "# PTSandbox Python Client\n\n\n\n<p align=\"center\">\n <em>Full-featured async Python client for PT Sandbox instances</em>\n</p>\n\n<p align=\"center\">\n <a href=\"https://pypi.org/project/ptsandbox\"><img src=\"https://badgen.net/pypi/v/ptsandbox\" alt=\"PyPI Version\"></a>\n <a href=\"https://pypi.org/project/ptsandbox\"><img src=\"https://badgen.net/pypi/python/ptsandbox\" alt=\"Python Versions\"></a>\n <a href=\"https://github.com/Security-Experts-Community/py-ptsandbox/blob/main/LICENSE\"><img src=\"https://badgen.net/github/license/Security-Experts-Community/py-ptsandbox\" alt=\"License\"></a>\n</p>\n\n---\n\n**Documentation**: <a href=\"https://security-experts-community.github.io/py-ptsandbox\" target=\"_blank\">https://security-experts-community.github.io/py-ptsandbox</a>\n\n**Source Code**: <a href=\"https://github.com/Security-Experts-Community/py-ptsandbox\" target=\"_blank\">https://github.com/Security-Experts-Community/py-ptsandbox</a>\n\n---\n\n## \ud83d\udcd6 Overview\n\nPTSandbox 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.\n\n### \u2728 Key Features\n\n- **Fully Asynchronous** \u2014 all operations are performed in a non-blocking manner\n- **Fully Typed** \u2014 complete type hints support for better development experience\n- **Dual API Support** \u2014 both Public API and UI API for administrative tasks\n- **Flexible File Upload** \u2014 support for various input data formats\n- **High Performance** \u2014 optimized HTTP requests with connection pooling\n- **Error Resilience** \u2014 built-in error handling and retry logic\n- **Modern Python** \u2014 requires Python 3.11+\n\n## \ud83d\udce6 Installation\n\n### PyPI\n\n```bash\npython3 -m pip install ptsandbox\n```\n\n### uv (recommended)\n\n```bash\nuv add ptsandbox\n```\n\n### Nix\n\n```bash\n# Coming soon\n```\n\n## \ud83d\udd27 Requirements\n\n- Python 3.11+\n- aiohttp 3.11.15+\n- pydantic 2.11.1+\n- loguru 0.7.3+\n\n## \ud83d\ude80 Quick Start\n\n### Basic File Scanning\n\n```python\nimport asyncio\nfrom pathlib import Path\nfrom ptsandbox import Sandbox, SandboxKey\n\nasync def main():\n # Create connection key\n key = SandboxKey(\n name=\"test-key-1\",\n key=\"<TOKEN_FROM_SANDBOX>\",\n host=\"10.10.10.10\",\n )\n \n # Initialize client\n sandbox = Sandbox(key)\n \n # Submit file for analysis\n task = await sandbox.create_scan(Path(\"suspicious_file.exe\"))\n \n # Wait for analysis completion\n result = await sandbox.wait_for_report(task)\n \n if (report := result.get_long_report()) is not None:\n print(report.result.verdict)\n\nasyncio.run(main())\n```\n\n### URL Scanning\n\n```python\nimport asyncio\nfrom ptsandbox import Sandbox, SandboxKey\n\nasync def main():\n key = SandboxKey(\n name=\"test-key-1\", \n key=\"<TOKEN_FROM_SANDBOX>\",\n host=\"10.10.10.10\"\n )\n \n sandbox = Sandbox(key)\n \n # Scan suspicious URL\n task = await sandbox.create_url_scan(\"http://malware.com/malicious-file\")\n result = await sandbox.wait_for_report(task)\n \n if (report := result.get_long_report()) is not None:\n print(report.result.verdict)\n\nasyncio.run(main())\n```\n\n### Working with UI API (Administrative Functions)\n\n```python\nimport asyncio\nfrom ptsandbox import Sandbox, SandboxKey\n\nasync def main():\n key = SandboxKey(\n name=\"test-key-1\",\n key=\"<TOKEN_FROM_SANDBOX>\", \n host=\"10.10.10.10\",\n ui=SandboxKey.UI(\n login=\"login\",\n password=\"password\"\n )\n )\n \n sandbox = Sandbox(key)\n \n # Authorize in UI API\n await sandbox.ui.authorize()\n \n # Get system information\n system_info = await sandbox.ui.get_system_settings()\n print(f\"System version: {system_info.data}\")\n \n # Get tasks status\n tasks = await sandbox.ui.get_tasks()\n print(f\"Active tasks: {len(tasks.tasks)}\")\n\nasyncio.run(main())\n```\n\n## \ud83d\udee0\ufe0f Core Features\n\n### Public API\n\n- **[File Scanning](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/default-scan/)** \u2014 submit files of any type for analysis\n- **[URL Scanning](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/scan/#url)** \u2014 check web links for threats \n- **[Advanced Scanning](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/scan/#advanced-scan)** \u2014 configure analysis parameters (VM image, duration, commands)\n- **[Rescan Analysis](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/rescan/)** \u2014 analyze saved traces without re-execution\n- **[File Downloads](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/download-files/)** \u2014 retrieve original files and artifacts by hash\n- **[System Information](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/system/)** \u2014 get version and health status\n- **[Email Analysis](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/email/)** \u2014 extract and analyze email headers\n- **[Source Checking](https://security-experts-community.github.io/py-ptsandbox/usage/public-api/scanning/source/)** \u2014 specialized source file analysis\n\n### UI API (Administrative)\n\n- **[Token Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/api-tokens/)** \u2014 create and manage API keys\n- **[Entry Points](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/entry-points/)** \u2014 configure automatic processing rules\n- **[Task Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/tasks/)** \u2014 view and manage scan queue\n- **[System Settings](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/system/)** \u2014 configure sandbox parameters\n- **[License Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/license/)** \u2014 manage licenses and restrictions\n- **[Cluster Monitoring](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/cluster/)** \u2014 monitor cluster node status\n- **[Component Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/components/)** \u2014 manage system modules\n- **[Download Files](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/download-files/)** \u2014 download files and artifacts via UI API\n- **[Artifacts](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/artifacts/)** \u2014 work with scan results and artifacts\n- **[Antivirus Engines](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/antiviruses/)** \u2014 manage AV engine integrations\n- **[Queue Management](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/baqueue/)** \u2014 monitor and manage scan queues\n- **[Authorization](https://security-experts-community.github.io/py-ptsandbox/usage/ui-api/authorization/)** \u2014 handle UI API authentication\n\n## \ud83d\udd04 Advanced Usage\n\n### Batch Scanning\n\n```python\nimport asyncio\nfrom pathlib import Path\nfrom ptsandbox import Sandbox, SandboxKey\n\nasync def scan_multiple_files(files: list[Path]):\n sandbox = Sandbox(SandboxKey(...))\n \n # Submit all files in parallel\n tasks = []\n for file in files:\n task = await sandbox.create_scan(file, async_result=True)\n tasks.append(task)\n \n # Wait for all tasks to complete\n results = []\n for task in tasks:\n result = await sandbox.wait_for_report(task)\n results.append(result)\n \n return results\n```\n\n### Custom Scan Configuration\n\n```python\nfrom ptsandbox.models import SandboxBaseScanTaskRequest, SandboxOptions\n\n# Configure scan options\noptions = SandboxBaseScanTaskRequest.Options(\n sandbox=SandboxOptions(\n image_id=\"ubuntu-jammy-x64\", # VM image selection\n analysis_duration=300, # Analysis time in seconds\n custom_command=\"python3 {file}\", # Custom execution command\n save_video=True, # Save process video\n )\n)\n\ntask = await sandbox.create_scan(file, options=options)\n```\n\n### Advanced File Analysis\n\n```python\nfrom ptsandbox.models import SandboxOptionsAdvanced\n\n# Advanced scanning with custom rules and extra files\ntask = await sandbox.create_advanced_scan(\n Path(\"malware.exe\"),\n extra_files=[Path(\"config.ini\"), Path(\"data.txt\")], # Additional files\n sandbox=SandboxOptionsAdvanced(\n image_id=\"win10-x64\",\n analysis_duration=600,\n custom_command=\"python3 {file}\", # Custom execution command\n save_video=True, # Save process video\n mitm_enabled=True, # Enable traffic decryption\n bootkitmon=False # Disable bootkitmon analysis\n )\n)\n```\n\n### Error Handling\n\n```python\nfrom ptsandbox.models import (\n SandboxUploadException, \n SandboxWaitTimeoutException,\n SandboxTooManyErrorsException\n)\n\ntry:\n task = await sandbox.create_scan(large_file, upload_timeout=600)\n result = await sandbox.wait_for_report(task, wait_time=300)\nexcept SandboxUploadException as e:\n print(f\"Upload error: {e}\")\nexcept SandboxWaitTimeoutException as e:\n print(f\"Timeout waiting for result: {e}\")\nexcept SandboxTooManyErrorsException as e:\n print(f\"Too many errors occurred: {e}\")\n```\n\n### Stream File Downloads\n\n```python\n# Download large files as stream\nasync for chunk in sandbox.get_file_stream(\"sha256_hash\"):\n # Process chunk by chunk\n process_chunk(chunk)\n\n# Get email headers\nasync for header_chunk in sandbox.get_email_headers(email_file):\n print(header_chunk.decode())\n```\n\n## \ud83d\udd27 Configuration\n\n### Proxy Support\n\n```python\nsandbox = Sandbox(\n key, \n proxy=\"http://proxy.company.com:8080\"\n)\n```\n\n### Custom Timeouts\n\n```python\nfrom aiohttp import ClientTimeout\n\nsandbox = Sandbox(\n key,\n default_timeout=ClientTimeout(\n total=600,\n connect=60,\n sock_read=300\n )\n)\n```\n\n### Upload Semaphore Control\n\n```python\n# Limit concurrent uploads\nsandbox = Sandbox(\n key,\n upload_semaphore_size=3 # Max 3 concurrent uploads\n)\n```\n\n## \ud83e\udd1d Contributing\n\nWe welcome contributions to the project! Whether you're fixing bugs, adding features, improving documentation, or helping other users, every contribution is valuable.\n\nPlease read our [Contributing Guide](CONTRIBUTING.md) for detailed information.\n\n## \ud83d\udccb License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n## \ud83d\udcde Support\n\n- **Documentation**: [https://security-experts-community.github.io/py-ptsandbox](https://security-experts-community.github.io/py-ptsandbox)\n- **Issues**: [GitHub Issues](https://github.com/Security-Experts-Community/py-ptsandbox/issues)\n\n## \ud83d\ude4f Acknowledgments\n\n- **PT ESC Malware Detection** \u2014 PT Sandbox development team\n- **Security Experts Community** \u2014 information security experts community\n- All project contributors\n\n---\n\n<p align=\"center\">\n <img width=\"60%\" src=\"https://raw.githubusercontent.com/Security-Experts-Community/py-ptsandbox/refs/heads/main/docs/assets/pic_right.svg\">\n</p>",
"bugtrack_url": null,
"license": null,
"summary": "Async API connector for PT Sandbox instances",
"version": "5.0.5",
"project_urls": {
"Documentation": "https://security-experts-community.github.io/py-ptsandbox",
"Homepage": "https://github.com/Security-Experts-Community/py-ptsandbox",
"Issues": "https://github.com/Security-Experts-Community/py-ptsandbox/issues",
"Repository": "https://github.com/Security-Experts-Community/py-ptsandbox"
},
"split_keywords": [
"ptsandbox",
" sandbox"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "0c34b1b7af23e7a9e425fdca6f334518bc0ec4bde959d76580ce7babc5d50dfb",
"md5": "91f982f6024b0bfb12e0a7d50ffe9b04",
"sha256": "f29031e1f72ed642c490a634d83eab616ba2cc01a52a8da9f79b7e221e19a67a"
},
"downloads": -1,
"filename": "ptsandbox-5.0.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "91f982f6024b0bfb12e0a7d50ffe9b04",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.11",
"size": 63175,
"upload_time": "2025-08-01T09:28:09",
"upload_time_iso_8601": "2025-08-01T09:28:09.666046Z",
"url": "https://files.pythonhosted.org/packages/0c/34/b1b7af23e7a9e425fdca6f334518bc0ec4bde959d76580ce7babc5d50dfb/ptsandbox-5.0.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3fe0192ae8080ad4f75147a3156aa4bb6f9bca554b8161bab0f656d1398a70f3",
"md5": "f7983855faf2dcb2d44a2e4253532ac9",
"sha256": "3da97c0e7d1c3cfd9aacb66ffc3e98bcaa99b2ed5b0f77e8dc7d304595679c9f"
},
"downloads": -1,
"filename": "ptsandbox-5.0.5.tar.gz",
"has_sig": false,
"md5_digest": "f7983855faf2dcb2d44a2e4253532ac9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.11",
"size": 50556,
"upload_time": "2025-08-01T09:28:10",
"upload_time_iso_8601": "2025-08-01T09:28:10.982729Z",
"url": "https://files.pythonhosted.org/packages/3f/e0/192ae8080ad4f75147a3156aa4bb6f9bca554b8161bab0f656d1398a70f3/ptsandbox-5.0.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-01 09:28:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Security-Experts-Community",
"github_project": "py-ptsandbox",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "ptsandbox"
}