ExisOne Python Client SDK
Official Python client SDK for the ExisOne Software Activation System.
Installation
pip install exisone-client
Quick Start
from exisone import ExisOneClient, ExisOneClientOptions
# Initialize the client
options = ExisOneClientOptions(
base_url="https://www.exisone.com",
access_token="your-api-token"
)
client = ExisOneClient(options)
# Generate a hardware fingerprint for this machine
hardware_id = client.generate_hardware_id()
# Activate a license
result = client.activate(
activation_key="XXXX-XXXX-XXXX-XXXX",
email="user@example.com",
hardware_id=hardware_id,
product_name="MyProduct"
)
if result.success:
print("License activated successfully!")
else:
print(f"Activation failed: {result.error_message}")
Features
- License Activation - Activate licenses on specific hardware
- License Validation - Validate licenses online or offline
- Smart Validation - Auto-detects offline vs online keys with fallback
- Hardware ID Generation - Cross-platform hardware fingerprinting
- Offline Support - Validate licenses without internet using RSA signatures
- Type Hints - Full type annotation support (PEP 561)
API Reference
ExisOneClientOptions
Configuration options for the client:
| Option | Type | Description |
|---|---|---|
base_url |
str |
Base URL for the ExisOne API (must use HTTPS) |
access_token |
str |
API access token for authentication |
offline_public_key |
str |
RSA public key (PEM) for offline validation |
allowed_base_url_hosts |
list[str] |
Restrict base_url to specific hosts |
timeout |
int |
Request timeout in seconds (default: 30) |
ExisOneClient Methods
generate_hardware_id() -> str
Generate a cross-platform hardware fingerprint for this machine.
hardware_id = client.generate_hardware_id()
# Returns: "A1B2C3D4E5F6..." (64-char hex string)
activate(activation_key, email, hardware_id, product_name, version=None) -> ActivationResult
Activate a license on this machine.
result = client.activate(
activation_key="XXXX-XXXX-XXXX-XXXX",
email="user@example.com",
hardware_id=hardware_id,
product_name="MyProduct",
version="1.0.0" # Optional: your app version
)
if result.success:
print(f"Server version: {result.server_version}")
else:
print(f"Error: {result.error_code} - {result.error_message}")
validate(activation_key, hardware_id, product_name=None, version=None) -> ValidationResult
Validate a license online.
result = client.validate(
activation_key="XXXX-XXXX-XXXX-XXXX",
hardware_id=hardware_id
)
if result.is_valid:
print(f"License valid until: {result.expiration_date}")
print(f"Features: {', '.join(result.features)}")
validate_smart(key_or_code, hardware_id, product_name=None) -> SmartValidationResult
Smart validation that auto-detects offline vs online keys.
# Works with both online keys and offline codes
result = client.validate_smart(
activation_key_or_offline_code="XXXX-XXXX-XXXX-XXXX",
hardware_id=hardware_id
)
print(f"Valid: {result.is_valid}")
print(f"Was offline: {result.was_offline}")
deactivate(activation_key, hardware_id, product_name) -> bool
Deactivate a license.
success = client.deactivate(
activation_key="XXXX-XXXX-XXXX-XXXX",
hardware_id=hardware_id,
product_name="MyProduct"
)
validate_offline(offline_code, hardware_id) -> OfflineValidationResult
Validate an offline activation code locally (requires offline_public_key).
options = ExisOneClientOptions(
base_url="https://www.exisone.com",
access_token="your-token",
offline_public_key="""-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...
-----END PUBLIC KEY-----"""
)
client = ExisOneClient(options)
result = client.validate_offline(
offline_code="ABCD-EFGH-1234-5678-...",
hardware_id=hardware_id
)
if result.is_valid:
print(f"Product: {result.product_name}")
print(f"Expires: {result.expiration_date}")
Environment Variables
| Variable | Description |
|---|---|
EXISONE_BASEURL |
Default base URL if not specified in options |
Error Handling
from exisone import ExisOneClient, ExisOneClientOptions
import requests
client = ExisOneClient(options)
try:
result = client.validate(activation_key, hardware_id)
except requests.HTTPError as e:
print(f"HTTP error: {e.response.status_code}")
except requests.RequestException as e:
print(f"Network error: {e}")
Compatibility
- Python 3.8+
- Windows, Linux, macOS
Dependencies
requests- HTTP clientcryptography- RSA signature verification for offline validation
Documentation
License
MIT License - see LICENSE file for details.
Support
- Email: support@exisone.com
- Documentation: https://www.exisone.com/docs.html
- Issues: https://github.com/ExisLLC/SoftwareActivationProject/issues
Metadata
Release files for exisone-client 0.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| exisone_client-0.10.0.tar.gz | 15.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| exisone_client-0.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.6 kB
Release files / exisone_client-0.10.0.tar.gz
| Download URL | exisone_client-0.10.0.tar.gz |
|---|---|
| Size | 15.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
239cbe07f1cd5fee13617df6306589403f53d6568d8471eeb16acc20cbe49462
|
|
BLAKE2b-256 checksum How to use checksums |
a4bcbec5bd3b47dab99557585a54f3617e3496c14f649013c5b5a2e3e1be4bfe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Release files / exisone_client-0.10.0-py3-none-any.whl
| Download URL | exisone_client-0.10.0-py3-none-any.whl |
|---|---|
| Size | 15.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b1f90cdb8aeec2e4f5e770bf41967c68233d7c0f7371c69e9047af75c0997577
|
|
BLAKE2b-256 checksum How to use checksums |
ecea59b97aff4c22e245558bbcbfddecb4595fc50cc3be63eccd84a94b918f2f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|