Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/faraasaaay/inner/llms.txt

Use this file to discover all available pages before exploring further.

Every InnerTube API request is stamped with a client identity — a bundle of clientName, clientVersion, clientId, and userAgent that YouTube uses to route requests to the correct response format and apply the appropriate service restrictions. Inner ships 21 named presets covering web, Android, iOS, TV, and VR surfaces.
For most browse and search operations you do not need to specify a client — Inner uses WEB_REMIX by default. Client selection matters most for the player() call.

Client structure

@Serializable
data class YouTubeClient(
    val clientName: String,           // e.g. "WEB_REMIX"
    val clientVersion: String,        // e.g. "1.20260114.01.00"
    val clientId: String,             // e.g. "67"
    val userAgent: String,            // HTTP User-Agent header

    // Optional device fields — used for Android/iOS clients
    val osName: String? = null,
    val osVersion: String? = null,
    val deviceMake: String? = null,
    val deviceModel: String? = null,
    val androidSdkVersion: String? = null,
    val buildId: String? = null,
    val cronetVersion: String? = null,
    val packageName: String? = null,
    val friendlyName: String? = null,

    // Behaviour flags
    val loginSupported: Boolean = false,      // can attach login cookies
    val loginRequired: Boolean = false,       // must have login to function
    val useSignatureTimestamp: Boolean = false,// include sig timestamp in player requests
    val isEmbedded: Boolean = false,          // attach ThirdParty embedUrl to player context
)
  • loginSupported — when true and setLogin = true, Inner attaches the cookie and Authorization: SAPISIDHASH headers to requests made with this client.
  • loginRequired — when true, the client will not return useful responses without an authenticated session.
  • useSignatureTimestamp — when true, the player request body includes a signatureTimestamp from the player’s JS file, which is needed to decrypt stream signatures.
  • isEmbedded — when true, the player request body includes a thirdParty.embedUrl field pointing to the request origin.

Built-in presets

NameclientNameclientIdloginSupporteduseSignatureTimestampNotes
WEBWEB1Standard web client; used for transcript endpoint
WEB_REMIXWEB_REMIX67YouTube Music web; default for all browse, search, and next
WEB_CREATORWEB_CREATOR62YouTube Studio; login required
WEB_MUSICWEB_REMIX67Alias for WEB_REMIX with a friendlyName label
WEB_SAFARIWEB1WEB with a macOS Safari user-agent
WEB_EMBEDDEDWEB_EMBEDDED_PLAYER56Embedded player; isEmbedded = true
MWEBMWEB2Mobile web (Chrome/Android)
IOSIOS5iOS YouTube app (iPhone)
IPADOSIOS5iOS YouTube app (iPad), same clientId as IOS
IOS_MUSICIOS_MUSIC26iOS YouTube Music app
MOBILEANDROID3Android YouTube app (Pixel 9 Pro)
ANDROID_MUSICANDROID_MUSIC21Android YouTube Music app (Pixel 9 Pro)
ANDROID_CREATORANDROID_CREATOR14Android YouTube Studio app
ANDROID_TESTSUITEANDROID_TESTSUITE30Internal test client; no login
ANDROID_UNPLUGGEDANDROID_UNPLUGGED29Android YouTube TV (live/cable)
ANDROID_VR_NO_AUTHANDROID_VR28Quest 3 VR client v1.37; no login
ANDROID_VR_1_61_48ANDROID_VR28Quest 3 VR client v1.61.48; no login
ANDROID_VR_1_43_32ANDROID_VR28Quest 3 VR client v1.43.32; no login
TVHTML5TVHTML57Smart TV (Samsung); login required
TVHTML5_SIMPLY_EMBEDDED_PLAYERTVHTML5_SIMPLY_EMBEDDED_PLAYER85PlayStation TV; login required, isEmbedded = true
VISIONOSVISIONOS101Apple Vision Pro; no login

Default clients

Inner selects clients automatically for most operations:
  • WEB_REMIX — used for all search, browse, home feed, artist, album, playlist, queue, library, search-suggestion, and next (related queue) endpoints.
  • WEB — used for the transcript endpoint where the full YouTube web client context is expected.
For player() calls you always supply the client explicitly because the choice directly affects stream availability and service integrity requirements.

Choosing a client for playback

Web clients

WEB, WEB_REMIX, WEB_CREATOR, MWEB, WEB_EMBEDDEDBroad stream availability. PoTokens required for service integrity (see the PoTokens concept). WEB_REMIX and WEB_CREATOR support login and use a signature timestamp.

iOS clients

IOS, IOS_MUSIC, IPADOSTypically work without PoTokens. loginSupported = false on all three, so they cannot attach session cookies. Good choice when you want reliable playback without token overhead.

Android clients

MOBILE (ANDROID), ANDROID_MUSIC, ANDROID_CREATOR, ANDROID_UNPLUGGEDAndroid-specific user-agents. MOBILE, ANDROID_MUSIC, ANDROID_CREATOR, and ANDROID_UNPLUGGED all support login. Do not require PoTokens under normal conditions.

TV clients

TVHTML5, TVHTML5_SIMPLY_EMBEDDED_PLAYERRequire login (loginRequired = true). Use the youtube.com origin rather than music.youtube.com. Subject to service integrity checks similar to web clients.

Example — passing a client to the player

import com.tamed.music.innertube.YouTube
import com.tamed.music.innertube.models.YouTubeClient

val playerResponse = YouTube.player(
    videoId = "dQw4w9WgXcQ",
    playlistId = null,
    client = YouTubeClient.IOS
).getOrThrow()
Swap YouTubeClient.IOS for any of the presets in the table above. If the chosen client has useSignatureTimestamp = true you should also pass a valid signatureTimestamp obtained from the player JavaScript file; otherwise Inner passes null and YouTube may reject cipher-protected streams.

Build docs developers (and LLMs) love