Documentation menu

Reference

Errors

What each error code means and what to do about it.

Error format

Failed requests return a 4xx or 5xx status with a JSON body. Use code in your logic and show or log detail. Include request_id when contacting support.

json
{
  "status": 409,
  "code": "activation_limit_reached",
  "detail": "Every device slot for this license is in use.",
  "request_id": "req_8f3k2..."
}

Validation results

/v1/runtime/validate doesn't return errors for license problems. It returns 200 with data.valid and one of these codes:

CodeMeaningWhat to do
validThe license can be used.Unlock. If in_grace is true, remind them to renew.
license_not_foundNo such key in this environment.Ask them to re-enter it. Check you're using the right environment's key.
product_mismatchThe key is for a different product.Ask for the right key.
license_not_startedThe start date is in the future.Tell them when it starts.
license_expiredPast expiry and the grace period.Offer a renewal.
license_suspendedPaused by you.Point them to support.
license_revokedPermanently cancelled.Lock the app.
license_supersededReplaced by a newer license.Ask for their new key.
not_activatedThis device isn't activated.Run activation.
device_mismatchThe device fingerprint changed.Ask them to deactivate and activate again.

Error codes

CodeStatusMeaning
invalid_request400The request is malformed.
validation_failed422A field is invalid. meta.errors says which.
invalid_api_key401The key is wrong, revoked, or expired.
forbidden403Your role or key can't do this.
insufficient_scope403The secret key is missing a scope.
plan_limit_reached403You've reached your plan's limit for this item.
organization_suspended403Your organization is suspended. Your customers' apps keep working.
license_not_active403The license is suspended, revoked, or superseded.
license_expired403The license has expired.
offline_not_allowed403The license doesn't allow offline use.
not_found404It doesn't exist, or belongs to another organization or environment.
conflict409Not possible in the current state, such as reinstating a revoked license.
idempotency_key_reuse409That Idempotency-Key was already used for a different request.
activation_limit_reached409Every device slot is in use.
not_activated409Activate the device first.
device_mismatch409The device fingerprint doesn't match.
rate_limited429Too many requests. Wait for Retry-After.
internal_error500Something went wrong on our side. Retry with backoff.
service_unavailable503Temporarily unavailable. Retry with backoff.

When to retry

Retry 429 and 5xx responses with exponential backoff (the SDK does this for you). Other 4xx errors will keep failing until you change the request.