> ## Documentation Index
> Fetch the complete documentation index at: https://docs.omnichar.org/llms.txt
> Use this file to discover all available pages before exploring further.

# The license in a .char file

> The reserved.license block a licensee's .char carries: its fields, and how to verify it offline with the published Ed25519 keys and check revocation online.

A `.char` a licensee downloads with [`POST /v1/licenses/{key}/download`](https://docs.omnichar.org/api/licensed-characters#downloading-the-char) is their own copy. Its `manifest.json`, the first file in the archive, carries the license under `reserved.license`, beside the provider's `reserved.provider` block. Older readers ignore both.

```json theme={null}
{
  "reserved": {
    "provider": { "team_id": "2c0d...", "char_id": "7f1c2a9e-...", "version": 2, "receipt": { "receipt_id": "rcpt_8812" } },
    "license": {
      "v": 1,
      "key": "lic_live_Q2x8...",
      "env": "production",
      "kid": "live-2026-11-09",
      "signature": "kR0...",
      "char_id": "7f1c2a9e-...",
      "provider_team_id": "2c0d...",
      "licensee_team_id": "91aa...",
      "scope": { "use": "advertising", "media": ["image", "video"], "territories": ["SE", "NO"], "allow_list": [] },
      "scope_version": 1,
      "starts_at": "2026-12-01T00:00:00.000Z",
      "ends_at": "2027-06-01T00:00:00.000Z"
    }
  }
}
```

| Field | Meaning |
| - | - |
| `key` | The license key. |
| `env` | `production` or `sandbox`. |
| `kid` | Which published key signed it. |
| `signature` | Ed25519 over every other field in the block, base64url. |
| `char_id`, `provider_team_id`, `licensee_team_id` | The character and the two teams. |
| `scope`, `scope_version` | What the license allows; see [Licenses](https://docs.omnichar.org/api/licenses.md#scope). |
| `starts_at`, `ends_at` | When it is valid. |

## Verifying it

1. Take `reserved.license` and remove `signature`. What is left is exactly the signed fields.
2. Find the key with the same `kid` in `GET /v1/.well-known/license-keys`.
3. Check the signature over the canonical JSON of those fields, as in [Verify licenses offline](https://docs.omnichar.org/api/verify-licenses-offline.md).
4. Check that now is between `starts_at` and `ends_at`.

A valid signature proves Omnichar issued the license and that nothing in the block was changed. It cannot show a revocation, so when you have a network, also call [`GET /v1/licenses/{key}/verify`](https://docs.omnichar.org/api/verify) and treat anything other than `valid` as not licensed.

If a license is signed again, as when a licensee named by email signs up, the next download is a new copy with the new signature.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.