29
Issue, validate, and protect your software licenses with RSA-signed keys, device fingerprinting, and a developer-first API. All in one secure vault.
From key generation to offline validation — LicenseVault handles the full licensing lifecycle with enterprise-grade security.
.lic tokens for air-gapped environments. Your software stays activated even without internet access.No complex setup. Just connect your product, generate keys, and let your customers activate securely.
Start free. Scale as you grow. No hidden fees, no per-seat chaos.
Thousands of indie devs and software teams trust LicenseVault to protect their work.
Complete reference for LicenseVault — from quick start to advanced API usage, SDK integration, and security best practices.
Get LicenseVault up and running in under 10 minutes. Follow these steps to issue your first license and validate it via the API.
LV-XXXX-XXXX-XXXX-XXXX), maximum activations per license, and expiry rules.POST /api/v1/license/activate with the license key, device fingerprint, and your product API key.Authorization: Bearer <token> on subsequent validate calls to avoid extra server round-trips.
LicenseVault is a self-hosted PHP application. Make sure your server meets the following requirements before installation.
The following software must be installed and available on your server:
The following PHP extensions must be enabled:
public/ directory. Never expose the application root directly.
The LicenseVault dashboard gives you a real-time overview of your entire licensing operation from a single screen.
The main dashboard displays key metrics at a glance:
| Metric | Description |
|---|---|
| Total Licenses | Total number of license keys issued across all products. |
| Active Licenses | Licenses that are currently active and have been activated at least once. |
| Total Activations | Cumulative count of all device activations across all licenses. |
| Total Products | Number of software products registered in the system. |
| Total Customers | Number of customer records linked to at least one license. |
| Recent Activity | Live feed of the latest API calls, activations, and system events. |
The left sidebar provides access to all major sections:
Products represent your software applications. Each product has its own key format, activation rules, and API key for license operations.
Navigate to Products → New Product and fill in the following fields:
| Field | Description |
|---|---|
| Name | Display name for your software product (e.g. "DataSync Pro"). |
| Slug | URL-safe identifier. Auto-generated from name. Used in API calls. |
| Key Format | Pattern for generated keys. Use X for random chars (e.g. LV-XXXX-XXXX-XXXX). |
| Max Activations | Maximum number of devices a single license can be activated on. |
| Expiry Days | Default license duration in days. Leave blank for lifetime licenses. |
| Features | JSON object of feature flags/entitlements for all licenses of this product. |
Each product has one or more API keys used to authenticate license API requests. Keys are scoped to a single product — they cannot be used to access other products' licenses.
pk_. Rotate keys immediately if compromised. Old keys are instantly invalidated upon rotation.
Licenses are cryptographically signed keys that authorize a customer to use your software. Each license is tied to a product and optionally a customer.
| Status | Description |
|---|---|
| active | License is valid and can be activated/validated. Default status after generation. |
| suspended | Temporarily disabled. Validation fails. Can be re-activated by an admin. |
| revoked | Permanently disabled. Cannot be re-activated. Validation always fails. |
| expired | Expiry date has passed. Validation returns an expired error. |
| trial | Time-limited trial license with restricted features or activations. |
| Field | Description |
|---|---|
| license_key | The unique signed key string delivered to the customer. |
| product_id | The product this license belongs to. |
| customer_id | Optional — the customer this license is assigned to. |
| max_activations | Maximum concurrent device activations allowed. |
| expires_at | Optional expiry date. Null means lifetime license. |
| features | JSON overrides for product-level feature flags. |
| notes | Internal admin notes. Not visible to customers. |
Customers represent the end-users or organizations that own licenses. Linking licenses to customers enables support lookups, usage tracking, and renewal management.
| Field | Description |
|---|---|
| Name | Full name or company name of the customer. |
| Primary contact email. Used for license delivery and renewal notifications. | |
| Company | Optional company/organization name. |
| Notes | Internal notes visible only to admins. |
| Licenses | All licenses linked to this customer, visible from the customer detail page. |
From the customer detail page you can:
Every time a license is activated on a device, an activation record is created. These records contain device fingerprint, hostname, IP, and timestamps.
| Field | Description |
|---|---|
| fingerprint | SHA-256 device fingerprint provided by the client application. |
| hostname | Machine hostname reported at activation time. |
| ip_address | IP address of the activating machine. |
| activated_at | Timestamp of the activation event. |
| last_seen_at | Timestamp of the most recent validation from this device. |
| is_active | Whether this activation slot is currently in use. |
Admins can deactivate individual activation slots from the Activations page. This frees up a slot so the customer can activate on a new device. Useful when a customer replaces a machine.
max_activations_reached error. Deactivate an existing slot to free space.
Manage versioned software releases and control download access. Only customers with an active license can download protected releases.
Go to Downloads → New Release and fill in:
| Field | Description |
|---|---|
| Product | Which product this release belongs to. |
| Version | Semantic version string (e.g. 2.4.1). |
| Release Notes | Changelog or description of what's new in this version. |
| File / URL | Upload the binary or point to an external download URL. |
| Visibility | Public (anyone can see) or Private (requires active license). |
| Minimum License Type | Only licenses of this type or higher can download the release. |
/api/v1/license/latest-release) allows your app to check for updates automatically using the customer's license key.
LicenseVault provides a RESTful JSON API for all license operations. All endpoints require an X-API-Key header with your product API key.
| Method | Endpoint | Description |
|---|---|---|
| POST | /license/activate | Activate a license on a device |
| POST | /license/validate | Validate a license or JWT token |
| POST | /license/deactivate | Remove a device activation slot |
| POST | /license/offline-token | Generate a signed offline token |
| GET | /license/public-key | Retrieve the RSA public key |
Common error codes:
Activates a license key on a specific device. On success, returns a signed JWT token for subsequent validate calls.
Request body parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| license_key | string | Required | The license key to activate (e.g. LV-XXXX-XXXX-XXXX). |
| fingerprint | string | Required | Unique device identifier (SHA-256 hash recommended). |
| hostname | string | Optional | Machine hostname for activation records. |
| metadata | object | Optional | Additional JSON metadata stored with the activation. |
Validates an active license or JWT token. Call this on every application startup to ensure the license is still valid.
| Parameter | Type | Required | Description |
|---|---|---|---|
| license_key | string | Required* | License key to validate. Required if token not provided. |
| token | string | Required* | JWT token from a previous activation. Required if license_key not provided. |
| fingerprint | string | Optional | Device fingerprint to verify the token was issued for this machine. |
token field. This uses RSA signature verification locally and avoids a database query — response time is typically under 5ms.
Removes the activation for a specific device fingerprint. Use this when a user uninstalls your software to free up their activation slot.
| Parameter | Type | Required | Description |
|---|---|---|---|
| license_key | string | Required | The license key to deactivate a device from. |
| fingerprint | string | Required | The device fingerprint of the activation to remove. |
Generate a signed offline token for air-gapped or intermittently connected environments. The token is cryptographically signed and can be verified locally without a server call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| license_key | string | Required | Active license key to generate token for. |
| fingerprint | string | Required | Device fingerprint that the token is bound to. |
| valid_days | integer | Optional | How many days the offline token remains valid (default: 30). |
The official LicenseVault PHP SDK simplifies integration into any PHP application. Download it from the dashboard under Developer Tools → SDK.
| Method | Description |
|---|---|
| activate($key, $fp) | Activate a license. Returns token + license data. |
| validate($token, $fp) | Validate a JWT token. Returns validity + expiry. |
| deactivate($key, $fp) | Remove activation for this device. |
| getOfflineToken($key, $fp) | Request a signed offline token. |
| getFingerprint() | Auto-generate a device fingerprint from system info. |
| getPublicKey() | Fetch the RSA public key for local verification. |
| checkForUpdates($key) | Check for newer software releases. |
LicenseVault has built-in support for Envato marketplace. Customers can redeem their ThemeForest or CodeCanyon purchase codes for a LicenseVault license automatically.
purchase_code_already_used error to prevent license cloning.
Configure LicenseVault's core behaviour from the Settings panel. Changes take effect immediately without requiring a restart.
| Setting | Description |
|---|---|
| App Name | Name displayed in emails and the UI. |
| Base URL | Your application's public URL. |
| Timezone | Used for expiry dates and logs. |
| Default Expiry Days | Fallback expiry for new licenses without a set expiry. |
| Setting | Description |
|---|---|
| SMTP Host | Your SMTP server hostname. |
| SMTP Port | Usually 587 (TLS) or 465 (SSL). |
| SMTP Username | SMTP authentication username. |
| SMTP Password | SMTP authentication password. |
| From Email | Sender address for all outbound emails. |
| Setting | Description |
|---|---|
| Rate Limit (per minute) | Max API requests per IP per minute. Requests over the limit return HTTP 429. |
| JWT Expiry Hours | How long issued JWT tokens remain valid before requiring re-validation. |
| RSA Key Pair | Generate or rotate the RSA-2048 key pair used for license signing. Keep the private key secret. |
| IP Whitelist | Optional — restrict Admin API access to specific IP addresses. |
LicenseVault uses multiple layers of security to protect your licenses from tampering, cloning, and replay attacks.
Every license token is signed using your private RSA-2048 key. Clients verify authenticity using only the public key — the private key never leaves your server.
Licenses are bound to device fingerprints at activation time. Tokens issued for one machine will fail verification on another, preventing license sharing.
All API endpoints are protected by per-IP rate limiting. Brute-force attempts against license keys are throttled automatically with HTTP 429 responses.
Product API keys are scoped to a single product. A compromised key for one product cannot be used to access or modify licenses for other products.