Skip to main content

Developer API errors

All Developer API errors return a JSON object with an error code and a human-readable message:
{
  "error": "not_found",
  "message": "Resource not found"
}
HTTP StatusError CodeDescription
400bad_requestInvalid or missing request parameters. Check the request body and query parameters.
401invalid_api_keyMissing, malformed, or revoked API key. Verify your Authorization: Bearer header.
402no_creditsInsufficient credits to complete the operation. Purchase more credits in the dashboard.
403forbiddenThe target app or license doesn’t belong to your account.
404not_foundThe license key, webhook, or endpoint doesn’t exist.
429rate_limitedToo many requests. Back off and retry with exponential backoff. Burst limit: 100 req/s, sustained: 50 req/s.
500internal_errorUnexpected server error. Retry the request. If persistent, contact support.

Public auth errors (SDK)

The public auth endpoints (/auth/validate and /auth/heartbeat) return errors inside a 200 HTTP response with status: "failed":
{
  "status": "failed",
  "error": "invalid_key"
}

Validate errors (/auth/validate)

Error CodeDescriptionUser-facing guidance
invalid_appThe App ID or App Secret is incorrect, or the app has been deactivated.This is a developer configuration error. Show “Authentication failed.”
app_disabledThe app owner’s account is suspended.Show “Authentication service temporarily unavailable.”
invalid_keyThe license key doesn’t exist or doesn’t belong to this app.Show “Invalid license key. Please check and try again.”
revokedThe license has been revoked.Show “This license has been deactivated. Contact support.”
expiredThe license has passed its expiration date.Show “Your license has expired.” with a renewal link if applicable.
hwid_mismatchAll HWID slots are full and the current device’s HWID doesn’t match any bound device.Show “This license is already in use on another device. Contact support to reset.”
no_creditsThe app developer’s account has insufficient credits.Show “Authentication service temporarily unavailable. Please try again later.” Never expose this to end users.
blockedThe device’s HWID or IP is blacklisted, or not on a required whitelist.Show “Authentication failed. Contact support.”
bad_requestThe request body is malformed (missing fields, invalid types). Includes a details array.This is a developer integration error.

Heartbeat errors (/auth/heartbeat)

Error CodeDescription
session_expiredThe session token is invalid or has expired. The SDK should re-authenticate.
revokedThe license has been revoked since the last heartbeat.
expiredThe license has expired since the last heartbeat.
app_disabledThe app owner’s account has been suspended.
no_creditsThe app developer’s account has insufficient credits for the heartbeat billing milestone.

SDK client-side errors

In addition to server errors, the SDK may detect issues locally before or after a server response:
ErrorDescription
nonce_mismatchThe nonce in the server response doesn’t match the one sent in the request. Possible replay attack.
signature_mismatchThe HMAC-SHA256 signature on the server response is invalid. Possible tampering.
HTTP/network errorsConnection timeout, DNS failure, or non-200 HTTP status. The SDK retries internally before failing.
These errors trigger the onFailure callback with the "login_failed" or "heartbeat_failed" reason.

Best practices for error handling

  1. Never expose internal error codes to end users. Map them to user-friendly messages.
  2. Log the actual error code for debugging, but show generic messages to users.
  3. Retry on transient errors (no_credits from your account, network errors) with exponential backoff.
  4. Don’t retry on permanent errors (invalid_key, revoked, hwid_mismatch) — prompt the user to take action instead.
  5. Handle no_credits gracefully — this is a billing issue on your end, not the user’s problem.
See SDK Best Practices for detailed error handling guidance with code examples.