Skip to main content
Unveilydocs

License API

The license verification API your app calls for you — a reference

The SDK calls this API for you when the app starts. You'll rarely call it directly — this page is here for when you're curious about what happens under the hood.

Endpoint

Base URL: https://api.actuallyworks.net

POST /api/license/verify

Verifies the license at app startup. (Called automatically by the SDK — no need to call it yourself.)

Request

{
  "licenseKey": "string",
  "packageName": "com.yourcompany.app",
  "appSignatureHash": "SHA-256-hash",
  "deviceId": "unique-device-id"
}

Response (success)

{
  "isValid": true,
  "tier": "standard",
  "licenseType": "production",
  "expiresAt": "2027-01-01T00:00:00Z",
  "features": ["qr_scan", "push_notifications", "camera_gallery", "gps_location", "biometric"]
}

tier = the plan you're on

tier is your current plan — one of "basic" · "standard" · "pro". This is exactly the "plan" the rest of the docs talk about.

Response (failure)

{
  "isValid": false,
  "errorCode": "LICENSE_EXPIRED",
  "message": "License has expired"
}

Reading the features field

features lists the capabilities unlocked by this license, using server-side identifiers (slightly longer names like qr_scan, push_notifications).

Server names differ from the names you use in the app

This features array is something the server returns for reference. Don't parse it directly to decide whether a feature is on inside your app (JavaScript). These are simpler:

  • unveilyBridge.app.getInfo() → read the current plan from tier
  • unveilyBridge.modules.isEnabled("...") → check whether a module (e.g. sideDrawer, bottomTabs) is on
  • unveilyBridge.modules.getEnabledModules() → the list of enabled modules

In short: the server's features describes "what this contract includes," while deciding what's actually active on screen is best left to the bridge calls above.

Error Codes

CodeWhat it means
LICENSE_NOT_FOUNDThe license key wasn't found
LICENSE_EXPIREDThe license period has ended
LICENSE_INACTIVENot activated yet
PACKAGE_MISMATCHThe package name differs from what's registered
SIGNATURE_MISMATCHThe app signature hash differs from what's registered
INVALID_SIGNATUREHMAC signature verification failed

How to fix each one is in the Error Codes page.

On this page