Skip to main content
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.