optropic
Official Python SDK for Optropic product authentication.
Features
- Simple Authentication - Single API key for all operations
- Type-Safe - Full type annotations with
py.typedsupport - Fast Integration - Copy-paste quickstart, production-ready
- Vertical Agnostic - Same API for pharma, luxury, art, and more
- Error Transparency - Clear error codes, actionable messages
Installation
pip install optropic
Quick Start
from optropic import OptropicClient
# Initialize the client
client = OptropicClient(api_key="op_live_xxxxxxxxxxxx")
# Verify an asset
result = client.verify("asset-id-or-short-id")
if result.signature_valid:
print("Product is genuine!")
print(f"Security level: {result.security_level}")
else:
print("Warning: verification failed")
# Or use as a context manager
with OptropicClient(api_key="op_live_xxxxxxxxxxxx") as client:
result = client.verify("asset-id-or-short-id")
print(result.status)
API Reference
OptropicClient
The main client class for all SDK operations.
Constructor
client = OptropicClient(
api_key="op_live_xxx", # Required: Your API key
base_url="https://...", # Optional: For self-hosted deployments
timeout=30.0, # Optional: Request timeout in seconds (default: 30)
)
Methods
verify(asset_id: str) -> VerifyResult
Verify an asset by ID or short_id.
result = client.verify("asset-id-or-short-id")
# Result fields
result.id # str: Asset ID
result.status # str: Verification status
result.security_level # str: 'signed', 'sealed', etc.
result.signature_valid # bool: Whether signature is valid
result.verification_count # int: Number of times verified
result.last_verified_at # str: ISO timestamp of last verification
result.revocation_status # str: 'active' or 'revoked'
result.verification_mode # str: 'online' or 'offline'
result.provenance_valid # Optional[bool]: Provenance chain validity
result.evidence # Optional[VerificationEvidence]: Detailed evidence
Error Handling
All errors extend OptropicError with clear error codes:
from optropic import (
OptropicClient,
OptropicError,
AuthenticationError,
NotFoundError,
)
try:
result = client.verify("asset-id")
except NotFoundError:
print("Asset not found in system.")
except AuthenticationError:
print("Invalid API key.")
except OptropicError as e:
print(f"Error {e.code}: {e}")
print(f"HTTP status: {e.status}")
Error Types
| Error | Code | Description |
|---|---|---|
AuthenticationError |
INVALID_API_KEY |
API key is invalid or missing |
NotFoundError |
NOT_FOUND |
Asset doesn't exist in the system |
OptropicError |
varies | Base error for all other API errors |
Types
All types are frozen dataclasses with full type annotations:
from optropic import VerifyResult, VerificationEvidence
VerifyResult- Result of verifying an assetVerificationEvidence- Structured evidence from verification
Environment Variables
Recommended setup for production:
# .env
OPTROPIC_API_KEY=op_live_xxxxxxxxxxxx
import os
from optropic import OptropicClient
client = OptropicClient(api_key=os.environ["OPTROPIC_API_KEY"])
Examples
Flask Backend
from flask import Flask, request, jsonify
from optropic import OptropicClient, NotFoundError
app = Flask(__name__)
client = OptropicClient(api_key=os.environ["OPTROPIC_API_KEY"])
@app.route("/api/verify", methods=["POST"])
def verify():
try:
result = client.verify(request.json["asset_id"])
return jsonify({
"status": result.status,
"signature_valid": result.signature_valid,
"security_level": result.security_level,
})
except NotFoundError:
return jsonify({"error": "Asset not found"}), 404
Django View
import os
from django.http import JsonResponse
from optropic import OptropicClient
client = OptropicClient(api_key=os.environ["OPTROPIC_API_KEY"])
def verify_asset(request, asset_id):
result = client.verify(asset_id)
return JsonResponse({
"status": result.status,
"signature_valid": result.signature_valid,
})
Support
License
MIT - Optropic GmbH
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
optropic-4.0.1.tar.gz
(55.3 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
optropic-4.0.1-py3-none-any.whl
(40.5 kB
view details)
File details
Details for the file optropic-4.0.1.tar.gz.
File metadata
- Download URL: optropic-4.0.1.tar.gz
- Upload date:
- Size: 55.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af906d319ef789b44457edbdc63fce9bc85d30e2d86b0398d283f1634fad3b0b
|
|
| MD5 |
988789b6c1fdbdd32155334dbb3cf87d
|
|
| BLAKE2b-256 |
b588ef647f454534e9371d55caa698d42ca800d3f9ae6cdf9de517d8508aa887
|
File details
Details for the file optropic-4.0.1-py3-none-any.whl.
File metadata
- Download URL: optropic-4.0.1-py3-none-any.whl
- Upload date:
- Size: 40.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dec5eb7a4c0183008e94af70da4a27e0029ff5ec8b0528fef6ff08bf3c259557
|
|
| MD5 |
0670d32094af2de8188f6580b631c643
|
|
| BLAKE2b-256 |
0a98743a4b6c2d81ec78f8078bc35ec5cc2a2453540bc75e67a958c11810793c
|