Console
AppHub Tether

Verify

License check — verifies whether the connected AppHub account is licensed to run your app. Returns a cryptographically signed response when a nonce is provided.

GET http://127.0.0.1:7420/verify
Requires X-AppHub-Token header or Authorization: AppID:AppKey — see Authentication
This endpoint requires AppHub Store to be running on your machine. The live tester calls your local AppHub instance directly.

Query parameters

ParameterRequiredDescription
appidrequiredYour app's packagename as registered on AppHub (e.g. com.studio.mygame)
noncerecommendedRandom hex string (16–64 chars). Required for signature verification — always include it for paid apps.

Success response 200

{
  "ok": true,
  "reason": "licensed",
  "appid": "com.studio.mygame",
  "ts": 1747012345678,
  "nonce": "a3f7b2c9d1e4f508",
  "sig": "3a7b4c9f1d2e5a8b..."
}

Response fields

FieldTypeDescription
okbooleantrue = authorized to run. false = should not run.
reasonstringExplanation code (see table below)
appidstringEchoed packagename
tsnumberUnix timestamp (ms) when AppHub generated this response. Verify within 60 seconds.
noncestringThe nonce you sent, echoed back. Verify it matches exactly.
sigstringHMAC-SHA256 hex digest. Present when nonce was sent and app is paid.
cachedbooleantrue if the result came from the local cache
offlinebooleantrue if AppHub could not reach the network (stale cache used)

Reason codes

ReasonokMeaning
freetrueApp is free — no account required. Skip signature check.
licensedtrueAccount owns the app
no_accountfalseApp is paid but no account is connected in the launcher
no_licensefalseAccount connected but does not own this app
offlinefalseCould not reach AppHub API and no cached result available
missing_appidfalseThe appid parameter was not provided
internal_errorfalseUnexpected error inside AppHub Tether

Signature verification

The sig field is HMAC-SHA256(itemKey, message) encoded as lowercase hex, where:

message = "${ok ? 1 : 0}:${appid}:${ts}:${nonce}"

Your code must verify all three independently:

1. response.nonce === nonce_you_sent
2. abs(Date.now() - response.ts) < 60_000
3. HMAC-SHA256(itemKey, message) === response.sig

If any check fails, treat the response as unauthorized. See the AppHub Tether guide for full code examples.