https://livekit.io logo
Join Slack
Powered by
# egress
  • a

    abundant-battery-76994

    10/03/2025, 7:31 PM
    Very rarely, I'll notice my participant egresses fail to record. Looking at the logs, it seems they never go from EGRESS_STARTING to EGRESS_ACTIVE, and then abort when the room is closed (I have short lived rooms). See attached screenshots for a failed lifecycle and successful one. Is it possible something in our system could prevent EGRESS_STARTING -> EGRESS_ACTIVE, or is that likely an issue on Livekit's end?
    c
    m
    a
    • 4
    • 11
  • b

    brainy-plastic-79052

    10/06/2025, 5:00 AM
    Hi guys, My query is can I deploy only egress self-hosted server and connect livekit cloud
  • p

    proud-match-31207

    10/07/2025, 5:16 AM
    Hello LiveKit team, Egress PR !974 -> Does this PR resolve for issues where setting the audioMixing to
    DUAL_CHANNEL_AGENT
    - dual-channel recording doesn’t maintain proper alignment between the two audio tracks. For example, if the user speaks at t0, the mono recording correctly places the speech at t0. However, in the dual-channel version, the user’s audio is shifted ahead of the agent’s audio. This makes it appear as though the agent is interrupting the user, when in reality the user had already finished speaking before the agent responded. If so - when is this being released to LiveKit cloud. Would appreciate your help
    c
    g
    a
    • 4
    • 14
  • m

    modern-finland-7869

    10/10/2025, 7:47 AM
    Hi all, I would like to get the EGRESS_ACTIVE timestamp and this is my current code: # Create LiveKit egress request _try_: req = api.RoomCompositeEgressRequest( _room_name_=room, _audio_only_=False, _video_only_=False, _stream_outputs_=[stream_output], ) except Exception as e: raise Exception(f"Failed to create LiveKit egress request: {str(e)}") # Start LiveKit egress _try_: lkapi = api.LiveKitAPI(LIVEKIT_SERVER_URL) res = await lkapi.egress.start_room_composite_egress(req) except Exception as e: raise Exception(f"Failed to start LiveKit egress: {str(e)}") Anyone knows how to request it?
  • m

    magnificent-glass-52894

    10/10/2025, 3:58 PM
    We are trying to record the video in 16:9 vertical layout and using custom layout. But when video gets stored and when we try to open in the mobile its always showing in horizontal 9:16 layout. Is this a limitation or can we customize this
  • c

    colossal-airport-19101

    10/11/2025, 8:53 AM
    Can someone help me with an issue in my egress_ended webhook? Sometimes when I try to fetch room metadata, I get "room not found"—it looks like the room is being deleted before I can access its metadata. Here’s the relevant part of my code:
    Copy code
    export async function POST(req: NextRequest) {
      const { event, egressInfo } = await receiver.receive(body, authHeader, true);
    
      if (event === "egress_ended") {
        const { metadata } = await GetRoom({ roomname: egressInfo.roomName });
        await DeleteRoom({ room_id: egressInfo.roomName });
      }
    
      return new NextResponse("ok", { status: 200 });
    }
    Earlier, getting metadata before deleting the room worked fine. Any suggestions on why this is failing now, or how I can make sure metadata is always available before deletion?
    c
    • 2
    • 7
  • f

    freezing-cat-41766

    10/13/2025, 3:20 PM
    Hello, I need to get more egress minutes because I consumed all free plan minutes, can subscribing to paid plan give me more?
    r
    • 2
    • 1
  • m

    modern-alarm-76237

    10/14/2025, 11:46 AM
    👋 Hey everyone, has anyone experienced audio artefacts or phasing effects when two participants speak at the same time in audio only recordings with Egress version 1.10.0? We have received reports from setups using two wired PCs with studio microphones and mixers, without cameras. The audio quality is excellent when only one person speaks, but as soon as both talk at the same time, noticeable artefacts appear even on the individual recorded tracks. It does not seem related to feedback or hardware setup, so we are wondering if this could be connected to how Egress processes simultaneous audio streams. Has anyone else noticed something similar or observed this in their tests? It would be great to compare experiences. 🙏
    c
    • 2
    • 25
  • s

    steep-scientist-53617

    10/14/2025, 10:59 PM
    Hi LiveKit team! I’m trying to enable Egress (Room Composite Recording) for our LiveKit Cloud project: • Project name: Amae Health • Project ID: p_2wjdtjm95gm When invoking the
    StartRoomCompositeEgress
    endpoint, I consistently receive a
    200 OK
    response with body
    "OK"
    , rather than the expected JSON payload described in the Egress API documentation (e.g., fields like
    "egressInfo"
    ,
    "egressId"
    ,
    "status"
    , etc.) Here is the exact command I am running:
    Copy code
    curl -X POST \
      <https://amae-health-6g1yw48y.livekit.cloud/twirp/livekit.cloud.Egress/StartRoomCompositeEgress> \
      -H "Authorization: Bearer $(uv run python -c 'import jwt,os,time; print(jwt.encode({"iss":os.getenv("LIVEKIT_API_KEY"),"sub":os.getenv("LIVEKIT_API_KEY"),"iat":int(time.time()),"exp":int(time.time())+60,"video":{"egress":True}}, os.getenv("LIVEKIT_API_SECRET"), algorithm="HS256"))')" \
      -H "Content-Type: application/json" \
      -d '{"roomName": "test-room", "audioOnly": true, "fileOutputs": [{}]}'
    and the response I just get is:
    Copy code
    OK
    From the docs, I’d expect a JSON response, even if the room doesn’t exist or the request is invalid (e.g.,
    {"code":5,"msg":"room not found"}
    ). Can you confirm whether Egress is currently enabled for our project, or if it needs to be provisioned manually on your side?
    q
    • 2
    • 3
  • b

    broad-holiday-7009

    10/15/2025, 10:03 PM
    We're running into intermittent errors when creating a room w/ livekit cloud (using the autoegress API) We're starting a livekit room w/ composite + track egress, and it will generally take a few seconds. In some sessions however, we're getting no egress and these errors cause livekit to hang for ~20 seconds waiting for the egress server before creating the room w/o egress entirely. We get back
    could not handle new participant
    and later in the logs in the StartEgress call: `failed to launch track egress``from an error of
    no response from servers
    Looking at the dashboard at these sessions, we have no egress data at all for them.
    Copy code
    ERROR	livekit	service/signal.go:184	could not handle new participant {
    	"room": "room-2025-10-15-11-13-23_e982e72f-c44e-48cf-b2f3-ed1a3b4ae48b", 
    	"participant": "user-a39a827a-eab0-47b1-b658-098159064cc8", 
    	"connID": "CO_EfJcJaEMezmG", 
    	"error": "no response from servers
    	}
    
    WARN	livekit.psrpc.EgressInternal.StartEgress	rpc/logging.go:66	client error {
    	"topic": [""], 
    	"request": {
    		"egressId": "EG_weWwkDWQuTGa", 
    		"track": {
    			"roomName": "room-2025-10-15-11-13-23_e982e72f-c44e-48cf-b2f3-ed1a3b4ae48b", 
    			"trackId": "TR_AMUMmK5cQZzCUe", 
    			"file": {"filepath": "{room_name}/{publisher_identity}+{track_source}+audio_tracks-{track_id}"}}, 
    			"roomId": "RM_49DekTT22n83"}, 
    		"response": null,
    		 "duration": "22.722132084s", 
    		 "error": "no response from servers"}
    
    ERROR	livekit.room	rtc/room.go:1175	failed to launch track egress	{
    	"room": "room-2025-10-15-11-13-23_e982e72f-c44e-48cf-b2f3-ed1a3b4ae48b", 
    	"roomID": "RM_49DekTT22n83", 
    	"error": "no response from servers"}
  • a

    abundant-activity-82320

    10/17/2025, 4:52 PM
    i use the livekit agents framework for telephony AI agents, and i record the phone calls with the egress feature. For every call recording, there is always a 20 s of padded silence at the end. Where is this behavior documented (maybe this https://github.com/livekit/livekit/blob/master/config-sample.yaml#L178)? and how can i turn off this behavior?
    • 1
    • 1
  • a

    agreeable-librarian-23707

    10/20/2025, 1:16 PM
    Hello channel! I’ve been using the web Egress product with RTMP as the stream output, and it’s been working perfectly fine. I've tried to use SRT as the output protocol (to a 3rd-party provider that generates HLS), but I’ve been seeing really poor video quality: noticeable pixelation (especially around faces) and occasional black frames. I’m using the
    H264_1080P_30
    encoding preset without overriding any
    EncodingOptions
    (so bitrate = 4500, GOP = 4s if I get it well). Has anyone else experienced similar quality issues when using SRT output? Should I be tweaking specific encoding parameters for better results?
  • h

    happy-journalist-67175

    10/20/2025, 9:19 PM
    Hey channel 👋 ! I work at onda.lol, a live auctions app and we use livekit heavily. We use web egresses to capture show recordings, but sometimes (around 10%) all that is captured is a gray screen with sound. Any idea why this would be happening in some cases?
    c
    • 2
    • 11
  • g

    glamorous-tiger-25082

    10/23/2025, 8:30 AM
    Hi, in the example config of self hosting egress, in the redis section, it is mentioned that
    address: must be the same redis address used by your livekit server
    . If I am using the livekit cloud for agent deployment, since the cloud is not exposing the redis details, how can I record my room audio using self hosted
    egress
    c
    • 2
    • 2
  • b

    bored-motorcycle-22550

    10/23/2025, 2:27 PM
    Hi there, I am using the Go Egress SDK and my service is hosted by LiveKit Cloud.
    egressClient = lksdk.NewEgressClient(host, apiKey, apiSecret)
    I need to pass extra information to a web hook about the egress instance. Hence, a custom
    webhook
    url is needed with a query parameter. Regarding the
    SigningKey
    in the following, what should I include? Is this my LK
    apiKey
    ?:
    Copy code
    &livekit.RoomCompositeEgressRequest{
    	RoomName: room,
    	Layout:   "grid",
    	Webhooks: []*livekit.WebhookConfig{
    		{
    			Url:        "<https://example.com/webhook?additionalInfo=something>",
    			SigningKey: _, // What should go here?
    		},
    	},
    },
    On the receiving end, I am using
    event, err := webhook.ReceiveWebhookEvent(request, authProvider)
    with my
    apiKey
    and
    apiSecret
    for the
    authProvider
    .
  • g

    glamorous-oil-12326

    10/27/2025, 6:05 PM
    I have tried the
    DUAL_CHANNEL_AGENT
    and
    DUAL_CHANNEL_ALTERNATE
    . However, I am not getting a dual channel output, when I re-listen to the recording (I can hear it in both speakers). I should flag, my agent does have background audio - is this causing issues?
    c
    • 2
    • 1
  • s

    stale-orange-63834

    10/29/2025, 7:46 AM
    Hi Team, I am using the
    tracks
    in
    RoomEgress
    to get get all tracks. Currently the video tracks are in webm and audio in ogg format. Is there any option to customise it so that audio is mp3 and video is mp4
  • c

    chilly-crowd-70471

    10/29/2025, 7:52 AM
    Hi! I am currently trying to implement a feature that shows the video and transcript together in one view. We would like to jump forwards in the transcript as the recording progresses. My question is: Is there any way to get an exact timestamp for when the video started? Sort of a timestamp for the first frame? Without this, it is very difficult to make relative timestamps to the video. Any insight would be much appreciated 🙇
    r
    d
    • 3
    • 7
  • s

    swift-room-83617

    11/02/2025, 9:25 PM
    Is there a reason that the Egress info doesn't give the full rtmp stream url?
    Copy code
    stream":{"info":[{"url":"<rtmp://example.url/{1_...up}>", "started_at":"1762113782657219894", "ended_at":"0", "duration":"0", "status":"ACTIVE", "error":""}]}
    It updated the stream key to
    {aa...bb}
    , is this for security purposes, or is there a way to get the full url? This is for the api endpoint "/twirp/livekit.Egress/ListEgress";
  • f

    fast-ram-26210

    11/03/2025, 7:06 AM
    Hello All Is there any one now how to store video recording in local using python ( How to start recording and stop and store ). Please let me know if any one have any idea. I Do this but its not working
    Copy code
    lkapi = api.LiveKitAPI(
                LIVEKIT_URL,
                LIVEKIT_API_KEY,
                LIVEKIT_API_SECRET
            )
            <http://log.info|log.info>("----------------------room coposite start ")
            room_composite = api.RoomCompositeEgressRequest(
                room_name=room_name,
                layout="grid",  # Options: "grid" or "speaker"
                audio_only=False,
                video_only=False,
                file_outputs=[
                    api.EncodedFileOutput(
                        file_type=api.EncodedFileType.MP4,
                        filepath=f"recordings/{room_name}-{int(asyncio.get_event_loop().time())}.mp4"
                    )
                ]
            )
    getting this issue TwirpError(code=invalid_argument, message=request has missing or invalid field: output, status=400)
  • b

    big-controller-60015

    11/03/2025, 12:50 PM
    i have a question related to billing, if a bot joins a room and then egress joins that room but no tracks are subscrbied for 180 mins and egress aborts, does that time still get considered into the bill??
    c
    • 2
    • 2
  • m

    millions-summer-28140

    11/05/2025, 6:04 AM
    Hello All, I m working on livekit egress project. how can i use self hosted livekit and egress cloud for recording processing and save it to s3. everything is working fine just the recording is not saving to s3 and it says a message "room_not_ready" however i was ready and agent is communicating with the user.
    c
    • 2
    • 2
  • f

    fancy-wire-90172

    11/06/2025, 12:58 PM
    Hello All, I am stuck with this...Can anyone help... 🔴 EGRESS STUCK IN STANDALONE MODE - NEED SERVICE MODE Setup: - LiveKit Server: 1.9.1 (self-hosted on Ubuntu 24.04) - Egress: 1.10.0 (Docker, livekit/egress:latest) - Redis: 7.0.15 Problem: Egress logs consistently show: "simple": true, "clusterID": "" Even when I add cluster_id to egress.yaml, it still runs in standalone mode. LiveKit server returns "no response from servers" when trying to start recording. Tests Performed: ✅ Network connectivity works (curl from Egress to LiveKit returns 200) ✅ SSL/TLS handshake successful (openssl s_client test passes) ✅ Redis is running and accessible (can connect from both services) ✅ Video calls work perfectly (2+ participants, audio/video working) ✅ Egress container is healthy (Docker healthcheck passes) ❌ Egress NOT registering in Redis (KEYS "*egress*" returns empty) ❌ No egress-related keys in Redis (KEYS "*NE_*" returns empty) Error When Recording: { "code": "unavailable", "msg": "twirp error unknown: no response from servers" } Egress Logs: 2025-11-04T162314.980Z INFO egress redis/redis.go:142 connecting to redis {"nodeID": "NE_8YkYcNMMjF6M", "clusterID": "", "simple": true, "addr": "127.0.0.1:6379"} 2025-11-04T162314.983Z INFO egress server/server.go:148 service ready {"nodeID": "NE_8YkYcNMMjF6M", "clusterID": ""} Even when cluster_id was set to "main_cluster", logs showed: {"nodeID": "NE_EkuzKPqRubq2", "clusterID": "main_cluster", "simple": true} ^^^^^^^^^^^^^^^^ Still in simple mode! Questions: 1. How do I switch Egress from standalone mode to service mode? Is there a config option I'm missing? 2. Does LiveKit 1.9.1 support cluster_id configuration? When I add cluster_id to livekit.yaml, the server crashes with: Error: "field cluster_id not found in type config.Config" 3. Is there a version incompatibility between LiveKit 1.9.1 and Egress 1.10.0? Should I downgrade Egress or upgrade LiveKit? 4. What's the minimum LiveKit version that supports Egress service discovery? Current Configurations: egress.yaml:
    Copy code
    yaml
    log_level: info
    api_key: LIVE_KIT_API_KEY
    api_secret: LIVE_KIT_API_SECRET
    ws_url: <wss://video.XYZ.com>
    redis:
     address: 127.0.0.1:6379
     password: REDISPASSWORD
    s3:
     access_key: ACCESS_KEY
     secret: SECRET
     region: us-west-2
     bucket: BUCKET_NAME
    livekit.yaml:
    Copy code
    yaml
    port: 7880
    rtc:
     node_ip: “XX.XX.XX.XX.
     use_external_ip: true
    keys:
     LIVEKIT_API_KEY: LIVEKIT_API_SECRET
    redis:
     address: 127.0.0.1:6379
     password: REDIS_PASSWORD
    # NOTE: Cannot add cluster_id here - causes crash
    Docker Setup: - Network mode: host - Volume: /etc/livekit/egress.yaml/etc/egress.yamlro - Environment: EGRESS_CONFIG_FILE=/etc/egress.yaml What We've Tried: 1. Added cluster_id to egress.yaml → Still shows "simple": true 2. Added cluster_id to livekit.yaml → Server crashed 3. Changed ws_url to ws://localhost:7880 → Same error 4. Verified all network connectivity → All tests pass The application code is working perfectly. This is purely an infrastructure/configuration issue. Any help would be greatly appreciated! 🙏
  • b

    big-summer-57969

    11/07/2025, 10:26 AM
    I would like to know the status of
    audio_mixing
    , Im trying to use the
    DUAL_CHANNEL_AGENT
    , but it does not make a difference. I read i need to ask for it to be enabled on my account ? 🤔
    r
    • 2
    • 3
  • m

    many-cartoon-42984

    11/08/2025, 8:51 PM
    Hi. We’re running composite egress via their REST/Twirp APIs. Sessions show the rooms and egress IDs being created successfully. Our poller first calls POST /twirp/livekit.Egress/GetEgressInfo (Basic auth), falling back to GET /v1/egress/{id} (Bearer service token) whenever Twirp returns twirp_invalid_route or 401. Both endpoints respond—Twirp with twirp_invalid_route, REST with a plain 200 OK and no JSON—so we never receive status, file URLs, or errors for the egress job. Could they confirm the correct endpoint/auth for retrieving composite egress status on LiveKit Cloud, and why the REST response might be missing the JSON payload?
  • a

    alert-plumber-51439

    11/09/2025, 10:35 AM
    HI guys i hope you all are doing welll. if i use meet.livekit.io to join the video call. will it helps us to trigger self hosted egress to record video via webhook that is configured in livekit.yaml file and where where egress is running on seperate vm.
  • c

    calm-article-62769

    11/11/2025, 5:12 AM
    Hi team, We’re setting up LiveKit Egress in our agent running on LiveKit Cloud to upload recordings directly to an S3 bucket in our AWS account. I wanted to confirm whether LiveKit currently supports using an AWS IAM Role directly — i.e., without providing long-lived
    access_key
    and
    secret_key
    credentials in the S3 configuration. Our goal is to allow the LiveKit Cloud Egress service to assume a role in our AWS account that has limited permissions such as
    s3:PutObject
    and
    s3:PutObjectAcl
    , instead of using static credentials. For example, something like:
    Copy code
    s3 = api.S3Upload(
        bucket="my-bucket",
        region="us-east-1",
        assume_role_arn="arn:aws:iam::<account-id>:role/LiveKitEgressRole"
    )
    …without specifying
    access_key
    or
    secret
    . Could you please confirm: • Does LiveKit Cloud Egress currently support this kind of role-based access (i.e., direct cross-account assume-role)? • If yes, does LiveKit Cloud provide or support a stable AWS principal (like an account ID or role ARN) that customers can include in their trust or bucket policy? • Does it support using an External ID when assuming a customer’s role (for cross-account security)?
  • c

    cold-belgium-91163

    11/12/2025, 9:00 AM
    Does Participant reconnection works in "Room Composite egress" in egress latest version of server-sdk-go? Currently using version 2.4.1 of server-sdk-go .. and reconnected participant is not getting mixed with existing participants.
  • l

    lively-terabyte-73999

    11/13/2025, 6:10 AM
    @refined-appointment-81829 I am trying to set up a dispatch callee room with auto egress. but once i save it in livekit dashboard. the egress rule is not present. Would appreciate your help with this.
    Copy code
    {
      "sipDispatchRuleId": "SDR_U*******",
      "rule": {
        "dispatchRuleCallee": {
          "roomPrefix": "sip-*******",
          "randomize": true
        }
      },
      "trunkIds": [
        "ST_8Hz******"
      ],
      "name": "Agent Dispatch Rule",
      "roomConfig": {
        "agents": [
          {
            "agentName": "agent_01jzw0r9syepa8*********",
            "metadata": "{\n\"tenant_id\": \"68cbbe52fe7ff19*******\",\n\"is_sip_flow\": true,\n\"call_type\": \"inbound\",\n\"caller_name\": \"James\"\n}"
          }
        ],
        "egress": {
          "tracks": {
            "fileType": "OGG",
            "filepath": "livekit/room/{roomname}/{publisher_identity}/{track_id}-{time}.ogg",
            "output": {
              "case": "s3",
              "value": {
                "bucket": "***********",
                "region": "************",
                "accessKey": "***********",
                "secret": "****************"
              }
            }
          }
        }
      }
    }
  • c

    cold-belgium-91163

    11/13/2025, 1:45 PM
    I am trying to run "room-composite" egress Joined 2 participants. Disconnect one participant and joined him again. But after rejoining , only the audio of reconnected participant came in the audio file and exiting participant audio is missing after the reconnection happened . Using This commit of server-sdk-go: https://github.com/livekit/server-sdk-go/commit/36db9bf95ff39934e928713bf348a2690f0964a0 Observed long diff in their PTS LOg file attached. Can someone help here please.
    c
    • 2
    • 1