Skip to content

place.stream.livestream

Lexicon Version: 1

Type: record

Record announcing a livestream is happening

Record Key: tid

Record Properties:

NameTypeReq’dDescriptionConstraints
titlestring✅The title of the livestream, as it will be announced to followers.Max Length: 1400
Max Graphemes: 140
urlstring❌The URL where this stream can be found. This is primarily a hint for other Streamplace nodes to locate and replicate the stream.Format: uri
createdAtstring✅Client-declared timestamp when this livestream started.Format: datetime
lastSeenAtstring❌Client-declared timestamp when this livestream was last seen by the Streamplace station.Format: datetime
endedAtstring❌Client-declared timestamp when this livestream ended. Ended livestreams are not supposed to start up again.Format: datetime
idleTimeoutSecondsinteger❌Time in seconds after which this livestream should be automatically ended if idle. Zero means no timeout.
postcom.atproto.repo.strongRef❌The post that announced this livestream.
agentstring❌The source of the livestream, if available, in a User Agent format: <product> / <product-version> <comment> e.g. Streamplace/0.7.5 iOS
canonicalUrlstring❌The primary URL where this livestream can be viewed, if available.Format: uri
thumbblob❌Accept: image/*
Max Size: 1000000 bytes
notificationSettingsplace.stream.livestream#notificationSettings❌
activityUnion of:
  place.stream.defs#activityGame
  place.stream.defs#activityLabel
❌The game or activity being streamed.
tagsArray of string❌Freeform tags for this stream. Each tag must be alphanumeric (a-z, A-Z, 0-9) plus colon. Tags with colons indicate a specific tag group (e.g. ‘lang:en’ indicates the stream’s primary language).Max Items: 10

Type: object

Properties:

NameTypeReq’dDescriptionConstraints
pushNotificationboolean❌Whether this livestream should trigger a push notification to followers.

Type: object

Properties:

NameTypeReq’dDescriptionConstraints
uristring✅Format: at-uri
cidstring✅Format: cid
authorapp.bsky.actor.defs#profileViewBasic✅
recordunknown✅
indexedAtstring✅Format: datetime
viewerCount#viewerCount❌The number of viewers watching this livestream. Use when you can’t reasonably use #viewerCount directly.

Type: object

Properties:

NameTypeReq’dDescriptionConstraints
countinteger✅Viewers watching right now.
totalinteger❌Running number of playback sessions this livestream has had (cumulative, session-based; the X-style ‘views’ beside the concurrent count).

Type: object

Properties:

NameTypeReq’dDescriptionConstraints
teleportUristring✅The URI of the teleport recordFormat: at-uri
sourceapp.bsky.actor.defs#profileViewBasic✅The streamer who is teleporting their viewers here
chatProfileplace.stream.chat.profile❌The chat profile of the source streamer
viewerCountinteger✅How many viewers are arriving from this teleport
startsAtstring✅When this teleport startedFormat: datetime

Type: object

Properties:

NameTypeReq’dDescriptionConstraints
teleportUristring✅The URI of the teleport record that was canceledFormat: at-uri
reasonstring✅Why this teleport was canceledEnum: deleted, denied, expired

Type: object

Properties:

NameTypeReq’dDescriptionConstraints
livestreamUnion of:
  #livestreamView
  #viewerCount
  #teleportArrival
  #teleportCanceled
  place.stream.defs#blockView
  place.stream.defs#renditions
  place.stream.defs#rendition
  place.stream.chat.defs#messageView
  place.stream.chat.defs#pinnedRecordView
✅

{
"lexicon": 1,
"id": "place.stream.livestream",
"defs": {
"main": {
"type": "record",
"description": "Record announcing a livestream is happening",
"key": "tid",
"record": {
"type": "object",
"required": ["title", "createdAt"],
"properties": {
"title": {
"type": "string",
"maxLength": 1400,
"maxGraphemes": 140,
"description": "The title of the livestream, as it will be announced to followers."
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL where this stream can be found. This is primarily a hint for other Streamplace nodes to locate and replicate the stream."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this livestream started."
},
"lastSeenAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this livestream was last seen by the Streamplace station."
},
"endedAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this livestream ended. Ended livestreams are not supposed to start up again."
},
"idleTimeoutSeconds": {
"type": "integer",
"description": "Time in seconds after which this livestream should be automatically ended if idle. Zero means no timeout."
},
"post": {
"type": "ref",
"ref": "com.atproto.repo.strongRef",
"description": "The post that announced this livestream."
},
"agent": {
"type": "string",
"description": "The source of the livestream, if available, in a User Agent format: `<product> / <product-version> <comment>` e.g. Streamplace/0.7.5 iOS"
},
"canonicalUrl": {
"type": "string",
"format": "uri",
"description": "The primary URL where this livestream can be viewed, if available."
},
"thumb": {
"type": "blob",
"accept": ["image/*"],
"maxSize": 1000000
},
"notificationSettings": {
"type": "ref",
"ref": "place.stream.livestream#notificationSettings"
},
"activity": {
"type": "union",
"description": "The game or activity being streamed.",
"refs": [
"place.stream.defs#activityGame",
"place.stream.defs#activityLabel"
]
},
"tags": {
"type": "array",
"description": "Freeform tags for this stream. Each tag must be alphanumeric (a-z, A-Z, 0-9) plus colon. Tags with colons indicate a specific tag group (e.g. 'lang:en' indicates the stream's primary language).",
"maxLength": 10,
"items": {
"type": "string",
"maxLength": 640,
"maxGraphemes": 64
}
}
}
}
},
"notificationSettings": {
"type": "object",
"required": [],
"properties": {
"pushNotification": {
"type": "boolean",
"description": "Whether this livestream should trigger a push notification to followers."
}
}
},
"livestreamView": {
"type": "object",
"required": ["uri", "cid", "author", "record", "indexedAt"],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"cid": {
"type": "string",
"format": "cid"
},
"author": {
"type": "ref",
"ref": "app.bsky.actor.defs#profileViewBasic"
},
"record": {
"type": "unknown"
},
"indexedAt": {
"type": "string",
"format": "datetime"
},
"viewerCount": {
"type": "ref",
"description": "The number of viewers watching this livestream. Use when you can't reasonably use #viewerCount directly.",
"ref": "#viewerCount"
}
}
},
"viewerCount": {
"type": "object",
"required": ["count"],
"properties": {
"count": {
"type": "integer",
"description": "Viewers watching right now."
},
"total": {
"type": "integer",
"description": "Running number of playback sessions this livestream has had (cumulative, session-based; the X-style 'views' beside the concurrent count)."
}
}
},
"teleportArrival": {
"type": "object",
"required": ["teleportUri", "source", "viewerCount", "startsAt"],
"properties": {
"teleportUri": {
"type": "string",
"format": "at-uri",
"description": "The URI of the teleport record"
},
"source": {
"type": "ref",
"ref": "app.bsky.actor.defs#profileViewBasic",
"description": "The streamer who is teleporting their viewers here"
},
"chatProfile": {
"type": "ref",
"ref": "place.stream.chat.profile",
"description": "The chat profile of the source streamer"
},
"viewerCount": {
"type": "integer",
"description": "How many viewers are arriving from this teleport"
},
"startsAt": {
"type": "string",
"format": "datetime",
"description": "When this teleport started"
}
}
},
"teleportCanceled": {
"type": "object",
"required": ["teleportUri", "reason"],
"properties": {
"teleportUri": {
"type": "string",
"format": "at-uri",
"description": "The URI of the teleport record that was canceled"
},
"reason": {
"type": "string",
"enum": ["deleted", "denied", "expired"],
"description": "Why this teleport was canceled"
}
}
},
"streamplaceAnything": {
"type": "object",
"required": ["livestream"],
"properties": {
"livestream": {
"type": "union",
"refs": [
"#livestreamView",
"#viewerCount",
"#teleportArrival",
"#teleportCanceled",
"place.stream.defs#blockView",
"place.stream.defs#renditions",
"place.stream.defs#rendition",
"place.stream.chat.defs#messageView",
"place.stream.chat.defs#pinnedRecordView"
]
}
}
}
}
}