diff --git a/docs.json b/docs.json
index 1d94f7ba9..5b54a3231 100644
--- a/docs.json
+++ b/docs.json
@@ -1291,7 +1291,10 @@
"livestream-api/chat/send-chat-message",
"livestream-api/chat/mute-chat-user",
"livestream-api/chat/unmute-chat-user",
- "livestream-api/chat/delete-chat-message"
+ "livestream-api/chat/delete-chat-message",
+ "livestream-api/chat/list-moderators",
+ "livestream-api/chat/add-moderator",
+ "livestream-api/chat/remove-moderator"
]
}
]
diff --git a/livestream-api/chat/add-moderator.mdx b/livestream-api/chat/add-moderator.mdx
new file mode 100644
index 000000000..2ff6b54c8
--- /dev/null
+++ b/livestream-api/chat/add-moderator.mdx
@@ -0,0 +1,13 @@
+---
+title: Add a Broadcast Moderator
+sidebarTitle: Add a Broadcast Moderator
+description: "POST /2/broadcasts/chat/moderators adds a user as a chat moderator for the authenticated user's broadcasts."
+keywords: ["add broadcast moderator", "broadcast chat moderation", "POST broadcasts chat moderators", "live chat", "broadcast.write"]
+openapi: "post /2/broadcasts/chat/moderators"
+---
+
+Adds a user as a chat moderator for the authenticated user's broadcasts. Moderators are scoped to the authenticated user, not to an individual broadcast, and can moderate chat across every broadcast that user hosts.
+
+
+A user can have up to 20 moderators. Adding a 21st returns `400 Bad Request`. To remove an existing moderator first, use [Remove a Broadcast Moderator](/livestream-api/chat/remove-moderator).
+
diff --git a/livestream-api/chat/delete-chat-message.mdx b/livestream-api/chat/delete-chat-message.mdx
index 3678d06ad..1312c0ef6 100644
--- a/livestream-api/chat/delete-chat-message.mdx
+++ b/livestream-api/chat/delete-chat-message.mdx
@@ -6,7 +6,9 @@ keywords: ["delete chat message", "broadcast chat moderation", "DELETE broadcast
openapi: "delete /2/broadcasts/{id}/chat/{message_id}"
---
-Removes a specific chat message from a running broadcast owned by the authenticated user. `:id` is the alphanumeric `broadcast_id`, and `:message_id` is the id of the chat message to delete — the `timestamp` returned by [Send a Chat Message](/livestream-api/chat/send-chat-message).
+Removes a specific chat message from a running broadcast. `:id` is the alphanumeric `broadcast_id`, and `:message_id` is the id of the chat message to delete — the `timestamp` returned by [Send a Chat Message](/livestream-api/chat/send-chat-message).
+
+The authenticated user must be the broadcast owner or a chat moderator for the broadcast owner. See [List Broadcast Moderators](/livestream-api/chat/list-moderators) for how moderators are managed.
To also stop the author from posting further messages, use [Mute a Chat User](/livestream-api/chat/mute-chat-user), which supports removing the prompting message in the same call.
diff --git a/livestream-api/chat/list-moderators.mdx b/livestream-api/chat/list-moderators.mdx
new file mode 100644
index 000000000..37e6ed2b0
--- /dev/null
+++ b/livestream-api/chat/list-moderators.mdx
@@ -0,0 +1,13 @@
+---
+title: List Broadcast Moderators
+sidebarTitle: List Broadcast Moderators
+description: "GET /2/broadcasts/chat/moderators returns the list of chat moderators for the authenticated user's broadcasts."
+keywords: ["list broadcast moderators", "broadcast chat moderation", "GET broadcasts chat moderators", "live chat", "broadcast.read"]
+openapi: "get /2/broadcasts/chat/moderators"
+---
+
+Returns the list of users who moderate chat for the authenticated user's broadcasts. Moderators are scoped to the authenticated user, not to an individual broadcast, and take effect across every broadcast that user hosts.
+
+
+A user can have up to 20 moderators. To add or remove a moderator, use [Add a Broadcast Moderator](/livestream-api/chat/add-moderator) or [Remove a Broadcast Moderator](/livestream-api/chat/remove-moderator).
+
diff --git a/livestream-api/chat/mute-chat-user.mdx b/livestream-api/chat/mute-chat-user.mdx
index 0a17b00a1..efc4f913d 100644
--- a/livestream-api/chat/mute-chat-user.mdx
+++ b/livestream-api/chat/mute-chat-user.mdx
@@ -6,7 +6,9 @@ keywords: ["mute chat user", "broadcast chat moderation", "time out", "POST broa
openapi: "post /2/broadcasts/{id}/chat/mutes"
---
-Prevents a user from posting further messages in a running broadcast chat. The authenticated user must own the broadcast. `:id` is the alphanumeric `broadcast_id`.
+Prevents a user from posting further messages in a running broadcast chat. `:id` is the alphanumeric `broadcast_id`.
+
+The authenticated user must be the broadcast owner or a chat moderator for the broadcast owner. See [List Broadcast Moderators](/livestream-api/chat/list-moderators) for how moderators are managed.
Pass an optional `end_at_ms` in the request body to time the mute out at a specific Unix timestamp in milliseconds. Omit `end_at_ms` to mute the user indefinitely.
diff --git a/livestream-api/chat/remove-moderator.mdx b/livestream-api/chat/remove-moderator.mdx
new file mode 100644
index 000000000..625c823f7
--- /dev/null
+++ b/livestream-api/chat/remove-moderator.mdx
@@ -0,0 +1,13 @@
+---
+title: Remove a Broadcast Moderator
+sidebarTitle: Remove a Broadcast Moderator
+description: "DELETE /2/broadcasts/chat/moderators/:id removes a user from the authenticated user's chat moderators."
+keywords: ["remove broadcast moderator", "broadcast chat moderation", "DELETE broadcasts chat moderators", "live chat", "broadcast.write"]
+openapi: "delete /2/broadcasts/chat/moderators/{id}"
+---
+
+Removes a user from the authenticated user's chat moderators. `:id` is the numeric user id of the moderator to remove. Once removed, the user can no longer moderate chat in any of the authenticated user's broadcasts.
+
+
+A user can have up to 20 moderators. To list current moderators, use [List Broadcast Moderators](/livestream-api/chat/list-moderators).
+
diff --git a/livestream-api/chat/unmute-chat-user.mdx b/livestream-api/chat/unmute-chat-user.mdx
index 7424e9b67..33932768a 100644
--- a/livestream-api/chat/unmute-chat-user.mdx
+++ b/livestream-api/chat/unmute-chat-user.mdx
@@ -6,7 +6,9 @@ keywords: ["unmute chat user", "broadcast chat moderation", "DELETE broadcasts c
openapi: "delete /2/broadcasts/{id}/chat/mutes/{user_id}"
---
-Allows a muted user to post messages in a running broadcast chat again. The authenticated user must own the broadcast. `:id` is the alphanumeric `broadcast_id`, and `:user_id` is the numeric id of the user to unmute.
+Allows a muted user to post messages in a running broadcast chat again. `:id` is the alphanumeric `broadcast_id`, and `:user_id` is the numeric id of the user to unmute.
+
+The authenticated user must be the broadcast owner or a chat moderator for the broadcast owner. See [List Broadcast Moderators](/livestream-api/chat/list-moderators) for how moderators are managed.
To mute a user, use [Mute a Chat User](/livestream-api/chat/mute-chat-user).
diff --git a/openapi.json b/openapi.json
index 5907e7771..ab045855c 100644
--- a/openapi.json
+++ b/openapi.json
@@ -2185,6 +2185,170 @@
}
}
},
+ "/2/broadcasts/chat/moderators": {
+ "get": {
+ "security": [
+ {
+ "OAuth2UserToken": [
+ "broadcast.read"
+ ]
+ },
+ {
+ "UserToken": []
+ }
+ ],
+ "tags": [
+ "Broadcasts"
+ ],
+ "summary": "List broadcast moderators",
+ "description": "Returns the list of chat moderators for the authenticated user's broadcasts. A user can have up to 20 moderators.",
+ "operationId": "listBroadcastChatModerators",
+ "responses": {
+ "200": {
+ "description": "The request has succeeded.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ListBroadcastChatModeratorsResponse"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "The request has failed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ },
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Problem"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "security": [
+ {
+ "OAuth2UserToken": [
+ "broadcast.read",
+ "broadcast.write"
+ ]
+ },
+ {
+ "UserToken": []
+ }
+ ],
+ "tags": [
+ "Broadcasts"
+ ],
+ "summary": "Add a broadcast moderator",
+ "description": "Adds a user as a chat moderator for the authenticated user's broadcasts. A user can have up to 20 moderators; adding a 21st returns `400 Bad Request`.",
+ "operationId": "addBroadcastChatModerator",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AddBroadcastChatModeratorRequest"
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "The request has succeeded.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AddBroadcastChatModeratorResponse"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "The request has failed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ },
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Problem"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/2/broadcasts/chat/moderators/{id}": {
+ "delete": {
+ "security": [
+ {
+ "OAuth2UserToken": [
+ "broadcast.read",
+ "broadcast.write"
+ ]
+ },
+ {
+ "UserToken": []
+ }
+ ],
+ "tags": [
+ "Broadcasts"
+ ],
+ "summary": "Remove a broadcast moderator",
+ "description": "Removes a user from the authenticated user's chat moderators.",
+ "operationId": "removeBroadcastChatModerator",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The numeric user id of the moderator to remove.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "pattern": "^[1-9][0-9]{0,18}$"
+ },
+ "style": "simple"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The request has succeeded.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/RemoveBroadcastChatModeratorResponse"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "The request has failed.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ }
+ },
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/Problem"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/2/chat/conversations": {
"get": {
"security": [
@@ -17045,6 +17209,46 @@
},
"additionalProperties": false
},
+ "AddBroadcastChatModeratorRequest": {
+ "type": "object",
+ "required": [
+ "user_id"
+ ],
+ "properties": {
+ "user_id": {
+ "type": "string",
+ "description": "The numeric user id to add as a chat moderator.",
+ "pattern": "^[1-9][0-9]{0,18}$"
+ }
+ },
+ "additionalProperties": false
+ },
+ "AddBroadcastChatModeratorResponse": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/components/schemas/AddBroadcastChatModeratorResponseData"
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Problem"
+ }
+ }
+ }
+ },
+ "AddBroadcastChatModeratorResponseData": {
+ "type": "object",
+ "required": [
+ "added"
+ ],
+ "properties": {
+ "added": {
+ "type": "boolean",
+ "description": "Whether the user was added as a chat moderator."
+ }
+ }
+ },
"AddChatGroupMembersActionSignatures": {
"type": "object",
"required": [
@@ -24979,6 +25183,47 @@
}
}
},
+ "ListBroadcastChatModeratorsResponse": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "description": "The list of chat moderators for the authenticated user's broadcasts.",
+ "items": {
+ "$ref": "#/components/schemas/BroadcastChatModerator"
+ }
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Problem"
+ }
+ },
+ "meta": {
+ "type": "object",
+ "properties": {
+ "result_count": {
+ "type": "integer",
+ "description": "Number of items in the data array.",
+ "format": "int32"
+ }
+ }
+ }
+ }
+ },
+ "BroadcastChatModerator": {
+ "type": "object",
+ "required": [
+ "user_id"
+ ],
+ "properties": {
+ "user_id": {
+ "type": "string",
+ "description": "The numeric user id of the moderator.",
+ "pattern": "^[1-9][0-9]{0,18}$"
+ }
+ }
+ },
"ListBroadcastsResponse": {
"type": "object",
"properties": {
@@ -27689,6 +27934,32 @@
}
}
},
+ "RemoveBroadcastChatModeratorResponse": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "$ref": "#/components/schemas/RemoveBroadcastChatModeratorResponseData"
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Problem"
+ }
+ }
+ }
+ },
+ "RemoveBroadcastChatModeratorResponseData": {
+ "type": "object",
+ "required": [
+ "removed"
+ ],
+ "properties": {
+ "removed": {
+ "type": "boolean",
+ "description": "Whether the user was removed as a chat moderator."
+ }
+ }
+ },
"RemoveListsMemberByUserIdResponse": {
"type": "object",
"properties": {