For the complete documentation index, see llms.txt. This page is also available as Markdown.

Cast 2.0

Get streamer token

post
/cast/streamer-token

Generates LiveKit credentials for a streamer to broadcast in a scene. This endpoint validates a streaming token and provides the necessary credentials for a streamer to connect to the LiveKit room and start streaming. No authentication required - uses streaming token for validation.

Body
tokenstringRequired

Streaming token for authentication

identitystringRequired

Display name for the streamer

Responses
200

Streamer token generated successfully

application/json
urlstringRequired

LiveKit connection URL

tokenstringRequired

LiveKit JWT token for authentication

roomIdstringRequired

LiveKit room ID

identitystringRequired

Unique internal identity for the streamer

post/cast/streamer-token
POST /cast/streamer-token HTTP/1.1
Host: comms-gatekeeper.decentraland.org
Content-Type: application/json
Accept: */*
Content-Length: 34

{
  "token": "text",
  "identity": "text"
}
{
  "url": "text",
  "token": "text",
  "roomId": "text",
  "identity": "text"
}

Get watcher token

post
/cast/watcher-token

Generates LiveKit credentials for a watcher to view streams in a location. This endpoint allows users to join as viewers in a specific location (parcel or world) and watch active streams.

Requires Signed Fetch authentication from a wallet (a decentraland-kernel-scene signer is rejected: viewers are end users, not scenes). A verified wallet is required because watchers join the scene's real comms room, so both scene bans and platform bans are enforced against it — either one is rejected with 403.

Authorizations
x-identitystringRequired

Signed Fetch authentication for scene-based requests. Requires a chain of identity headers:

  • x-identity-auth-chain-0: Signer information
  • x-identity-auth-chain-1: Ephemeral key information
  • x-identity-auth-chain-2: Signed entity information
  • x-identity-timestamp: Request timestamp
  • x-identity-metadata: Request metadata Used for authentication from decentraland-kernel-scene.
Body
locationstringRequired

Location (parcel coordinates or world name)

Example: 20,-4
identitystringRequired

Display name for the watcher

Responses
200

Watcher token generated successfully

application/json
urlstringRequired

LiveKit connection URL

tokenstringRequired

LiveKit JWT token for authentication

roomIdstringRequired

LiveKit room ID

identitystringRequired

Unique internal identity for the watcher

placeNamestringOptional

Name of the place being watched

post/cast/watcher-token
POST /cast/watcher-token HTTP/1.1
Host: comms-gatekeeper.decentraland.org
x-identity: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 38

{
  "location": "20,-4",
  "identity": "text"
}
{
  "url": "text",
  "token": "text",
  "roomId": "text",
  "identity": "text",
  "placeName": "text"
}
get
/cast/generate-stream-link

Generates a unique stream link for a scene that allows streamers to broadcast and watchers to view the stream. Only scene administrators can generate stream links. The generated link expires after 4 days. Requires Signed Fetch authentication from decentraland-kernel-scene. Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.

Rejected with 403 when the caller has an active platform ban, checked before the scene admin lookup so the response never doubles as an admin-status oracle. The local-preview branch (ALLOW_LOCAL_PREVIEW with a preview realm name) is gated too, even though it skips the admin check.

This is the only wallet-scoped gate on the streaming path: POST /cast/streamer-token authenticates a streaming key rather than a wallet, so a key minted before the ban keeps working until it expires.

Authorizations
x-identitystringRequired

Signed Fetch authentication for scene-based requests. Requires a chain of identity headers:

  • x-identity-auth-chain-0: Signer information
  • x-identity-auth-chain-1: Ephemeral key information
  • x-identity-auth-chain-2: Signed entity information
  • x-identity-timestamp: Request timestamp
  • x-identity-metadata: Request metadata Used for authentication from decentraland-kernel-scene.
Responses
200

Stream link generated successfully

application/json
streamLinkstringRequired

URL for streamers to access the stream

watcherLinkstringRequired

URL for watchers to access the stream

streamingKeystringRequired

Unique streaming key for authentication

placeIdstringRequired

ID of the place

placeNamestringRequired

Name of the place

expiresAtstring · date-timeRequired

Expiration timestamp in ISO format

expiresInDaysintegerRequired

Number of days until expiration

get/cast/generate-stream-link
GET /cast/generate-stream-link HTTP/1.1
Host: comms-gatekeeper.decentraland.org
x-identity: YOUR_API_KEY
Accept: */*
{
  "streamLink": "text",
  "watcherLink": "text",
  "streamingKey": "text",
  "placeId": "text",
  "placeName": "text",
  "expiresAt": "2026-01-01T00:00:00.000Z",
  "expiresInDays": 1
}

Get stream information

get
/cast/stream-info/{streamingKey}

Retrieves information about a stream using its streaming key. This endpoint provides details about the place, location, and stream status. No authentication required.

Path parameters
streamingKeystringRequired

Streaming key for the stream

Responses
200

Stream information retrieved successfully

application/json
placeNamestringRequired

Name of the place

placeIdstringRequired

ID of the place

locationstringRequired

Location identifier (world name or parcel coordinates)

isWorldbooleanRequired

Whether this is a world or a parcel

get/cast/stream-info/{streamingKey}
GET /cast/stream-info/{streamingKey} HTTP/1.1
Host: comms-gatekeeper.decentraland.org
Accept: */*
{
  "placeName": "text",
  "placeId": "text",
  "location": "text",
  "isWorld": true
}

Generate presentation bot token

post
/cast/presentation-bot-token

Generates a LiveKit token for a presentation bot to join a cast room. The bot uses this token to connect to the room and manage presentations. No authentication required - uses streaming key for validation.

Body
streamingKeystringRequired

Streaming key to generate presentation bot token for

Responses
200

Presentation bot token generated successfully

application/json
tokenstringRequired

LiveKit JWT token for the presentation bot

roomIdstringRequired

LiveKit room ID the bot can join

post/cast/presentation-bot-token
POST /cast/presentation-bot-token HTTP/1.1
Host: comms-gatekeeper.decentraland.org
Content-Type: application/json
Accept: */*
Content-Length: 23

{
  "streamingKey": "text"
}
{
  "token": "text",
  "roomId": "text"
}

List presenters in a room

get
/cast/presenters

Returns the list of participants with the presenter role in a cast room. The roomId is derived server-side from the Signed Fetch auth metadata (sceneId + realm). Only scene administrators can list presenters. Requires Signed Fetch authentication.

Authorizations
x-identitystringRequired

Signed Fetch authentication for scene-based requests. Requires a chain of identity headers:

  • x-identity-auth-chain-0: Signer information
  • x-identity-auth-chain-1: Ephemeral key information
  • x-identity-auth-chain-2: Signed entity information
  • x-identity-timestamp: Request timestamp
  • x-identity-metadata: Request metadata Used for authentication from decentraland-kernel-scene.
Responses
200

Presenters listed successfully

application/json
presentersstring[]Required

List of participant identities with presenter role

get/cast/presenters
GET /cast/presenters HTTP/1.1
Host: comms-gatekeeper.decentraland.org
x-identity: YOUR_API_KEY
Accept: */*
{
  "presenters": [
    "text"
  ]
}

Promote participant to presenter

put
/cast/presenters/{participantIdentity}

Promotes a participant in a cast room to the presenter role, allowing them to share content. The roomId is derived server-side from the Signed Fetch auth metadata (sceneId + realm). Only scene administrators can promote presenters. Requires Signed Fetch authentication.

Authorizations
x-identitystringRequired

Signed Fetch authentication for scene-based requests. Requires a chain of identity headers:

  • x-identity-auth-chain-0: Signer information
  • x-identity-auth-chain-1: Ephemeral key information
  • x-identity-auth-chain-2: Signed entity information
  • x-identity-timestamp: Request timestamp
  • x-identity-metadata: Request metadata Used for authentication from decentraland-kernel-scene.
Path parameters
participantIdentitystringRequired

Ethereum address of the participant to promote (0x + 40 hex characters)

Pattern: ^0x[0-9a-fA-F]{40}$
Responses
200

Participant promoted to presenter

application/json
messagestringRequired

Success message

put/cast/presenters/{participantIdentity}
PUT /cast/presenters/{participantIdentity} HTTP/1.1
Host: comms-gatekeeper.decentraland.org
x-identity: YOUR_API_KEY
Accept: */*
{
  "message": "text"
}

Demote presenter to watcher

delete
/cast/presenters/{participantIdentity}

Demotes a presenter back to the watcher role, revoking their ability to share content. The roomId is derived server-side from the Signed Fetch auth metadata (sceneId + realm). Only scene administrators can demote presenters. Requires Signed Fetch authentication.

Authorizations
x-identitystringRequired

Signed Fetch authentication for scene-based requests. Requires a chain of identity headers:

  • x-identity-auth-chain-0: Signer information
  • x-identity-auth-chain-1: Ephemeral key information
  • x-identity-auth-chain-2: Signed entity information
  • x-identity-timestamp: Request timestamp
  • x-identity-metadata: Request metadata Used for authentication from decentraland-kernel-scene.
Path parameters
participantIdentitystringRequired

Ethereum address of the participant to demote (0x + 40 hex characters)

Pattern: ^0x[0-9a-fA-F]{40}$
Responses
200

Participant demoted from presenter

application/json
messagestringRequired

Success message

delete/cast/presenters/{participantIdentity}
DELETE /cast/presenters/{participantIdentity} HTTP/1.1
Host: comms-gatekeeper.decentraland.org
x-identity: YOUR_API_KEY
Accept: */*
{
  "message": "text"
}

Last updated