client.license
client.license — the license operations.
On AsyncKindgi every method is the same, awaited.
client.license.get()
Section titled “client.license.get()”get(*, timeout: float | None = None) -> LicenseStatusWhere the deployment's license key stands. GET /v1/license
Whose key, which use, until when and how many days are left, and from 30 days before it expires how to get the next one, as the runtime's startup banner says it. Never the key itself. mode: development when the runtime runs with KINDGI_DEV and needs no key. The license is the deployment's: its own token (KINDGI_API_TOKEN), or a system key holding system:license (the renewal job's), reads all of it, renew with where the deployment keeps its key included. Where the deployment serves exactly one tenant, that tenant's admins read the countdown only (mode, standing, expiresAt, startsUntil, daysLeft, renewBy): never whose key it is or where it's kept. Anyone else is refused. A deployment that doesn't report it answers 404.
client.license.usage()
Section titled “client.license.usage()”usage(*, since: str, timeout: float | None = None) -> LicenseUsageHow much the deployment was used since a time. GET /v1/license/usage
What a free license key's renewal carries (kindgi license renew --runtime): the runs started since since (not dry runs, replays, evals or child runs), the distinct people who started runs or decided approvals (counted in each tenant and summed, so a person in two tenants counts twice), the projects in production when the runtime can put projects in production (PUT /v1/projects/{projectId}/production), and the runtime's version. Counts only: no content, names or ids. Only the deployment's own token (KINDGI_API_TOKEN), or a system key holding system:license, reads it; anyone else is refused (license-operator-only), and the refusal recorded, before since is read. A deployment that doesn't report it answers 404.