Skip to content

Installation & Quick Start

Beta Release

Version 0.14.1, the latest release, is a beta release. All core features are functional and tested, but APIs may evolve before the 1.0 stable release.

Requirements

  • Python 3.11 or higher (tested on 3.11, 3.12, 3.13, 3.14)
  • pip

Installation

Access required

The SDK source is distributed under access control. The release download and git clone below resolve only for accounts that have been granted access — if yours has not, they will return "not found" rather than a permission error. Contact your Authentic8 account team to request access. Installation from PyPI is planned and will not require it.

pip install silo-sdk
# Download and extract the latest release
wget https://github.com/salesengr/silo-sdk-python/archive/refs/tags/v0.14.1.zip
unzip v0.14.1.zip
cd silo-sdk-python-0.14.1

# Create a virtual environment
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate

# Install the SDK
pip install -e .
git clone https://github.com/salesengr/silo-sdk-python.git
cd silo-sdk-python

# Create a virtual environment
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate

# Install the SDK
pip install -e .
git clone https://github.com/salesengr/silo-sdk-python.git
cd silo-sdk-python
python setup_venv.py --dev
source .venv/bin/activate

Optional Extras

Extra What it adds When to use
[decrypt] cryptography>=46.0.5 Decrypt Standard-encrypted Silo logs (EC + AES-GCM)
[legacy-decrypt] cryptography + seccure Also decrypt legacy seccure/secp256r1 logs
[mcp-server] mcp + FastAPI + uvicorn Run the MCP server for AI integration
[docs] MkDocs + Material Build this documentation site locally
pip install -e ".[decrypt]"
pip install -e ".[legacy-decrypt]"
pip install -e ".[mcp-server]"
pip install -e ".[docs]"

Verify Installation

python -c "import silo_sdk; print(silo_sdk.__version__)"

Setup Your API Tokens

Before running code, configure your API tokens. See Authentication for details on token types.

Create a .env file in your project directory:

# .env — never commit this file
A8_ADMIN_TOKEN=your-admin-token-here
A8_SYNC_TOKEN=your-sync-token-here
A8_FILE_TOKEN=your-file-token-here
A8_LOG_TOKEN=your-log-token-here
A8_SCRAPE_TOKEN=your-scrape-token-here

Copy config/default.json from the SDK to your project and load it:

from silo_sdk import load_config
config = load_config("config/default.json")

Your First API Call

Browsing Isolation

Create a Silo browsing context and get a launch URL:

from silo_sdk import BrowsingAPI

browsing = BrowsingAPI(config)  # requires ADMIN_TOKEN

# Create a context with a custom policy
context_id = browsing.create_context(
    url="https://example.com",
    username="user@company.com",
    policy=[
        {"type": "file_transfer", "params": ["block_all"]},
        {"type": "clipboard", "params": ["allow_to_local", "block_to_silo"]},
        {"type": "readonly", "params": ["false"]},
    ],
    max_uses=1,
    expires=3600,
)

# Build a launch URL for the user
launch_url = browsing.create_ctx_url(context_id)
print(f"Open in browser: {launch_url}")

# Verify the context exists
info = browsing.get_context(context_id)
print(f"Uses: {info.get('use_count', 0)} / {info.get('max_uses')}")

# Clean up
browsing.delete_context(context_id)

More Examples

User Management

from silo_sdk import UserManagementAPI

users = UserManagementAPI(config)  # requires SYNC_TOKEN

# List users in an org
user_list = users.list_users("my_org")
print(f"Found {len(user_list)} users")

# Get a specific user
user = users.get_user("jane.smith@company.com")
print(f"Status: {user.get('status')}")

# Add a new user
result = users.add_user(
    org="my_org",
    username="new.user@company.com",
    email="new.user@company.com",
    given_name="New",
    surname="User",
)
print(f"Created: {result.get('username')}")

Organization Management

from silo_sdk import OrgManagementAPI

orgs = OrgManagementAPI(config)  # requires ADMIN_TOKEN

# Get org details
org_info = orgs.get_org("my_org")
print(f"Org: {org_info.get('vanity_url')}")

# Get child orgs
children = orgs.get_org_children("my_org")
print(f"Sub-orgs: {len(children)}")

Log Extraction

from silo_sdk import LogExtractionAPI

logs = LogExtractionAPI(config)  # requires LOG_TOKEN

# Check available log sequence range
seq_info = logs.get_log_sequence_info("my_org")
start_seq = seq_info.get("min_seq", 0)
print(f"Starting sequence: {start_seq}")

# Extract AUTH logs starting from min_seq
records = logs.extract_logs(
    org="my_org",
    start_seq=start_seq,
    log_types=["AUTH"],
    limit=100,
)
print(f"Extracted {len(records)} log entries")

# Export to CSV (uses per-type field schemas)
logs.export_logs_to_file(
    org="my_org",
    output_path="auth_logs.csv",
    log_types=["AUTH"],
    output_format="csv",
)

File Storage

from silo_sdk import FileAPI

files = FileAPI(config)  # requires FILE_TOKEN

# Upload a file
result = files.upload_file(
    bucket_id="my-bucket",
    file_path="report.pdf",
    name="monthly_report.pdf",
)
file_id = result.get("file_id")
print(f"Uploaded: {file_id}")

# Search for it
found = files.find_files(bucket_id="my-bucket", name="monthly_report.pdf")
print(f"Found {len(found)} files")

# Download it
files.download_file(file_id=file_id, output_path="downloaded_report.pdf")

# Delete it
files.delete_file(file_id=file_id)

Web Harvesting

from silo_sdk import HarvesterAPI

harvester = HarvesterAPI(config)  # requires SCRAPE_TOKEN

# Create a visual harvest task
task_id = harvester.create_harvest_task(
    task_type="visual",      # valid types: "visual", "asset", "video", "single"
    urls=["https://example.com"],
    egress_info={"name": "New York, NY"},
    dest_path="/screenshots/",
    dest_name="example_screenshot",
    dest_bucket_id="my-bucket",
)
print(f"Task created: {task_id}")

# Poll until complete
import time
for _ in range(10):
    status = harvester.find_harvest_task(task_id)
    if status.get("status") in ("done", "error"):
        break
    time.sleep(5)

print(f"Final status: {status.get('status')}")

Next Steps