Core concepts

How products, plans, licenses, activations, devices, tokens, entitlements and seats fit together.

Get these objects straight and the API becomes much easier to read.

ObjectMeaning
ProductA licensable software product with a key prefix and release feeds.
PlanA rule template: model, device limit, grace period, check-in interval and entitlements.
LicenseAn instance issued to a customer, bound to a plan, term and status.
ActivationA record of a device using a license, consuming one slot.
Device identifierA hashed machine identifier used to bind activations.
TokenAn Ed25519-signed offline credential with claims.
expWhen the token must check in again — not the license expiry.
vunThe license end date (may be empty for perpetual).
ftrEntitlements: boolean, numeric and quota. The client unlocks features from these.
SeatA member slot; when over the limit, last-joined members pause.
WebhookNotifications for payment, activation, revocation and more, signed with HMAC.

License states

trialing · active · expired · suspended · revoked

State changes appear on the next verify or newly issued token. Revocations cannot be seen while offline; the delay is bounded by the token’s exp.

Why exp and vun are separate

exp controls how often the app must check in; vun controls how long the license is sold for. Separating them bounds the offline window without shortening the term, and lets a renewal extend vun without changing the client’s rhythm.

Three kinds of entitlements

  • boolean:feature flags, e.g. publish: true.
  • numeric:capacity limits, e.g. exports or projects.
  • quota:rolling atomic quotas consumed on the server.
Client check order Verify signature → match did with the device id → check exp → read ftr. Do not stop at “a token exists”.