QUICKSTART
Connect your application
Open the developer dashboard, create an account, register your application, and keep the returned API key on your server. Customer license keys are separate from developer API keys.
POST http://127.0.0.1:8080/v1/activate
Content-Type: application/json
{
"app_id": "your-application",
"license_key": "LIC-...",
"device_id": "your-stable-device-id",
"device_label": "Design workstation"
}
DASHBOARD FLOW
Create your application API key
Register your app once in the dashboard. The response contains an API key for management requests. Store it in a server-side secret manager, never in a browser or public repository. Use “Regenerate API key” if it is exposed; the previous key stops working.
POST /v1/developer/appsRegister an app and issue its key
POST /v1/developer/apps/{app_id}/rotate-keyRegenerate the key
POST /v1/developer/apps/{app_id}/revokeDisable the app boundary
POST · /v1/activate
Activate a license
The first successful activation grants access and returns a signed token. Repeating activation on the same device is safe; another device is rejected.
{
"license_id": "customer-license-id",
"token": "signed-license-token",
"status": "active"
}
MOBILE QR PAIRING
Pair a mobile device
After activation, your software can create a short-lived pairing challenge, render its scan path as a QR code, and show it to the customer. The customer scans it at /scan; the first scan activates pairing and later scans return already_activated.
POST /v1/pairing/createCreate the QR challenge using the signed desktop token
POST /v1/pairing/statusPoll until the customer scans it
POST /v1/pairing/scanUsed by the mobile scanner
POST · /v1/validate
Validate a token
Call validation when your application starts or when it needs to confirm current access.
{
"app_id": "your-application",
"token": "signed-license-token",
"device_id": "your-stable-device-id"
}
MANAGEMENT
Manage licenses
Developer and admin dashboards can create, list, reset, and revoke licenses. Management routes require the correct developer session or API key.
GET /v1/customers?app_id={app_id}List your app’s customers using X-API-Key
POST /v1/customersCreate a customer (app_id, name, email, notes)
POST /v1/licensesIssue a customer license (app_id, customer_id, plan, expires_at)
POST /v1/license-records/{id}/revokeRevoke customer access using X-API-Key and app_id
POST /v1/license-records/{id}/restoreRestore access and require activation again
POST /v1/license-records/{id}/updateChange plan or expiry using app_id, plan, expires_at
POST /v1/developer/licensesCreate a license
GET /v1/developer/licensesList your licenses
POST /v1/licenses/{key}/resetReset a device binding
POST /v1/licenses/{key}/revokeRevoke access
ERRORS
Predictable responses
Errors use a stable JSON shape with a machine-readable code and a human-readable message.
{
"error": {
"code": "LICENSE_BOUND",
"message": "This license is already bound to another device."
}
}