Skip to main content

scanii-python

Python SDK for the Scanii content security API.

Installation

pip install scanii-python

Distribution name is scanii-python; import as from scanii import ScaniiClient.

SDK Principles

  1. Light. Zero runtime dependencies, stdlib only.
  2. Up to date. Always current with the latest Scanii API.
  3. Integration-only. Wraps the REST API — retries, concurrency, and batching are the caller's responsibility.

Quickstart

from scanii import ScaniiClient, ScaniiTarget

client = ScaniiClient(key="your-key", secret="your-secret", target=ScaniiTarget.US1)
result = client.process_file("./document.pdf")
print(result.findings)  # [] when clean

Streaming

Pass any IO-like object (anything with read(n) -> bytes) to process() directly — no temp file needed:

import io

# Scan bytes already in memory
result = client.process(io.BytesIO(my_bytes), filename="upload.bin")

# Scan content from an open file handle
with open("./large.pdf", "rb") as f:
    result = client.process(f, filename="large.pdf")

API Reference

Constructor

ScaniiClient(
    *,
    key: str | None = None,
    secret: str | None = None,
    token: str | None = None,
    target: ScaniiTarget,
    timeout: float = 60.0,
)

Supply either key + secret (HTTP Basic Auth) or token (auth-token authentication). Mixing both raises ValueError. target is required — see Regional Endpoints.

File scanning

Method Description
process(content, filename, content_type=None, metadata=None, callback=None) Synchronous scan of an IO-like object
process_file(path, metadata=None, callback=None) Synchronous scan of a file on disk
process_async(content, filename, content_type=None, metadata=None, callback=None) Async-on-server scan of an IO-like object; returns ScaniiPendingResult
process_async_file(path, metadata=None, callback=None) Async-on-server scan of a file on disk; returns ScaniiPendingResult
retrieve(id) Retrieve a previous scan result
delete(id) Delete a scan result. Returns True; the processing trace is left intact
delete_trace(id) Delete a processing trace. Returns True; the scan result is left intact
fetch(url, metadata=None, callback=None) Server-side async fetch-and-scan of a remote URL
process_from_url(location, callback=None, metadata=None) Synchronous scan of a remote URL via POST /files
retrieve_trace(id) Retrieve processing event trace; returns None on 404

delete() and delete_trace() act on independent resources: deleting a scan result leaves its trace readable, and deleting a trace leaves the result readable. To erase a scan entirely, call both.

Auth tokens

Method Description
create_auth_token(timeout_seconds) Mint a short-lived token
retrieve_auth_token(id) Inspect a token
delete_auth_token(id) Revoke a token

Health check

Method Description
ping() Returns True when the API is reachable with valid credentials

Regional Endpoints

Choose a regional target explicitly. Six regional constants are available: US1, EU1, EU2, AP1, AP2, CA1. Latency-based routing (AUTO in other Scanii SDKs) is intentionally not provided — chain-of-custody and data-residency compliance require an explicit regional choice. For local testing against scanii-cli, construct a target with an arbitrary URL: ScaniiTarget("http://localhost:4000").

Constant URL Location
ScaniiTarget.US1 https://api-us1.scanii.com Virginia, USA
ScaniiTarget.EU1 https://api-eu1.scanii.com Dublin, Ireland
ScaniiTarget.EU2 https://api-eu2.scanii.com London, United Kingdom
ScaniiTarget.AP1 https://api-ap1.scanii.com Sydney, Australia
ScaniiTarget.AP2 https://api-ap2.scanii.com Singapore
ScaniiTarget.CA1 https://api-ca1.scanii.com Montreal, Canada
client = ScaniiClient(key="your-key", secret="your-secret", target=ScaniiTarget.EU1)

Error Handling

from scanii import ScaniiClient, ScaniiTarget, ScaniiError, ScaniiAuthError, ScaniiRateLimitError
import time

client = ScaniiClient(key="your-key", secret="your-secret", target=ScaniiTarget.US1)

try:
    result = client.process_file("./document.pdf")
except ScaniiAuthError:
    print("Invalid credentials")
except ScaniiRateLimitError as e:
    if e.retry_after:
        time.sleep(e.retry_after)
except ScaniiError as e:
    print(f"API error {e.status_code}: {e}")

Network-level failures (urllib.error.URLError) propagate unwrapped — retries are the caller's responsibility per SDK Principle 3.

Local Testing with scanii-cli

All integration tests run against a locally-hosted scanii-cli mock server — no real credentials needed.

docker run -d --name scanii-cli -p 4000:4000 ghcr.io/scanii/scanii-cli:latest server

# Run tests
pip install -e ".[dev]"
pytest
client = ScaniiClient(key="key", secret="secret", target=ScaniiTarget("http://localhost:4000"))
result = client.ping()  # True

Contributing

Pull requests welcome. Please open an issue first for substantial changes.

License

Apache 2.0 — see LICENSE.

Metadata

Release files for scanii-python 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for scanii-python 1.1.0
File Size Uploaded
scanii_python-1.1.0.tar.gz 23.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for scanii-python 1.1.0
File Interpreter ABI Platform
scanii_python-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 41.6 kB

Release files / scanii_python-1.1.0.tar.gz

Download URL scanii_python-1.1.0.tar.gz
Size 23.6 kB
Tags Source
SHA-256 checksum
How to use checksums
ae916aa81a751257b90ac175ca16a97803ea1213bd631ddce312aa01176990fe
BLAKE2b-256 checksum
How to use checksums
e7d7ece5d3da3fd896f6c6970f22939c705486e1aea3f2aee397da9b5c05aa5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release files / scanii_python-1.1.0-py3-none-any.whl

Download URL scanii_python-1.1.0-py3-none-any.whl
Size 18.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c25deaae106cbc81909399ffd1b045e8b05bc4ba653d749fc2792a532e433c27
BLAKE2b-256 checksum
How to use checksums
09345b0a300499f36d4eb118314948b150ce43f7a489f10d3c76a5efa2dc2862
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page