Equos rooms run on LiveKit , so a native iOS or Android app can join a conversation using the official LiveKit SDKs—no Equos-specific mobile SDK required.
Your backend still creates the conversation the same way (see Backend ); the client just uses a different library to connect to the returned room.
Equos doesn’t currently ship a dedicated mobile SDK, but the official LiveKit SDKs give you everything you need to render the character’s video and send microphone audio.
The fields you need
From the backend response, forward these to your mobile app:
conversation.serverUrl — the LiveKit WebSocket URL
consumerAccessToken — the short-lived JWT the user connects with
conversation.character.livekitIdentity — the character’s participant identity (useful for filtering remote tracks)
iOS (Swift)
Install the LiveKit Swift SDK:
https://github.com/livekit/client-sdk-swift
Connect and attach the character’s video track:
import LiveKit
let room = Room ()
try await room. connect (
url : conversation. serverUrl ,
token : consumerAccessToken
)
// Enable the user's microphone
try await room. localParticipant . setMicrophone ( enabled : true )
// Subscribe to the character's tracks
room. add ( delegate : self )
// In RoomDelegate:
func room ( _ room : Room, participant : RemoteParticipant,
didSubscribeTrack publication : RemoteTrackPublication) {
if participant. identity ? . stringValue == conversation.character.livekitIdentity,
let videoTrack = publication.track as? VideoTrack {
videoView. track = videoTrack
}
}
LiveKit iOS docs Full reference for the Swift SDK.
Android (Kotlin)
Add the LiveKit Android SDK:
implementation ( "io.livekit:livekit-android:<latest>" )
Connect and render:
import io.livekit.android.LiveKit
import io.livekit.android.room.Room
val room = LiveKit. create (applicationContext)
room. connect (
url = conversation.serverUrl,
token = consumerAccessToken
)
room.localParticipant. setMicrophoneEnabled ( true )
// Attach the character's video track when it arrives
room.events. collect { event ->
if (event is RoomEvent.TrackSubscribed &&
event.participant.identity?. value == conversation.character.livekitIdentity) {
(event.track as ? VideoTrack)?. let { videoRenderer. bindTrack (it) }
}
}
LiveKit Android docs Full reference for the Android SDK.
Tips
The consumerAccessToken is short-lived. Don’t cache it—fetch a fresh conversation from your backend each time the user wants to start talking.
Never ship your Equos API key inside a mobile app. Only your backend should ever see it.