> For AI agents: the documentation index is at https://docs.gethandup.dev/llms.txt. Append .md to any page URL (without the trailing slash) for Markdown, for example https://docs.gethandup.dev/cli.md.

# license_get

`GET /v1/license`

Trial and license state. `locked` means new requests are refused with HTTP 402 (`code: license_required`); pending requests stay decidable. Development builds report `not_enforced`.

## Responses

### 200

Media type: `application/json`

`object`

`GET`/`PUT`/`DELETE /v1/license` response.

- **state** (required): `string`

  Allowed values: `not_enforced` `trial` `expired` `licensed` `revoked`

- **locked** (required): `boolean`

  True when new requests are refused (`expired` or `revoked`).

- **enforced** (required): `boolean`

  False in development builds; release builds always enforce.

- **trial_days_left**: `integer | null` format: int64, >= 0

  Whole days left in the trial (rounded up); null once licensed.

- **trial_ends_at** (required): `integer` format: int64, >= 0

  Unix ms when the trial ends (ended).

- **display_key**: `string | null`

  Masked key, `****-XXXXXX`, from the installed license.

- **email**: `string | null`
- **issued_at**: `string | null`

  When gethandup.dev signed the license (RFC 3339).

- **checked_at**: `integer | null` format: int64, >= 0

  Unix ms of the last successful online check with Polar.

- **revoked_reason**: `string | null`

  Why the license is revoked (`revoked`, `disabled`, `not found`, ...).

- **message**: `string | null`

  How to fix a locked daemon; null otherwise.

- **buy_url** (required): `string`
