Skip to main content
SDK v7.x · Last verified March 2026 · iOS · Android · Web
Platform note — code samples below use TypeScript. Every method has an equivalent in the iOS (Swift) and Android (Kotlin) SDKs — see the linked SDK reference in each step.
import { RoomRepository, InvitationRepository } from '@amityco/ts-sdk';
import { Room as LiveKitRoom } from 'livekit-client';

// HOST: invite a co-host
await room.createInvitation('co-host-user-id');

// CO-HOST: poll for invitation & accept
const invitation = await room.getInvitation();
if (invitation?.status === 'pending') await invitation.accept();

// CO-HOST: get credentials & go live
const bd = await RoomRepository.getBroadcastData(room.roomId);
const lk = new LiveKitRoom();
await lk.connect(bd.coHostUrl, bd.coHostToken);
await lk.localParticipant.setCameraEnabled(true);
await lk.localParticipant.setMicrophoneEnabled(true);
Full walkthrough below ↓
Livestream showing host in main view and co-host Carla Philips in secondary view, with live chat messages and reaction emojis
Co-hosting lets multiple broadcasters share the stage during a live session. This guide covers both sides of the flow — the host sending and managing invitations, and the co-host accepting and joining the broadcast.
Prerequisites: A room must already exist and the host must be connected to LiveKit. See Go Live & Room Management first.

How Co-Hosting Works

RoleCan doCan’t do
HostSend / cancel invitations, remove co-hosts, stop room
Co-HostBroadcast audio + video, interact in chatStop room, send invitations
Invitation statuses:
StatusMeaning
pendingAwaiting the invitee’s response
approvedInvitee accepted — ready to join broadcast
rejectedInvitee declined
cancelledHost cancelled before invitee responded

Host Side

1

Send a co-host invitation

Invitations are sent one user at a time. The host must already have a room.
await room.createInvitation(userId);
To invite multiple co-hosts, call createInvitation once per user.
2

Track invitation status

Observe all invitations you’ve sent to show pending / accepted / declined states in your UI.
const unsubscribe = InvitationRepository.getInvitations(
  {
    targetId: roomId,
    targetType: InvitationTargetType.Room,
    limit: 20,
  },
  ({ data, loading, error }) => {
    if (data) {
      data.forEach(inv => console.log(inv.userId, inv.status));
    }
  },
);
3

Cancel a pending invitation

Cancel before the invitee responds — e.g., if you sent the wrong user.
await invitation.cancel();

Co-Host Side

1

Retrieve your invitations

Poll or observe your pending room invitations. Show them as an in-app notification or banner.
const unsubscribe = InvitationRepository.getMyRoomInvitations(
  { limit: 20 },
  ({ data }) => {
    const pending = data?.filter(inv => inv.status === 'pending');
    // Show pending invitations to the user
  },
);
2

Accept or decline

Present an “Accept / Decline” UI. Both operations are one-liners.
// Accept
await invitation.accept();

// Decline
await invitation.reject();
3

Join the broadcast

After accepting, fetch broadcast credentials and connect to LiveKit — same flow as the host.
const broadcastData = await RoomRepository.getBroadcastData(roomId);
const liveKitRoom = new LiveKitRoom();
await liveKitRoom.connect(broadcastData.coHostUrl, broadcastData.coHostToken);
await liveKitRoom.localParticipant.setCameraEnabled(true);
await liveKitRoom.localParticipant.setMicrophoneEnabled(true);

UIKit: Pre-Built Co-Host Components

If you’re using UIKit, the co-hosting UI is handled for you:
ComponentWhat it doesPlatforms
AmityLivestreamInviteCoHostPageFull-screen invite picker for the hostiOS, Android, Web
AmityLivestreamCoHostStageGrid layout showing all active co-hostsiOS, Android, Web
See the component reference → Livestream Components

Common Mistakes

Calling getBroadcastData before accepting — The co-host must accept the invitation first. Calling getBroadcastData while the invitation is still pending or rejected will fail.
Not listening for invitation status changes — Use the live collection (getInvitations / getMyRoomInvitations) instead of a one-shot fetch. Statuses update in real-time (e.g., host cancels while you’re looking at the invite).
Assuming the room is still live — Between the invitation and the accept, the host may have stopped the stream. Always check room.status === 'live' before calling getBroadcastData.

Best Practices

  • Show pending invitations as a prominent banner or bottom-sheet, not a buried list
  • Include the host’s display name and room title in the invitation UI
  • After accepting, navigate directly to a “Preparing to go live…” screen
  • If a co-host’s LiveKit connection drops, listen for RoomEvent.Disconnected and show a “Reconnecting” state
  • Give co-hosts a “Leave stage” button that disconnects from LiveKit without ending the room
  • The host should see a visual indicator when a co-host goes offline
  • Each co-host adds a video track — bandwidth and layout get complex above 4–6 hosts
  • Consider a grid layout that caps visible tiles and puts overflow in a scrollable strip
  • Test on lower-end devices to verify performance with multiple video tracks

Next Steps

Go Live & Room Management

Room creation, broadcast setup, and lifecycle management.

Live Chat & Engagement

Wire up chat, reactions, and viewer count alongside the video.

Product Tagging

Pin products to the stream for live commerce.