Get these objects straight and the API becomes much easier to read.
| Object | Meaning |
|---|---|
Product | A licensable software product with a key prefix and release feeds. |
Plan | A rule template: model, device limit, grace period, check-in interval and entitlements. |
License | An instance issued to a customer, bound to a plan, term and status. |
Activation | A record of a device using a license, consuming one slot. |
Device identifier | A hashed machine identifier used to bind activations. |
Token | An Ed25519-signed offline credential with claims. |
exp | When the token must check in again — not the license expiry. |
vun | The license end date (may be empty for perpetual). |
ftr | Entitlements: boolean, numeric and quota. The client unlocks features from these. |
Seat | A member slot; when over the limit, last-joined members pause. |
Webhook | Notifications 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”.