Authorization (string) — signature or bearer token
Recommended headers
Accept: application/json
Request
Body
The request body is a base64-encoded, stringified JSON object.
Interactive API reference
:::ApiMethodV2
:::
Schema
Request Body
The request body is a string representing a base64-encoded JSON object containing all the required activation data.
If using multipart/form-data, the file form parameter is mandatory.
Request schema (TypeScript + JSON Schema)
TypeScript
JSON Schema
Signature
The signature value is constructed as follows:
1
Build the signing string — part 1
Start with the literal string: licenseSpring then a newline.
2
Build the signing string — part 2
Append: date: then a newline.
3
Build the signing string — part 3
Append either the license identifier (whichever is present for the request):
the "license_key" value, or
the "username" value then a newline.
4
Build the signing string — part 4
Append the "hardware_id" value, then a newline.
5
Build the signing string — part 5
Append the authorization identifier:
the "api_key" value (if using API key auth), or
the "client_id" value (if using OAuth) This completes the signing string.
6
Create HMAC
Encrypt the complete signing string using HMAC-SHA256 with the company signing key:
If using API key authorization: signing key = Shared Key
If using OAuth: signing key = Client Secret
Example (Node.js):
Finalized payload
This object is then stringified and encoded to base64.
Response Body
Response schema (TypeScript + JSON Schema)
TypeScript
JSON Schema
Response Signature
The response objects two digital signatures which the client app can use to verify the authenticty of the response:
license_signature is the HMAC-SHA256 signature explained in the Response Signature article.
offline_signature is an additional HMAC-SHA256 signature specific to this endpoint. This value is constructed identically to the signature parameter in the request payload (see Signature above) using the date value received in the response.
License Authorization Method
There are two types of product licenses based on how the client application authorizes itself to interact with a license:
Key-based product licenses
Each license assigned to the product requires the client to provide a license key in order to activate, check or deactivate the license (property license_key in the request body).
The license response object will contain the license_key property, and the property product_details.authorization_method will be the string license_key.
User-based product licenses
Each license assigned to the product has a corresponding "license user" instead of a license key. Requires username and password to be provided.
In the license response object, product_details.authorization_method will have the string value user and the response object will contain the user object with information on the license user.
License Types
The license_type property defines one of the 4 types of licenses based on their duration and how the license is used:
The optional variables parameter lets you set device variables during activation. For more information, see Device Variables.
Errors
If an error occurs, the response will have an HTTP status code of 400 or higher, and the response body will contain an error description in the following format:
JSON Schema
List of exceptions
missing_headers (400): some headers are missing
when missing authorization or date headers
missing_parameters (400): some parameters are missing in the request: different, parameters
when no request body at all or no file found in request body
authorization_missing_params (400): some parameters are missing in authorization: different, parameters
when has request body but request body is not properly base 64 encoded
when file is missing in request body
when license_key or hardware_id body parameters are missing
when data body parameter is missing
when api_key parameter is missing
product_not_bundle (400): Specified product "{CODE}" is not a bundle
If you want to use this API endpoint directly, instead of using an SDK (which does most of the heavy lifting), contact us for additional instructions.
Guide on using Offline Licenses
If any aspect of the offline licensing model remains unclear or raises questions, we encourage you to explore our in-depth guide on link
This resource offers a comprehensive explanation of the offline licensing process, how it operates, and ways to utilize its advantages for your specific software applications.
{
"tab": "examples",
"url": "/api/v4/activate_bundle_offline",
"name": "/api/v4/activate_bundle_offline",
"method": "POST",
"request": {
"pathParameters": [],
"queryParameters": [],
"headerParameters": [
{
"kind": "required",
"name": "Date",
"type": "string",
"children": [],
"description": "In RFC7231 format (see \"License API Authorization\"), eg.: Thu, 17 Nov 2022 20:51:35 GMT"
},
{
"kind": "required",
"name": "Authorization",
"type": "string",
"children": [],
"description": "See \"License API Authorization\" article"
}
],
"bodyDataParameters": [
{
"name": "base64-encoded JSON object",
"kind": "required",
"type": "Object",
"description": "The request body is a base64-encoded stringified JSON object containing the properties below. See the \"Finalized payload\" section for examples on how to generate this payload",
"children": [
{
"name": "api_key OR client_id",
"kind": "required",
"type": "string",
"description": "Authorization parameter used for the request, either `api_key` if using API key-based authorization, or `client_id` if using SSO authorization"
},
{
"name": "date",
"kind": "required",
"type": "string",
"description": "In RFC7231 format (see \"License API Authorization\"), eg.: Thu, 17 Nov 2022 20:51:35 GMT"
},
{
"name": "request_id",
"kind": "required",
"type": "string",
"description": "Custom unique ID used to identify the request"
},
{
"name": "request",
"kind": "required",
"type": "string",
"description": "Determines the type of request: \"activation\" or \"deactivation\""
},
{
"name": "signature",
"kind": "required",
"type": "string",
"description": "Calculated request signature (see section below)"
},
{
"name": "product",
"kind": "required",
"type": "string",
"description": "Product short code"
},
{
"name": "hardware_id",
"kind": "required",
"type": "string",
"description": "Unique hardware ID generated for the client device"
},
{
"name": "license_key",
"kind": "optional",
"type": "string",
"description": "Required if product is key-based (see section below)"
},
{
"name": "username",
"kind": "optional",
"type": "string",
"description": "Required if product is user based (see section below)"
},
{
"name": "password",
"kind": "optional",
"type": "string",
"description": "Required if product is user based (see section below)"
},
{
"name": "license_id",
"kind": "optional",
"type": "Number",
"description": "Ensures that the action affects only the license with the specified ID. This is useful if e.g. you have multiple licenses for the same product assigned to the same user"
},
{
"name": "os_ver",
"kind": "optional",
"type": "string",
"description": "Operating System description string which will be stored in license device data"
},
{
"name": "hostname",
"kind": "optional",
"type": "string",
"description": "Hostname string which will be stored in license device data"
},
{
"name": "os_hostname",
"kind": "optional",
"type": "string",
"description": "Legacy version of \"hostname\" parameter (see above)"
},
{
"name": "ip",
"kind": "optional",
"type": "string",
"description": "Client IP address string which will be stored in license device data"
},
{
"name": "ip_local",
"kind": "optional",
"type": "string",
"description": "Legacy version of \"ip\" parameter (see above)"
},
{
"name": "app_ver",
"kind": "optional",
"type": "string",
"description": "Application version string which will be stored in license device data"
},
{
"name": "sdk_ver",
"kind": "optional",
"type": "string",
"description": "SDK version string which will be stored in license device data"
},
{
"name": "mac_address",
"kind": "optional",
"type": "string",
"description": "Client MAC address which will be stored in license device data"
},
{
"name": "variables",
"kind": "optional",
"type": "Object",
"description": "Stores device variables. Variables are sent as a JSON object where the key is the variable name, and the value is the value of the variable"
}
],
"schema": [
{
"name": "api_key OR client_id",
"kind": "required",
"type": "string",
"description": "Authorization parameter used for the request, either `api_key` if using API key-based authorization, or `client_id` if using SSO authorization"
},
{
"name": "date",
"kind": "required",
"type": "string",
"description": "In RFC7231 format (see \"License API Authorization\"), eg.: Thu, 17 Nov 2022 20:51:35 GMT"
},
{
"name": "request_id",
"kind": "required",
"type": "string",
"description": "Custom unique ID used to identify the request"
},
{
"name": "request",
"kind": "required",
"type": "string",
"description": "Determines the type of request: \"activation\" or \"deactivation\""
},
{
"name": "signature",
"kind": "required",
"type": "string",
"description": "Calculated request signature (see section below)"
},
{
"name": "product",
"kind": "required",
"type": "string",
"description": "Product short code"
},
{
"name": "hardware_id",
"kind": "required",
"type": "string",
"description": "Unique hardware ID generated for the client device"
},
{
"name": "license_key",
"kind": "optional",
"type": "string",
"description": "Required if product is key-based (see section below)"
},
{
"name": "username",
"kind": "optional",
"type": "string",
"description": "Required if product is user based (see section below)"
},
{
"name": "password",
"kind": "optional",
"type": "string",
"description": "Required if product is user based (see section below)"
},
{
"name": "license_id",
"kind": "optional",
"type": "Number",
"description": "Ensures that the action affects only the license with the specified ID. This is useful if e.g. you have multiple licenses for the same product assigned to the same user"
},
{
"name": "os_ver",
"kind": "optional",
"type": "string",
"description": "Operating System description string which will be stored in license device data"
},
{
"name": "hostname",
"kind": "optional",
"type": "string",
"description": "Hostname string which will be stored in license device data"
},
{
"name": "os_hostname",
"kind": "optional",
"type": "string",
"description": "Legacy version of \"hostname\" parameter (see above)"
},
{
"name": "ip",
"kind": "optional",
"type": "string",
"description": "Client IP address string which will be stored in license device data"
},
{
"name": "ip_local",
"kind": "optional",
"type": "string",
"description": "Legacy version of \"ip\" parameter (see above)"
},
{
"name": "app_ver",
"kind": "optional",
"type": "string",
"description": "Application version string which will be stored in license device data"
},
{
"name": "sdk_ver",
"kind": "optional",
"type": "string",
"description": "SDK version string which will be stored in license device data"
},
{
"name": "mac_address",
"kind": "optional",
"type": "string",
"description": "Client MAC address which will be stored in license device data"
},
{
"name": "variables",
"kind": "optional",
"type": "Object",
"description": "Stores device variables. Variables are sent as a JSON object where the key is the variable name, and the value is the value of the variable"
}
]
}
],
"formDataParameters": []
},
"results": {
"languages": [
{
"id": "es8g1cuKJMbNPiIVt9VoF",
"code": "",
"language": "200",
"customLabel": ""
},
{
"id": "7eyIlKSv2QgJcowEsDZ-2",
"code": "",
"language": "400",
"customLabel": ""
}
],
"selectedLanguageId": "es8g1cuKJMbNPiIVt9VoF"
},
"examples": {
"languages": [
{
"id": "MVswmprxv53Y8L_yhrmmd",
"language": "curl",
"code": "curl --location --request POST '/api/v4/activate_bundle_offline' \\\n--header 'Accept: application/json' \\\n--header 'Date: string' \\\n--header 'Authorization: string' \\\n--data-raw '_BASE64_PAYLOAD_HERE_'",
"customLabel": ""
},
{
"id": "ZCTQO7_LVyOjAVX7pP4kO",
"language": "nodejs",
"code": "var request = require('request');\nvar options = {\n 'method': 'POST',\n 'url': '/api/v4/activate_bundle_offline',\n 'headers': {\n 'Accept': 'application/json',\n 'Date': 'string',\n 'Authorization': 'string'\n },\n body: Buffer.from(JSON.stringify(offline_payload)).toString('base64')\n};\n\nrequest(options, function (error, response) {\n if (error) throw new Error(error);\n console.log(response.body);\n});\n",
"customLabel": ""
},
{
"id": "LI5XFmSVTa4QEJC9tahg2",
"language": "javascript",
"code": "var myHeaders = new Headers();\nmyHeaders.append(\"Accept\", \"application/json\");\nmyHeaders.append(\"Date\", \"string\");\nmyHeaders.append(\"Authorization\", \"string\");\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: btoa(JSON.stringify(offline_payload)),\n redirect: 'follow'\n};\n\nfetch(\"/api/v4/activate_bundle_offline\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));",
"customLabel": ""
},
{
"id": "cmQNdWH3b3clWrX7G_IxJ",
"language": "python",
"code": "import requests\n\nurl = \"/api/v4/activate_bundle_offline\"\n\npayload = \"{\\\"Payload\\\":\\\"Object\\\"}\"\nheaders = {\n 'Accept': 'application/json',\n 'Date': 'string',\n 'Authorization': 'string'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data=payload)\n\nprint(response.text)\n",
"customLabel": ""
},
{
"id": "i6V2Wf-nI00sMv9ahE5rB",
"language": "ruby",
"code": "require \"uri\"\nrequire \"net/http\"\n\nurl = URI(\"/api/v4/activate_bundle_offline\")\n\nhttp = Net::HTTP.new(url.host, url.port);\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Accept\"] = \"application/json\"\nrequest[\"Date\"] = \"string\"\nrequest[\"Authorization\"] = \"string\"\nrequest.body = \"{\\\"Payload\\\":\\\"Object\\\"}\"\n\nresponse = http.request(request)\nputs response.read_body\n",
"customLabel": ""
}
],
"selectedLanguageId": "i6V2Wf-nI00sMv9ahE5rB"
},
"description": "Activates all licenses inside of a bundle using the offline activation method. Returns the list of activated licenses in response\n",
"currentNewParameter": {
"label": "Body Parameter",
"value": "bodyDataParameters"
}
}