Hello,
In the recent couple of days, we have discovered strange webhook behaviour from LiveKit. We set up our LiveKit cloud to send us all the room events in the API request so we can digest them and decide what to do with the users in our room.
We particularly rely on the “participant_joined” and “participant_left” events that tell us whether we should change the state of the participant on our side and kick off background workers to join or kick out users from our room.
What we noticed recently is that some of the requests (events) are not coming through. I tweaked the code to save every incoming request in our database and compare it with the LiveKit dashboard. Here are the results for one of the sessions:
LiveKit Dashboard:
We can clearly see two users joining the call. However, our database log shows only three events received per user from LiveKit:
Track unpublished (2026-02-17 18:11:47.745356000 +0000)
{“id”=>“EV_jT6Y4xyzXsjM”, “room”=>{“sid”=>“RM_nHPUfmxXrHry”, “name”=>“974b6e04-0617-4ae7-90f9-7202e5e998e9”}, “event”=>“track_unpublished”, “track”=>{“mid”=>“1”, “sid”=>“TR_AMNTtQxevMRbsr”, “codecs”=>[{“cid”=>“a769975c-cf87-480a-b18a-4c4732cfacae”, “mid”=>“1”, “mimeType”=>“audio/red”}], “source”=>“MICROPHONE”, “stream”=>“camera”, “version”=>{“unixMicro”=>“1771351848526591”}, “mimeType”=>“audio/red”, “audioFeatures”=>[“TF_AUTO_GAIN_CONTROL”, “TF_ECHO_CANCELLATION”, “TF_NOISE_SUPPRESSION”, “TF_ENHANCED_NOISE_CANCELLATION”], “backupCodecPolicy”=>“SIMULCAST”}, “createdAt”=>“1771351907”, “participant”=>{“sid”=>“PA_eU7nwP2s3FcN”, “identity”=>“ab7d6065-44a4-4385-b225-b95a490bf062”}}
Track unpublished (2026-02-17 18:11:47.832157000 +0000)
{“id”=>“EV_FtXjz39yTTYT”, “room”=>{“sid”=>“RM_nHPUfmxXrHry”, “name”=>“974b6e04-0617-4ae7-90f9-7202e5e998e9”}, “event”=>“track_unpublished”, “track”=>{“mid”=>“2”, “sid”=>“TR_VCdefG3gQEgBdD”, “type”=>“VIDEO”, “width”=>960, “codecs”=>[{“cid”=>“cce04437-8b43-4b1d-8626-d8ab400f8d51”, “mid”=>“2”, “layers”=>[{“rid”=>“q”, “ssrc”=>3327131374, “width”=>384, “height”=>216, “bitrate”=>180000, “repairSsrc”=>2873069519}, {“rid”=>“h”, “ssrc”=>2135938973, “width”=>960, “height”=>540, “bitrate”=>800000, “quality”=>“MEDIUM”, “repairSsrc”=>478939091, “spatialLayer”=>1}], “mimeType”=>“video/VP8”, “videoLayerMode”=>“ONE_SPATIAL_LAYER_PER_STREAM”}], “height”=>540, “layers”=>[{“rid”=>“q”, “ssrc”=>3327131374, “width”=>384, “height”=>216, “bitrate”=>180000, “repairSsrc”=>2873069519}, {“rid”=>“h”, “ssrc”=>2135938973, “width”=>960, “height”=>540, “bitrate”=>800000, “quality”=>“MEDIUM”, “repairSsrc”=>478939091, “spatialLayer”=>1}], “source”=>“CAMERA”, “stream”=>“camera”, “version”=>{“unixMicro”=>“1771351848863170”}, “mimeType”=>“video/VP8”, “simulcast”=>true}, “createdAt”=>“1771351907”, “participant”=>{“sid”=>“PA_eU7nwP2s3FcN”, “identity”=>“ab7d6065-44a4-4385-b225-b95a490bf062”}}
Disconnected state (2026-02-17 18:11:47.882257000 +0000)
{“id”=>“EV_gjAfUWxDwFcg”, “room”=>{“sid”=>“RM_nHPUfmxXrHry”, “name”=>“974b6e04-0617-4ae7-90f9-7202e5e998e9”, “version”=>{“unixMicro”=>“1771351846497978”}, “creationTime”=>“1771351846”, “emptyTimeout”=>300, “enabledCodecs”=>[{“mime”=>“video/H264”}, {“mime”=>“video/VP8”}, {“mime”=>“video/VP9”}, {“mime”=>“video/AV1”}, {“mime”=>“audio/red”}, {“mime”=>“audio/opus”}, {“mime”=>“audio/PCMU”}, {“mime”=>“audio/PCMA”}], “creationTimeMs”=>“1771351846495”, “departureTimeout”=>20}, “event”=>“participant_left”, “createdAt”=>“1771351907”, “participant”=>{“sid”=>“PA_eU7nwP2s3FcN”, “name”=>“gilberth obando”, “state”=>“DISCONNECTED”, “region”=>“oashburn1b”, “version”=>10, “identity”=>“ab7d6065-44a4-4385-b225-b95a490bf062”, “joinedAt”=>“1771351847”, “joinedAtMs”=>“1771351847544”, “permission”=>{“canPublish”=>true, “canSubscribe”=>true, “canPublishData”=>true}, “isPublisher”=>true, “d
isconnectReason”=>“CLIENT_INITIATED”}}
Do you know how I can debug it further to understand why requests are not coming through? Any help would be appreciated.
