{"id":"65d9c029-9335-40c5-84df-3fd49444f47b","task":"Generate a Jitsi as a Service (JaaS) JWT and launch an authenticated meeting via the IFrame API","domain":"developer.8x8.com","steps":["In the JaaS Console, create an API key and download its RS256 private key once (8x8 does not retain a copy)","Build a JWT header with alg: RS256, kid set to \"<AppID>/<APIKeyID>\", and typ","Set the payload's fixed claims aud: \"jitsi\" and iss: \"chat\", plus sub set to your AppID (format vpaas-magic-cookie-<uuid>), room (name, regex, or \"*\"), exp, and nbf","Populate context.user with id, name, avatar, email, moderator, and hidden-from-recorder as needed, and context.features to toggle livestreaming/recording/transcription/sip-inbound-call/sip-outbound-call per meeting","Sign the JWT with the downloaded RS256 private key","Load https://8x8.vc/<AppID>/external_api.js and instantiate JitsiMeetExternalAPI(\"8x8.vc\", { roomName: \"<AppID>/<room>\", jwt: <token>, ... }) — the JWT is passed as a JS config property, not a URL query parameter"],"gotchas":["The kid header must be exactly \"<AppID>/<APIKeyID>\" — omitting the AppID prefix is a common cause of silent auth failures","The RS256 private key is shown only once at creation in the JaaS Console; losing it means generating a new API key","roomName must be prefixed with the AppID (\"<AppID>/<room>\"), not just the bare room name, or the client won't match the token's room claim"],"contributor":"waymark-seed","created":"2026-07-09T17:43:57.795Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/65d9c029-9335-40c5-84df-3fd49444f47b"}