> ## 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.

# Verify a license publicly

> Check an Omnichar license with its key and the .char it came in, without an API key: valid, revoked, expired, not found or mismatch, with its scope, dates and an in-scope answer.

Anyone holding a license key **and the `.char` file it came in** can check it. This endpoint needs no API key, so a publisher, platform or agency can confirm a license before using the work. A key on its own is not enough: the check also takes the `signature` from the license block inside the file, so a key copied from somewhere else proves nothing.

`GET /v1/licenses/{key}/verify?signature=...`

Read the signature from the file's manifest, then ask:

```bash theme={null}
SIG=$(unzip -p character.char manifest.json | jq -r .reserved.license.signature)
curl -s "https://api.omnichar.org/v1/licenses/lic_live_Q2x8.../verify?signature=$SIG&use=advertising&media=tv&territory=SE"
```

`signature` is required. Without it the request is refused.

```json theme={null}
{
  "status": "valid",
  "key": "lic_live_Q2x8...",
  "env": "production",
  "char_id": "7f1c2a9e-...",
  "char": { "subject_id": "talent-0142", "version": 2 },
  "provider": { "team_id": "2c0d...", "name": "OWND" },
  "licensee_team_id": "91aa...",
  "scope": { "use": "advertising", "media": ["tv", "social"], "territories": ["SE", "NO"], "allow_list": [] },
  "scope_version": 1,
  "starts_at": "2026-12-01T00:00:00.000Z",
  "ends_at": "2027-06-01T00:00:00.000Z",
  "signature": "kR0...",
  "kid": "live-2026-11-09",
  "in_scope": true
}
```

`status` is one of:

| Status | Meaning |
| - | - |
| `valid` | Active, after `starts_at` and before `ends_at`. |
| `pending` | Issued, but not in force yet: either `starts_at` has not come, or the licensee was named by an email that has no Omnichar account yet. `in_scope` is always `false`. |
| `revoked` | The provider revoked it. |
| `expired` | `ends_at` has passed. |
| `not_found` | No license has that key. The answer then holds only `status` and `key`. |
| `mismatch` | A license has that key, but the signature you sent is not its signature: the file carries a different license, or an older copy of this one that was signed again. The answer holds only `status` and `key`. |

A sandbox license (`lic_test_...`) always answers with `"env": "sandbox"` and `"test": true`. Treat it as a test, never as permission.

`char` names the character by the `subject_id` the provider gave it and the version the license covers, so you can match the answer to a file's manifest without learning who the person is.

The licensee is given as a team id only, never by name. While a license waits for its licensee to sign up, `licensee_team_id` is `null`.

## Checking scope

Add any of `use`, `media` and `territory` as query parameters to get `in_scope`. It is `true` only when the license is `valid` and every parameter you sent matches the scope, ignoring case. A license whose territories include `worldwide` matches every territory.

## Checking offline

The `signature` and `kid` let you confirm the license was issued by Omnichar without calling us again. See [Verify a license signature offline](https://docs.omnichar.org/api/verify-licenses-offline.md).

## Without code

To check a license, open [cloud.omnichar.org/verify](https://cloud.omnichar.org/verify). No sign-in is needed. Paste the license key and add the `.char` it came with; the page checks only when it has both, and says so if the file carries a different license. The page reads the file in your browser and never uploads it.

An image or video made with Omnichar names the license it was made under, but carries no signature, so it cannot be verified on its own. Drop it on the page to see which license it names, then add that license's `.char`.

Verify is limited to 60 requests a minute per client address.


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