Skip to main content

Official Python SDK for QuantumAPI - Quantum-safe encryption and identity platform

Project description

QuantumAPI Python SDK

PyPI version Python Support License Documentation

Official Python SDK for QuantumAPI - The European quantum-safe encryption and identity platform.

Features

  • 🔐 Quantum-Safe Encryption - ML-KEM-768, ML-DSA-65, and hybrid encryption
  • 🔑 Key Management - Generate, rotate, and manage cryptographic keys
  • 🗄️ Secret Vault - Securely store and manage secrets with versioning
  • 👤 User Management - Create and manage end-users with roles
  • 🔍 Audit Logs - Query comprehensive audit trails
  • 💳 Billing Integration - Access subscription and usage metrics
  • 🚀 Async/Await Support - Full async support with httpx
  • Automatic Retries - Exponential backoff for transient failures
  • 📊 Rate Limiting - Client-side rate limit tracking
  • 🎯 Type Safety - Complete type hints with Pydantic models

Installation

pip install quantumapi

For development:

pip install quantumapi[dev]

Quick Start

from quantumapi import QuantumAPIClient

# Initialize client with API key
client = QuantumAPIClient(api_key="qapi_xxx")

# Encrypt data
ciphertext = await client.encryption.encrypt(
    plaintext="secret data",
    key_id="550e8400-e29b-41d4-a716-446655440000"
)

# Store a secret
secret = await client.secrets.create(
    name="database_password",
    value="super_secret_password",
    labels=["production", "database"]
)

# Generate a new key pair
key = await client.keys.generate(
    name="encryption-key-2024",
    algorithm="ML-KEM-768",
    key_type="encryption"
)

# Retrieve secret
secret_value = await client.secrets.get(secret.id)
print(f"Secret: {secret_value.value}")

Synchronous API

If you prefer synchronous code, use the QuantumAPISyncClient:

from quantumapi import QuantumAPISyncClient

client = QuantumAPISyncClient(api_key="qapi_xxx")

# All methods work the same without await
ciphertext = client.encryption.encrypt(plaintext="secret data")

Configuration

The SDK can be configured via environment variables or constructor arguments:

client = QuantumAPIClient(
    api_key="qapi_xxx",              # Or set QUANTUMAPI_API_KEY
    base_url="https://api.quantumapi.eu",  # Optional, defaults to production
    timeout=30.0,                     # Request timeout in seconds
    max_retries=3,                    # Max retry attempts for failed requests
    enable_logging=True,              # Enable detailed logging
)

Environment Variables

  • QUANTUMAPI_API_KEY - Your API key
  • QUANTUMAPI_BASE_URL - API base URL (default: https://api.quantumapi.eu)
  • QUANTUMAPI_TIMEOUT - Request timeout in seconds (default: 30)
  • QUANTUMAPI_MAX_RETRIES - Maximum retry attempts (default: 3)

Core Modules

Encryption Client

# Encrypt data
result = await client.encryption.encrypt(
    plaintext="sensitive data",
    key_id="key-id",  # Optional, uses default key if not specified
    encoding="utf8"   # or "base64" for binary data
)

# Decrypt data
plaintext = await client.encryption.decrypt(
    encrypted_payload=result.encrypted_payload
)

# Sign data
signature = await client.encryption.sign(
    data="message to sign",
    key_id="signing-key-id"
)

# Verify signature
is_valid = await client.encryption.verify(
    data="message to sign",
    signature=signature.signature,
    key_id="signing-key-id"
)

Keys Client

# Generate key pair
key = await client.keys.generate(
    name="my-encryption-key",
    key_type="encryption",
    algorithm="ML-KEM-768",
    set_as_default=True
)

# List keys
keys = await client.keys.list(
    key_type="encryption",
    page=1,
    page_size=50
)

# Get key details
key = await client.keys.get(key_id="key-id")

# Rotate key
new_key = await client.keys.rotate(key_id="key-id")

# Delete key
await client.keys.delete(key_id="key-id")

# Set default key
await client.keys.set_default(key_id="key-id", key_type="encryption")

Secrets Client

# Create secret
secret = await client.secrets.create(
    name="api-key",
    value="secret_value",
    content_type="api-key",
    labels=["prod", "stripe"],
    expires_at="2025-12-31T23:59:59Z"
)

# List secrets
secrets = await client.secrets.list(
    content_type="password",
    label="production",
    page=1
)

# Get secret
secret = await client.secrets.get(secret_id="secret-id")

# Update secret value
await client.secrets.update_value(
    secret_id="secret-id",
    value="new_secret_value"
)

# Update secret metadata
await client.secrets.update(
    secret_id="secret-id",
    name="new-name",
    labels=["staging"]
)

# Delete secret
await client.secrets.delete(secret_id="secret-id")

Users Client

# Create user
user = await client.users.create(
    email="user@example.com",
    name="John Doe",
    role="developer"
)

# List users
users = await client.users.list(active_only=True)

# Update user
await client.users.update(
    user_id="user-id",
    name="Jane Doe",
    role="admin"
)

# Deactivate user
await client.users.deactivate(user_id="user-id")

Applications Client

# Create OIDC application
app = await client.applications.create(
    name="My App",
    redirect_uris=["https://myapp.com/callback"],
    scopes=["openid", "profile", "email"]
)

# List applications
apps = await client.applications.list()

# Update application
await client.applications.update(
    app_id="app-id",
    redirect_uris=["https://myapp.com/callback", "https://myapp.com/callback2"]
)

Audit Client

# Query audit logs
logs = await client.audit.list(
    action="secret_accessed",
    resource_type="Secret",
    start_date="2024-01-01",
    end_date="2024-12-31",
    page=1
)

# Export audit logs
csv_data = await client.audit.export(
    format="csv",
    start_date="2024-01-01",
    end_date="2024-12-31"
)

Billing Client

# Get subscription details
subscription = await client.billing.get_subscription()

# Get usage metrics
usage = await client.billing.get_usage(
    start_date="2024-01-01",
    end_date="2024-01-31"
)

# List invoices
invoices = await client.billing.list_invoices()

Health Client

# Check API health
health = await client.health.check()
print(f"API Status: {health.status}")

# Get API version
version = await client.health.version()
print(f"API Version: {version.version}")

# Get rate limit status
rate_limit = await client.health.rate_limit()
print(f"Remaining: {rate_limit.remaining}/{rate_limit.limit}")

Error Handling

The SDK provides typed exceptions for all error scenarios:

from quantumapi import (
    QuantumAPIClient,
    AuthenticationError,
    PermissionError,
    NotFoundError,
    RateLimitError,
    ValidationError,
    ServerError,
    NetworkError,
)

try:
    secret = await client.secrets.get("invalid-id")
except NotFoundError as e:
    print(f"Secret not found: {e.message}")
except AuthenticationError as e:
    print(f"Authentication failed: {e.message}")
except RateLimitError as e:
    print(f"Rate limit exceeded. Retry after {e.retry_after} seconds")
except ServerError as e:
    print(f"Server error: {e.message}")
except NetworkError as e:
    print(f"Network error: {e.message}")

Pagination

List methods support automatic pagination:

# Manual pagination
secrets = await client.secrets.list(page=1, page_size=100)

# Iterate through all pages
all_secrets = []
page = 1
while True:
    result = await client.secrets.list(page=page, page_size=100)
    all_secrets.extend(result.secrets)
    if not result.has_more:
        break
    page += 1

Webhook Verification

Verify webhook signatures from QuantumAPI:

from quantumapi.webhooks import verify_signature

# Verify webhook payload
is_valid = verify_signature(
    payload=request.body,
    signature=request.headers["X-QuantumAPI-Signature"],
    secret="your_webhook_secret"
)

if is_valid:
    # Process webhook event
    pass

Logging

Enable detailed logging for debugging:

import logging

logging.basicConfig(level=logging.DEBUG)

client = QuantumAPIClient(
    api_key="qapi_xxx",
    enable_logging=True
)

Examples

Check out the examples/ directory for more comprehensive examples:

Framework Integrations

Django

pip install quantumapi[django]
# settings.py
QUANTUMAPI = {
    'API_KEY': 'qapi_xxx',
    'BASE_URL': 'https://api.quantumapi.eu',
}

# Use in views
from quantumapi.integrations.django import get_client

async def my_view(request):
    client = get_client()
    secret = await client.secrets.get('secret-id')
    return JsonResponse({'value': secret.value})

Flask

pip install quantumapi[flask]
from flask import Flask
from quantumapi.integrations.flask import QuantumAPIFlask

app = Flask(__name__)
app.config['QUANTUMAPI_API_KEY'] = 'qapi_xxx'
qapi = QuantumAPIFlask(app)

@app.route('/secret/<secret_id>')
async def get_secret(secret_id):
    secret = await qapi.secrets.get(secret_id)
    return {'value': secret.value}

Testing

Run tests:

pytest

Run tests with coverage:

pytest --cov=quantumapi --cov-report=html

Development

# Clone repository
git clone https://github.com/quantumapi/quantumapi-python
cd quantumapi-python

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Format code
black quantumapi tests
isort quantumapi tests

# Type checking
mypy quantumapi

# Linting
flake8 quantumapi tests

Requirements

  • Python 3.9 or higher
  • httpx >= 0.27.0
  • pydantic >= 2.0.0
  • python-dotenv >= 1.0.0
  • cryptography >= 42.0.0

License

MIT License - see LICENSE file for details.

Support

Contributing

Contributions are welcome! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.

Changelog

See CHANGELOG.md for a history of changes to this SDK.

Security

For security concerns, please email security@quantumapi.eu. Do not create public issues for security vulnerabilities.

Links

Project details


Download files

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

Source Distribution

quantumapi-0.1.0b0.tar.gz (24.5 kB view details)

Uploaded Source

Built Distribution

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

quantumapi-0.1.0b0-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file quantumapi-0.1.0b0.tar.gz.

File metadata

  • Download URL: quantumapi-0.1.0b0.tar.gz
  • Upload date:
  • Size: 24.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for quantumapi-0.1.0b0.tar.gz
Algorithm Hash digest
SHA256 46a006b2d0f2da1558f4522224f1b8f5f8718be468fd6d45ddaade1b8593fa51
MD5 a001878f7962b8b525eba504c615663b
BLAKE2b-256 deaed8799c9aaae50ed891e31f3cbd8cb12eb5ba2c867865e4d48a570c737d9c

See more details on using hashes here.

File details

Details for the file quantumapi-0.1.0b0-py3-none-any.whl.

File metadata

  • Download URL: quantumapi-0.1.0b0-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for quantumapi-0.1.0b0-py3-none-any.whl
Algorithm Hash digest
SHA256 219ea702270ed5ec1dc940b5135c3c84fc2a272054bc712c96cd5a11923e0f3c
MD5 2f088e769cf994bda6d96ebcc2d5177c
BLAKE2b-256 701914708e577bcba849e3eaf29e6c11b18ae6b58c1cb966d2aaa7922a81ee64

See more details on using hashes here.

Supported by

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