Steps to reproduce
- Use a self-hosted Synapse 1.150.0 homeserver configured for MatrixRTC with LiveKit and lk-jwt-service.
- Configure /.well-known/matrix/client with org.matrix.msc4143.rtc_foci pointing to the LiveKit JWT service.
- Enable in Synapse:
- experimental_features.msc3266_enabled: true
- experimental_features.msc4222_enabled: true
- experimental_features.msc4143_enabled: true
- matrix_rtc.transports with type: livekit and the correct livekit_service_url
- Sign in to Element X Android on this homeserver.
- Open a DM or room and try to start a call.
- Watch Synapse logs during the attempt.
Outcome
What did you expect?
Element X should successfully discover the MatrixRTC transport and start the call flow, or at minimum request the rtc/transports endpoint with the user's access token.
What happened instead?
Element X shows that the server is not configured to work with Element Call and fails with:
MISSING_MATRIX_RTC_TRANSPORT
In Synapse logs, Element X requests:
GET /_matrix/client/unstable/org.matrix.msc4143/rtc/transports
without an access token, receives:
401 Missing access token
and then proceeds to request an OpenID token afterwards.
The same rtc/transports endpoint works correctly when called manually with a valid bearer access token, returning:
{"rtc_transports":[{"type":"livekit","livekit_service_url":"https://site.com/livekit/jwt"}]}
So the server-side endpoint exists and works, but Element X appears to call it unauthenticated.
Relevant Synapse log lines:
Element X:
GET /_matrix/client/unstable/org.matrix.msc4143/rtc/transports -> 401 Missing access token
User-Agent: Element X/26.03.3 (...)
Then:
POST /_matrix/client/v3/user/@Stive:site.com/openid/request_token -> 200
Manual verification with bearer token:
GET /_matrix/client/unstable/org.matrix.msc4143/rtc/transports -> 200
{"rtc_transports":[{"type":"livekit","livekit_service_url":"https://site.com/livekit/jwt"}]}
Your phone model
Samsung SM-S938B
Operating system version
Android 16
Application version and app store
Element X 26.03.3
Homeserver
Self-hosted Synapse 1.150.0 on site.com with LiveKit 1.10.1 and lk-jwt-service 0.4.1
Will you send logs?
Yes
Are you willing to provide a PR?
No
Steps to reproduce
Outcome
What did you expect?
Element X should successfully discover the MatrixRTC transport and start the call flow, or at minimum request the rtc/transports endpoint with the user's access token.
What happened instead?
Element X shows that the server is not configured to work with Element Call and fails with:
MISSING_MATRIX_RTC_TRANSPORT
In Synapse logs, Element X requests:
GET /_matrix/client/unstable/org.matrix.msc4143/rtc/transports
without an access token, receives:
401 Missing access token
and then proceeds to request an OpenID token afterwards.
The same rtc/transports endpoint works correctly when called manually with a valid bearer access token, returning:
{"rtc_transports":[{"type":"livekit","livekit_service_url":"https://site.com/livekit/jwt"}]}
So the server-side endpoint exists and works, but Element X appears to call it unauthenticated.
Relevant Synapse log lines:
Element X:
GET /_matrix/client/unstable/org.matrix.msc4143/rtc/transports -> 401 Missing access token
User-Agent: Element X/26.03.3 (...)
Then:
POST /_matrix/client/v3/user/@Stive:site.com/openid/request_token -> 200
Manual verification with bearer token:
GET /_matrix/client/unstable/org.matrix.msc4143/rtc/transports -> 200
{"rtc_transports":[{"type":"livekit","livekit_service_url":"https://site.com/livekit/jwt"}]}
Your phone model
Samsung SM-S938B
Operating system version
Android 16
Application version and app store
Element X 26.03.3
Homeserver
Self-hosted Synapse 1.150.0 on site.com with LiveKit 1.10.1 and lk-jwt-service 0.4.1
Will you send logs?
Yes
Are you willing to provide a PR?
No