Python SDK
Python SDK
Pure Python 3.8+. Basic online requests use the standard library. Install permitcore[offline] for signed offline/grace verification.
Installation
pip install "permitcore[offline]"
Quick start
from permitcore import PermitCoreClient client = PermitCoreClient("https://api.permitcore.dev") result = client.validate( "PERMIT-XXXX-XXXX-XXXX-XXXX", expected_product_id="7f3e9a2b-1c4d-4e8f-9a6b-3d2c1e0f5a8b" # Optional — reject a key issued for a different product instead of silently accepting it ) if result.error_code == "WrongProduct": print(f"This key is for a different product: {result.product_id}") raise SystemExit(1) if not result.is_valid: print(f"License invalid: {result.message}") raise SystemExit(1) # Feature flags if result.has_feature("export"): enable_export() if result.is_trial: print(f"Trial — {result.trial_days_remaining} days remaining") # Warn if vendor subscription expiring if result.vendor_warning: show_warning(result.vendor_warning)
Activation
import socket result = client.activate( "PERMIT-XXXX-XXXX-XXXX-XXXX", device_id = PermitCoreClient.get_hardware_id(), # auto if omitted device_name = socket.gethostname(), expected_product_id = "7f3e9a2b-1c4d-4e8f-9a6b-3d2c1e0f5a8b" # optional ) if result.is_valid: save_activated() elif result.error_code == "WrongProduct": print(f"Wrong product: {result.product_id}")
Product scoping: by default, any active key belonging to your tenant validates/activates successfully regardless of which product it was issued for. If you sell more than one product, either check result.product_id yourself, or pass the optional expected_product_id parameter and let the server reject a mismatch (result.error_code == "WrongProduct"). Find a product's ID in the Admin panel under Products.
Offline mode
# Cache is enabled by default — stored in ~/.permitcore_cache_{hash} client = PermitCoreClient( "https://api.permitcore.dev", enable_offline_cache=True ) result = client.validate(key) if result.is_offline: print("Running in offline mode")
Floating licenses
Check out a seat when the session starts. While running, heartbeat about every four minutes and handle failed heartbeats. Stop using a rejected session. Cancel the heartbeat loop and await checkin during normal shutdown; process-exit callbacks may not finish network calls. See floating-session lifecycle.
Hardware ID
hwid = PermitCoreClient.get_hardware_id()
# "a3f82c91b44e..." — stable SHA-256 of machine identifiers