License API
License Activation/Deactivatio...

Activate Bundle (Offline Method)

18min
currently we support trial, perpetual and consumption license types for offline activation purposes 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" for the request, the "file" form parameter is mandatory type licenseofflineactivationobject = ({ // for key based licenses license key string } | { // for user based licenses username string password string }) & { // required properties hardware id string product string request id string signature string date string request "activation" } & ({ api key string // for api key authorization } | { client id string // for oauth authorization }) & { // optional properties bundle code? string | undefined license id? number | undefined is vm? boolean | undefined vm info? string | undefined os ver? string | undefined hostname? string | undefined os hostname? string | undefined ip? string | undefined ip local? string | undefined app ver? string | undefined sdk ver? string | undefined mac address? string | undefined variables? { \[key string] string } | undefined } json schema { "$schema" "https //json schema org/draft/2020 12/schema", "type" "object", "allof" \[ { "oneof" \[ { "type" "object", "properties" { "license key" { "type" "string" } }, "required" \["license key"], "additionalproperties" false }, { "type" "object", "properties" { "username" { "type" "string" }, "password" { "type" "string" } }, "required" \["username", "password"], "additionalproperties" false } ] }, { "type" "object", "properties" { "api key" { "type" "string" }, "client id" { "type" "string" }, "request" { "type" "string" }, "request id" { "type" "string" }, "date" { "type" "string" }, "signature" { "type" "string" }, "hardware id" { "type" "string" }, "product" { "type" "string" }, "bundle code" { "type" "string" }, "license id" { "type" "number" }, "is vm" { "type" "boolean" }, "vm info" { "type" "string" }, "os ver" { "type" "string" }, "hostname" { "type" "string" }, "os hostname" { "type" "string" }, "ip" { "type" "string" }, "ip local" { "type" "string" }, "app ver" { "type" "string" }, "sdk ver" { "type" "string" }, "mac address" { "type" "string" }, "variables" { "type" "object", "additionalproperties" { "type" "string" } } }, "allof" \[ { "anyof" \[{ "required" \["api key"] }, { "required" \["client id"] }] }, { "anyof" \[{ "required" \["license key"] }, { "required" \["username"] }] } ], "required" \["hardware id", "product", "date", "signature"], "additionalproperties" false } ] } signature the signature value is constructed as follows the string licensespring plus a newline the string date , plus the "date" value from the license payload object, plus a newline either the "license key" or "username" value from the request payload object (which ever is present on the license, see the license authorization method section below) plus a newline the "hardware id" value from the request payload object plus a newline the "api key" value from the request payload object this complete string is then encrypted using hmac sha256 and the company shared key as the encryption key import crypto from 'node\ crypto'; const activationpayload = { // payload content }; // api key or client id depending on authorization type used const key = (activationpayload api key || activationpayload client id); // if using api key authorization the signing key is the shared key // if using oauth the signing key is the client secret const signingkey = ' '; const signingstring = 'licensespring\n' + 'date ' + activationpayload date + '\n' + (activationpayload license key || activationpayload username) + '\n' + activationpayload hardware id + '\n' + key; const signature = crypto createhmac('sha256', signingkey) update(signingstring) digest('base64'); finalized payload this object is then stringified and encoded to base64, e g js browser const activationpayload = { // payload content }; const requestbody = btoa(json stringify(activationpayload)); nodejs const activationpayload = { // payload content }; const requestbody = buffer from(json stringify(activationpayload)) tostring('base64'); response body type licenseactivationresponsebody = ({ id number, allow grace period boolean, allow overages boolean, allow unlimited activations boolean, borrowed until string | null, can borrow boolean, channel string, device id number, enable maintenance period boolean environment string, eula link string, floating timeout number, grace period number, hash md5 string, installation file string, is air gapped boolean, is borrowed boolean, is expired boolean, is floating cloud boolean, is floating boolean, is hardware key auth boolean, license active boolean, license enabled boolean, license signature string, license signature v2 string, offline signature string, license type string, maintenance period string | null, max activations number, max borrow time number, max license users number, max overages number, max transfers number, order store id string, prevent vm boolean, release date string, release notes link string, requires version string, size string, start date string | null, times activated number, transfer count number, validity period string | null, // string is in dateiso8601utc format version string, product features ({ id number, code string, name string, expiry date string, metadata json, feature type 'activation' | 'consumption', is floating boolean, is floating cloud boolean, // the following properties are only present if is floating=true or is floating cloud=true floating users number, floating timeout number, // the following properties are only present if feature type=consumption max consumption number, allow unlimited consumptions boolean, total consumptions number, allow overages number, max overages number, reset consumption boolean, consumption period 'daily' | 'weekly' | 'monthly' | 'annualy' | null, })\[], custom fields ({ name string, data type 'numer' | 'text' | 'date/time', value string, })\[], customer { email string, company name string, reference string, phone string, first name string, last name string, city string, postcode string, state string, country string, address string, customer account string | null, metadata json, }, product details { product id number, product name string, short code string, authorization method 'license key' | 'user', metadata json, }, metadata json, // the following property is only present if is trial=true trial days number, // the following properties is only present if is floating=true or is floating cloud=true floating in use devices number, floating users number, // the following properties are only present if license type='consumption' max consumptions number, total consumptions number, allow unlimited consumptions boolean, reset consumption boolean, consumption period string | null, // string is in dateiso8601utc format } & ({ // for key based licenses license key string, } | { // for user based licenses user { id number, email string, first name string, last name string, phone number string, is initial password boolean, max activations number, allow unlimited activations boolean, total activations number } }) )\[]; json schema { "$schema" "https //json schema org/draft/2020 12/schema", "type" "array", "items" { "type" "object", "allof" \[ { "oneof" \[ { "type" "object", "properties" { "license key" { "type" "string" } }, "required" \["license key"], "additionalproperties" false }, { "type" "object", "properties" { "user" { "type" "object", "properties" { "id" { "type" "number" }, "email" { "type" "string" }, "first name" { "type" "string" }, "last name" { "type" "string" }, "phone number" { "type" "string" }, "is initial password" { "type" "boolean" }, "max activations" { "type" "number" }, "allow unlimited activations" { "type" "boolean" }, "total activations" { "type" "number" } }, "required" \["id", "email", "first name", "last name", "phone number", "is initial password", "max activations", "allow unlimited activations", "total activations"], "additionalproperties" false } }, "required" \["user"], "additionalproperties" false } ] }, { "type" "object", "properties" { "id" { "type" "number" }, "allow grace period" { "type" "boolean" }, "allow overages" { "type" "boolean" }, "allow unlimited activations" { "type" "boolean" }, "borrowed until" { "type" \["string", "null"] }, "can borrow" { "type" "boolean" }, "channel" { "type" "string" }, "device id" { "type" "number" }, "enable maintenance period" { "type" "boolean" }, "environment" { "type" "string" }, "eula link" { "type" "string" }, "floating timeout" { "type" "number" }, "grace period" { "type" "number" }, "hash md5" { "type" "string" }, "installation file" { "type" "string" }, "is air gapped" { "type" "boolean" }, "is borrowed" { "type" "boolean" }, "is expired" { "type" "boolean" }, "is floating cloud" { "type" "boolean" }, "is floating" { "type" "boolean" }, "is hardware key auth" { "type" "boolean" }, "license active" { "type" "boolean" }, "license enabled" { "type" "boolean" }, "license signature" { "type" "string" }, "license signature v2" { "type" "string" }, "offline signature" { "type" "string" }, "license type" { "type" "string" }, "maintenance period" { "type" \["string", "null"] }, "max activations" { "type" "number" }, "max borrow time" { "type" "number" }, "max license users" { "type" "number" }, "max overages" { "type" "number" }, "max transfers" { "type" "number" }, "order store id" { "type" "string" }, "prevent vm" { "type" "boolean" }, "release date" { "type" "string" }, "release notes link" { "type" "string" }, "requires version" { "type" "string" }, "size" { "type" "string" }, "start date" { "type" \["string", "null"] }, "times activated" { "type" "number" }, "transfer count" { "type" "number" }, "validity period" { "type" \["string", "null"] }, "version" { "type" "string" }, "product features" { "type" "array", "items" { "type" "object", "properties" { "id" { "type" "number" }, "code" { "type" "string" }, "name" { "type" "string" }, "expiry date" { "type" "string" }, "metadata" {}, "feature type" { "type" "string", "enum" \["activation", "consumption"] }, "is floating" { "type" "boolean" }, "is floating cloud" { "type" "boolean" }, "floating users" { "type" "number" }, "floating timeout" { "type" "number" }, "max consumption" { "type" "number" }, "allow unlimited consumptions" { "type" "boolean" }, "total consumptions" { "type" "number" }, "allow overages" { "type" "number" }, "max overages" { "type" "number" }, "reset consumption" { "type" "boolean" }, "consumption period" { "type" \["string", "null"], "enum" \["daily", "weekly", "monthly", "annualy", null] } }, "required" \["id", "code", "name", "expiry date", "metadata", "feature type", "is floating", "is floating cloud"] } }, "custom fields" { "type" "array", "items" { "type" "object", "properties" { "name" { "type" "string" }, "data type" { "type" "string", "enum" \["numer", "text", "date/time"] }, "value" { "type" "string" } }, "required" \["name", "data type", "value"] } }, "customer" { "type" "object", "properties" { "email" { "type" "string" }, "company name" { "type" "string" }, "reference" { "type" "string" }, "phone" { "type" "string" }, "first name" { "type" "string" }, "last name" { "type" "string" }, "city" { "type" "string" }, "postcode" { "type" "string" }, "state" { "type" "string" }, "country" { "type" "string" }, "address" { "type" "string" }, "customer account" { "type" \["string", "null"] }, "metadata" {} }, "required" \["email", "company name", "reference", "phone", "first name", "last name", "city", "postcode", "state", "country", "address", "metadata"] }, "product details" { "type" "object", "properties" { "product id" { "type" "number" }, "product name" { "type" "string" }, "short code" { "type" "string" }, "authorization method" { "type" "string", "enum" \["license key", "user"] }, "metadata" {} }, "required" \["product id", "product name", "short code", "authorization method", "metadata"] }, "metadata" {}, "trial days" { "type" "number" }, "floating in use devices" { "type" "number" }, "floating users" { "type" "number" }, "max consumptions" { "type" "number" }, "total consumptions" { "type" "number" }, "allow unlimited consumptions" { "type" "boolean" }, "reset consumption" { "type" "boolean" }, "consumption period" { "type" \["string", "null"] } }, "required" \[ "id", "allow grace period", "allow overages", "allow unlimited activations", "can borrow", "channel", "device id", "enable maintenance period", "environment", "eula link", "floating timeout", "grace period", "hash md5", "installation file", "is air gapped", "is borrowed", "is expired", "is floating cloud", "is floating", "is hardware key auth", "license active", "license enabled", "license signature", "license signature v2", "offline signature", "license type", "max activations", "max borrow time", "max license users", "max overages", "max transfers", "order store id", "prevent vm", "release date", "release notes link", "requires version", "size", "times activated", "transfer count", "version", "product features", "custom fields", "customer", "product details", "metadata" ], "additionalproperties" false } ] } } 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 docid\ oucigcagcaikadwcbx9wk 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 activate bundle (offline method) docid 0awea7jlugzt14z9 qsqi 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 perpetual perpetual time limited time limited subscription subscription consumption consumption for more information see license types docid\ xhxttcvj7gs6qeaqu7cua device variables the optional variables parameter lets you set device variables during activation for more information on how device variables work, see device variables docid\ r2cnekm7ruff u0jkm0lw 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 { status number, code string, message string } json schema { "$schema" "https //json schema org/draft/2020 12/schema", "type" "object", "properties" { "status" { "type" "number" }, "code" { "type" "string" }, "message" { "type" "string" } }, "required" \[ "status", "code", "message" ], "additionalproperties" false } 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 sdk, which does most of heavy lifting for you, please 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