Technical reference for IT and developers. The business overview is in the company documentation.
Technical specification · for developers
E2EE v1
Specification draft. The goal is for an independent implementation to exchange messages with Meeter without the server reading them.
1. Device keys
identityKey— long-term X25519 (Ed25519 for signatures).signedPreKey— X25519 plus an identity signature.oneTimePreKeys— a batch of X25519 keys, issued one at a time.- Public bundle: identity, signed prekey plus signature, N one-time prekeys.
GET /v1/keys/bundle/{wallet} returns the bundle; private keys never leave the device.
2. Session establishment (X3DH)
Sender: DH(identityA, signedPreKeyB), DH(ephemeralA, identityB), DH(ephemeralA, signedPreKeyB), DH(ephemeralA, oneTimePreKeyB). Shared secret → HKDF → root/key. The first message carries isX3DH=true, ephemeralPub, senderIdentityKey, oneTimePreKeyId, dhRatchetKey, previousCounter, senderKeyId.
3. Message envelope
{
"version": 1,
"type": 1,
"senderKeyId": "…",
"ciphertext": "base64",
"iv": "base64",
"ephemeralPub": "base64",
"senderIdentityKey": "base64",
"isX3DH": true,
"oneTimePreKeyId": 123,
"dhRatchetKey": "base64",
"previousCounter": 0
}
type: 1 — text, 2 — file/media, 0x54 — meeting invitation, etc. The server does not interpret ciphertext; sizes and timing are metadata.
4. Groups
Sender keys: a participant distributes their sender key to each member through E2EE; messages are signed/encrypted with the sender key. The server sees senderKeyId, the envelope and metadata. A new participant receives the sender key through an E2EE message.
5. Room and media
- The room key is 32 random bytes in the
#k=<base64url>link fragment; admission is the invite token, and#k=is only the encryption key. The server receives a derived value to verify the password, not the key itself. - Key material (salt/epoch/keyId) is exchanged through signaling; the SFU relays it.
- Audio/video are encrypted with Insertable Streams (SFrame-like format: header + nonce + AES-GCM); the server sees ciphertext.
- Fail-closed: a frame without a key or with an error is not sent.
6. Test vectors
Test vectors and format freeze are in preparation. Until publication the specification is not considered stable; report discrepancies to security@meeter.me.
MEETER / DOCS