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

# Session Manifest

> Verify the signed manifest an avatar sends in each session, which marks its video as AI-generated in a machine-readable form.

Next to the watermark in its video, every Beyond Presence avatar sends a signed manifest that marks the session as AI-generated. It is the machine-readable metadata layer described in [EU AI Act](https://docs.bey.dev/production/eu-ai-act.md), and anyone in the room can check that we issued it.

## How the Manifest Arrives

When the avatar starts publishing video, it sends the manifest to the room on the LiveKit data topic `bey-provenance`. A participant who joins later receives it on joining. The manifest is not sent in on-premises deployments.

The manifest is a compact JWS, signed with EdDSA over an Ed25519 key. Its claims are:

| Claim | Value |
| - | - |
| `iss` | `https://beyondpresence.ai` |
| `iat`, `exp` | When it was signed, and when it stops being valid, 10 minutes later |
| `room` | The name of the LiveKit room |
| `avatar_identity` | The LiveKit identity of the avatar participant |
| `session_id` | The ID of the avatar session |
| `started_at` | When the session started, in ISO 8601 |
| `claim_generator_info` | The software that signed it |
| `c2pa.actions.v2` | A [C2PA](https://spec.c2pa.org/) `c2pa.created` action whose `digitalSourceType` is `trainedAlgorithmicMedia` and whose `softwareAgent` names the avatar model |

## Verifying the Manifest

Any JOSE library that supports EdDSA can verify the manifest:

1. Check the signature with our public key, and check that `iss` is `https://beyondpresence.ai`.
2. Check that `exp` has not passed when you received the manifest.
3. Check that `room` is your room and that `avatar_identity` is the identity of the participant that sent it. A manifest copied from another session fails this check.

In Python, with [PyJWT](https://pyjwt.readthedocs.io/):

```python theme={null}
import jwt

claims = jwt.decode(
    token,
    PUBLIC_KEY_PEM,
    algorithms=["EdDSA"],
    issuer="https://beyondpresence.ai",
)
if claims["room"] != room.name:
    raise ValueError("The manifest is for another room")
if claims["avatar_identity"] != sender.identity:
    raise ValueError("The manifest is for another avatar")
```

## Public Key

The public key is:

```text theme={null}
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAN6fzxPCS7+rFgX3uPa/ETw3alaSDtfgGWuray6zIvvU=
-----END PUBLIC KEY-----
```

It is also published as a JWK Set at [`https://api.bey.dev/v1/session-manifests/keys`](https://api.bey.dev/v1/session-manifests/keys).


## Related topics

- [EU AI Act](https://docs.bey.dev/production/eu-ai-act.md)
- [List Speech-to-Video Sessions](https://docs.bey.dev/api-reference/speech-to-video-sessions/list-speech-to-video-sessions.md)
- [Retrieve Speech-to-Video Session](https://docs.bey.dev/api-reference/speech-to-video-sessions/retrieve-speech-to-video-session.md)
- [Create Speech-to-Video Session](https://docs.bey.dev/api-reference/speech-to-video-sessions/create-speech-to-video-session.md)
- [Retrieve Speech-to-Video Session Usage](https://docs.bey.dev/api-reference/usage/retrieve-speech-to-video-session-usage.md)


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