Skip to content

License Activation API

The License Activation API allows you to activate licenses on new machines, list existing activations, and deactivate machines.

Activate License

Activate a license key on a new machine.

Endpoint

POST https://store.gamedna.studio/api/licenses/activate

Request

{
"license_key": "GDNA-XXXX-XXXX-XXXX",
"machine_id": "unique-machine-identifier",
"machine_name": "John's Development PC",
"product_slug": "online-subsystem-blueprintable"
}

Parameters

ParameterTypeRequiredDescription
license_keystringThe license key to activate
machine_idstringUnique machine identifier
machine_namestringHuman-readable name for the machine
product_slugstringProduct being activated

Success Response (201 Created)

{
"success": true,
"activation": {
"id": "act_xyz789",
"machine_id": "unique-machine-identifier",
"machine_name": "John's Development PC",
"activated_at": "2026-01-22T10:00:00Z",
"last_validated": "2026-01-22T10:00:00Z"
},
"license": {
"id": "lic_abc123",
"type": "pro",
"seats_used": 3,
"seats_total": 5,
"remaining_seats": 2
}
}

Error Responses

Already Activated (409)

{
"error": {
"code": "ALREADY_ACTIVATED",
"message": "This machine is already activated for this license.",
"details": {
"activation_id": "act_xyz789",
"activated_at": "2026-01-15T08:00:00Z"
}
}
}

No Seats Available (403)

{
"error": {
"code": "NO_SEATS_AVAILABLE",
"message": "All license seats are currently in use.",
"details": {
"seats_used": 5,
"seats_total": 5,
"manage_url": "https://store.gamedna.studio/dashboard/licenses/lic_abc123"
}
}
}

Example

Terminal window
curl -X POST https://store.gamedna.studio/api/licenses/activate \
-H "Content-Type: application/json" \
-d '{
"license_key": "GDNA-ABCD-1234-EFGH",
"machine_id": "my-dev-machine-001",
"machine_name": "Development Workstation",
"product_slug": "online-subsystem-blueprintable"
}'

List Activations

List all activations for a license. Requires authentication.

Endpoint

GET https://store.gamedna.studio/api/licenses/{license_id}/activations

Authentication

Authorization: Bearer YOUR_ACCESS_TOKEN

Response (200 OK)

{
"activations": [
{
"id": "act_001",
"machine_id": "machine-hash-1",
"machine_name": "John's PC",
"activated_at": "2026-01-10T09:00:00Z",
"last_validated": "2026-01-22T08:30:00Z",
"is_current": false
},
{
"id": "act_002",
"machine_id": "machine-hash-2",
"machine_name": "Build Server",
"activated_at": "2026-01-15T14:00:00Z",
"last_validated": "2026-01-22T06:00:00Z",
"is_current": false
},
{
"id": "act_003",
"machine_id": "machine-hash-3",
"machine_name": "Jane's Laptop",
"activated_at": "2026-01-20T11:00:00Z",
"last_validated": "2026-01-22T10:00:00Z",
"is_current": true
}
],
"meta": {
"total": 3,
"seats_total": 5,
"seats_available": 2
}
}

Deactivate Machine

Remove an activation to free up a seat.

Endpoint

DELETE https://store.gamedna.studio/api/licenses/activations/{activation_id}

Authentication

Authorization: Bearer YOUR_ACCESS_TOKEN

Response (200 OK)

{
"success": true,
"message": "Activation successfully removed.",
"license": {
"id": "lic_abc123",
"seats_used": 2,
"seats_total": 5,
"seats_available": 3
}
}

Error Responses

Not Found (404)

{
"error": {
"code": "ACTIVATION_NOT_FOUND",
"message": "Activation not found or already deactivated."
}
}

Unauthorized (403)

{
"error": {
"code": "UNAUTHORIZED",
"message": "You do not have permission to manage this license."
}
}

Offline Activation

For machines without internet access.

Step 1: Generate Request

POST https://store.gamedna.studio/api/licenses/offline/request

Request:

{
"license_key": "GDNA-XXXX-XXXX-XXXX",
"machine_id": "air-gapped-machine-001",
"product_slug": "online-subsystem-blueprintable"
}

Response:

{
"request_code": "REQ-ABCDEFGH12345678",
"expires_at": "2026-01-23T10:00:00Z",
"instructions": "Visit https://store.gamedna.studio/activate-offline and enter this code."
}

Step 2: Get Activation Code

User visits the offline activation page with the request code and receives an activation code.

Step 3: Apply Activation Code

POST https://store.gamedna.studio/api/licenses/offline/activate

Request:

{
"request_code": "REQ-ABCDEFGH12345678",
"activation_code": "ACT-XYZXYZXYZXYZXYZ..."
}

Response:

{
"success": true,
"activation": {
"id": "act_offline_001",
"type": "offline",
"valid_until": "2027-01-22T00:00:00Z"
}
}

Error Codes

CodeHTTP StatusDescription
ALREADY_ACTIVATED409Machine already activated
NO_SEATS_AVAILABLE403All seats in use
ACTIVATION_NOT_FOUND404Activation doesn’t exist
UNAUTHORIZED403No permission for this action
LICENSE_EXPIRED403Cannot activate expired license
OFFLINE_CODE_EXPIRED400Offline request code expired
INVALID_ACTIVATION_CODE400Activation code is invalid

Rate Limits

EndpointLimitWindow
POST /activate10 requests1 hour
GET /activations60 requests1 minute
DELETE /activations/*10 requests1 hour