Activation Code Directory
Inspect, edit activation limits, toggle active/deactivated, and revoke seats
| Activation Key | Product & Client | Status | Seats Used / Capacity | Expires | Active | Actions |
|---|
Interactive Client Activation Simulator
Simulate client application requests live against the activation API and inspect approved/disapproved responses.
{}
// Live server response will display here...
Recent License Stream
Real-time audit log snapshot of latest activation transactions
Audit & Activation Activity Logs
Complete historical log of all client validation, activation, and deactivation attempts.
| Timestamp | Status | Action | Code | Device ID | Outcome / Reason |
|---|
Developer API Keys
Generate and manage secure API keys for external applications (eCommerce, webhooks, backend services) to create activation codes programmatically
| Integration Name | API Key Token | Permissions | Created | Last Used | Status | Actions |
|---|
API Documentation & Integration Guide
Production reference for integrating software activation, verification, and license lifecycle management.
All Client endpoints under
/api/v1/* (activate, verify, deactivate, health) are public and do not require secret credentials. Admin endpoints under /api/admin/* require the x-admin-key header.
Claims and activates a software license seat for a specific client workstation. If the key is valid, active, and capacity is available (current_activations < max_activations), the server returns an APPROVED response and atomically consumes a seat.
deviceId) sends another activation request (e.g., application restart or reinstall), the server recognizes the existing device, refreshes its last_seen_at timestamp, and returns APPROVED without burning an extra seat!
Request Body Parameters (JSON)
| Field | Type | Requirement | Description |
|---|---|---|---|
| code | string | Required | The activation license key (e.g., PRO-8732-K9X1-V74B). Case-insensitive. |
| deviceId | string | Recommended | Unique hardware or system identifier (e.g., machine UUID, MAC hash). If omitted, an IP/fingerprint hash is auto-generated. |
| deviceName | string | Optional | Human-readable label for the client machine (e.g., Alice's MacBook Pro M2). |
| metadata | object | Optional | Arbitrary telemetry or client version data (e.g., {"os": "Windows 11", "version": "2.4.0"}). |
Integration Code Examples
curl -X POST "https://activation.hudsmersolutions.com/api/v1/activate" \
-H "Content-Type: application/json" \
-d '{
"code": "PRO-8732-K9X1-V74B",
"deviceId": "station-uuid-9842-acme",
"deviceName": "Alice Workstation M2",
"metadata": { "os": "macOS 15.0", "appVersion": "3.1.0" }
}'
import requests
API_URL = "https://activation.hudsmersolutions.com/api/v1/activate"
payload = {
"code": "PRO-8732-K9X1-V74B",
"deviceId": "station-uuid-9842-acme",
"deviceName": "Alice Workstation M2"
}
response = requests.post(API_URL, json=payload, timeout=10)
data = response.json()
if response.status_code == 200 and data.get("status") == "APPROVED":
print("License Approved!")
print(f"Product: {data['data']['productName']}")
print(f"Remaining Seats: {data['data']['remainingActivations']}")
print(f"Expires: {data['data']['expiresAt'] or 'Perpetual'}")
else:
print(f"Activation Disapproved: {data.get('message')}")
print(f"Error Code: {data.get('error')}")
async function activateClientLicense(licenseKey, machineId) {
const url = 'https://activation.hudsmersolutions.com/api/v1/activate';
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
code: licenseKey,
deviceId: machineId,
deviceName: 'Client Application'
})
});
const resData = await response.json();
if (response.ok && resData.status === 'APPROVED') {
console.log('Activation approved:', resData.data);
// Store activation state locally
return { success: true, license: resData.data };
} else {
console.error('Activation disapproved:', resData.message, resData.error);
return { success: false, error: resData.error, message: resData.message };
}
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class LicenseManager
{
private static readonly HttpClient client = new HttpClient();
public static async Task ActivateAsync(string activationCode, string deviceId)
{
var payload = new {
code = activationCode,
deviceId = deviceId,
deviceName = Environment.MachineName
};
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://activation.hudsmersolutions.com/api/v1/activate", content);
var jsonResponse = await response.Content.ReadAsStringAsync();
using var doc = JsonDocument.Parse(jsonResponse);
var root = doc.RootElement;
if (response.IsSuccessStatusCode && root.GetProperty("status").GetString() == "APPROVED")
{
Console.WriteLine("License Approved!");
return true;
}
Console.WriteLine($"Disapproved: {root.GetProperty("message").GetString()}");
return false;
}
}
<?php
$url = "https://activation.hudsmersolutions.com/api/v1/activate";
$data = [
"code" => "PRO-8732-K9X1-V74B",
"deviceId" => "server-machine-id-01",
"deviceName" => "Production App Server"
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
if ($httpCode === 200 && ($result['status'] ?? '') === 'APPROVED') {
echo "Activation Approved: Remaining seats: " . $result['data']['remainingActivations'] . "\n";
} else {
echo "Activation Failed: " . ($result['message'] ?? 'Unknown error') . "\n";
}
Sample Responses
{
"success": true,
"status": "APPROVED",
"message": "Activation successful! Your activation code has been approved.",
"data": {
"code": "PRO-8732-K9X1-V74B",
"clientName": "Acme Studio Inc.",
"productName": "Studio Pro Suite 2026",
"deviceId": "station-uuid-9842-acme",
"deviceName": "Alice Workstation M2",
"currentActivations": 2,
"maxActivations": 3,
"remainingActivations": 1,
"expiresAt": "2027-12-31T23:59:59.000Z",
"activatedAt": "2026-10-01T04:45:00.000Z"
}
}
{
"success": false,
"status": "DISAPPROVED",
"error": "ACTIVATION_LIMIT_EXCEEDED",
"message": "Maximum number of activations (3) reached for this code. No activations remaining.",
"currentActivations": 3,
"maxActivations": 3,
"remainingActivations": 0
}
Silently verifies license validity without consuming any seats. Ideal for application startup checks or scheduled daily heartbeats.
Request Body Parameters (JSON)
| Field | Type | Requirement | Description |
|---|---|---|---|
| code | string | Required | The activation key to verify. |
| deviceId | string | Optional | Device identifier to confirm whether this specific machine is actively bound. |
curl -X POST "https://activation.hudsmersolutions.com/api/v1/verify" \
-H "Content-Type: application/json" \
-d '{
"code": "PRO-8732-K9X1-V74B",
"deviceId": "station-uuid-9842-acme"
}'
{
"success": true,
"status": "APPROVED",
"message": "Activation code is valid and active.",
"data": {
"code": "PRO-8732-K9X1-V74B",
"clientName": "Acme Studio Inc.",
"productName": "Studio Pro Suite 2026",
"isDeviceBound": true,
"currentActivations": 2,
"maxActivations": 3,
"remainingActivations": 1,
"expiresAt": "2027-12-31T23:59:59.000Z"
}
}
Releases an active seat from a machine, decrementing current_activations and returning the seat to the available license pool. Essential for machine migrations, uninstalls, and license transfers.
Request Body Parameters (JSON)
| Field | Type | Requirement | Description |
|---|---|---|---|
| code | string | Required | The activation key. |
| deviceId | string | Required | The exact machine identifier to disconnect. |
curl -X POST "https://activation.hudsmersolutions.com/api/v1/deactivate" \
-H "Content-Type: application/json" \
-d '{
"code": "PRO-8732-K9X1-V74B",
"deviceId": "station-uuid-9842-acme"
}'
{
"success": true,
"status": "APPROVED",
"message": "Device deactivated successfully. Activation seat has been released.",
"data": {
"code": "PRO-8732-K9X1-V74B",
"deviceId": "station-uuid-9842-acme",
"currentActivations": 1,
"maxActivations": 3,
"remainingActivations": 2
}
}
Zero-overhead endpoint for health checks, Pingdom, UptimeRobot, or Kubernetes liveness probes.
curl "https://activation.hudsmersolutions.com/api/v1/health"
// Response (HTTP 200):
{
"status": "UP",
"timestamp": "2026-10-01T04:45:00.000Z",
"service": "Activation Code Service API"
}
Programmatically generates single or batch activation license codes. Built for integration with external payment gateways, webhooks (e.g. Stripe, Shopify, WooCommerce), or backend microservices.
x-api-key header or HTTP Bearer token: Authorization: Bearer kf_live_.... Generate and manage keys in the Developer API Keys tab.
Request Body Parameters (JSON)
| Field | Type | Requirement | Description |
|---|---|---|---|
| prefix | string | Optional | Prefix for generated keys (e.g., ACT, PRO, VIP). Default: ACT. |
| count | integer | Optional | Number of unique keys to generate in a batch (1 to 100). Default: 1. |
| customCode | string | Optional | Explicit custom code. If specified, overrides auto-generation. Must be unique. |
| maxActivations | integer | Optional | Number of simultaneous client seats allowed for this key. Default: 1. |
| expiresAt | string | Optional | ISO 8601 date string for license expiration (e.g., 2027-12-31T23:59:59.000Z). Leave blank for perpetual. |
| clientName | string | Optional | Customer name, email, or order reference (e.g., Acme Corp - Order #10482). |
| productName | string | Optional | Software product name or tier (e.g., Studio Pro Suite 2026). |
| notes | string | Optional | Internal audit notes, webhook payload IDs, or transaction references. |
Integration Code Examples
curl -X POST "https://activation.hudsmersolutions.com/api/v1/codes" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_DEVELOPER_API_KEY" \
-d '{
"prefix": "PRO",
"count": 1,
"maxActivations": 3,
"clientName": "Acme Studio Inc.",
"productName": "Studio Pro 2026",
"notes": "Automated order fulfillment #8942"
}'
import fetch from 'node-fetch';
async function provisionLicense(customerEmail, productTier) {
const response = await fetch('https://activation.hudsmersolutions.com/api/v1/codes', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.KEYFORGE_API_KEY}`
},
body: JSON.stringify({
prefix: 'PRO',
count: 1,
maxActivations: 1,
clientName: customerEmail,
productName: productTier,
notes: 'Provisioned via webhook'
})
});
const data = await response.json();
if (response.ok && data.success) {
const newLicense = data.data[0];
console.log('License Key Generated:', newLicense.code);
return newLicense.code;
} else {
throw new Error(data.message || 'License generation failed');
}
}
import requests
API_URL = "https://activation.hudsmersolutions.com/api/v1/codes"
API_KEY = "kf_live_your_secret_api_key"
headers = {
"Content-Type": "application/json",
"x-api-key": API_KEY
}
payload = {
"prefix": "PRO",
"count": 1,
"maxActivations": 2,
"clientName": "alice@example.com",
"productName": "Studio Pro 2026",
"notes": "Stripe Checkout session ch_3Nk810..."
}
response = requests.post(API_URL, json=payload, headers=headers)
data = response.json()
if response.status_code == 201 and data.get("success"):
created_code = data["data"][0]["code"]
print(f"Generated License Code: {created_code}")
else:
print(f"Error: {data.get('message')}")
Sample Response
{
"success": true,
"message": "Successfully created 1 activation code(s).",
"data": [
{
"id": 14,
"code": "PRO-8732-K9X1-V74B",
"status": "active",
"max_activations": 2,
"current_activations": 0,
"client_name": "alice@example.com",
"product_name": "Studio Pro 2026",
"expires_at": null,
"notes": "Stripe Checkout session ch_3Nk810...",
"created_at": "2026-10-01T05:40:00.000Z"
}
]
}
Standard Error Code Matrix
When a request cannot be fulfilled, the server returns "status": "DISAPPROVED" along with an explicit error code string.
| Error Code | HTTP Status | Cause | Recommended User Guidance |
|---|---|---|---|
| ACTIVATION_LIMIT_EXCEEDED | 403 |
Max capacity reached (current >= max). |
Inform the user all seats are taken; suggest releasing an old machine or upgrading. |
| CODE_DEACTIVATED | 403 |
License suspended by administrator. | Inform the user their license has been administrative suspended; contact support. |
| CODE_EXPIRED | 403 |
Validity expiration date has passed. | Prompt the user to renew their license subscription. |
| CODE_NOT_FOUND | 404 |
Code does not exist in database. | Check for typographical errors in the license key. |
| DEVICE_NOT_ACTIVE | 400 |
Device not currently bound during deactivation. | Device seat is already released. |
| MISSING_CODE | 400 |
No code field in JSON body. |
Ensure client JSON payload contains "code". |
| UNAUTHORIZED | 401 |
Invalid or missing x-admin-key. |
Provide valid admin credentials for management routes. |
Client Integration Best Practices
- Stable Machine Fingerprint: Generate the
deviceIdfrom hardware attributes (e.g. BIOS serial or OS installation UUID) rather than transient items like IP addresses. - Local State Caching: After a successful
/activatecall, cache the license token and expiry date in encrypted client storage. - Silent Background Verification: On app launch, use
/api/v1/verifyin the background to ensure the license hasn't been revoked, without consuming extra seats. - Offline Grace Period: If the user's internet is temporarily down, allow a configurable grace period (e.g., 3-7 days) using the cached verification timestamp before disabling software features.