owncast/openapi.yaml
Gabe Kangas b6f68628c0
Chat refactor + persistent backing chat users (#1163)
* First pass at chat user registration and validation

* Disable chat if the user is disabled/blocked or the server hits max connections

* Handle dropping sockets if chat is disabled

* Fix origin in automated chat test

* Work for updated chat moderation

* Chat message markdown rendering and fix tests

* Put /api/chat behind a chat user access token. Closes #1085

* Reject blocked username changes

* More WIP moderation

* Defer configuring chat until we know if it is enabled. Closes #1135

* chat user blocking. Closes #1096

* Add tests around user access for #1096

* Add external integration chat message API + update integration auth middleware to pass along integration name. Closes #1092

* Delete old chat messages from db as to not hold on to excessive data. Closes #1152

* Add schema migration for messages. Closes #1155

* Commit updated API documentation

* Add chat load test

* Shared db mutex and db optimizations

* Simplify past display name handling

* Use a new test db for each test run

* Wire up the external messages actions + add tests for them

* Move access tokens to be actual users

* Run message pruning at launch + fix comparison

* Do not return API users in disabled users response

* Fix incorrect highlighting. Closes #1160

* Consolidate user table statements

* Set the max process connection limit to 70% of maximum

* Fix wrong old display name being returned in name change event

* Delete the old chat server files

* Wire back up the webhooks

* Remove unused

* Invalidate user cache on changes

* Do not send rendered body as RawBody

* Some cleanup

* Standardize names for external API users to ExternalAPIUser

* Do not log token

* Checkout branch when building admin for testing

* Bundle in dev admin for testing

* Some cleanup

* Cleanup js logs

* Cleanup and standardize event names

* Clean up some logging

* Update API spec. Closes #1133

* Commit updated API documentation

* Change paths to be better named

* Commit updated API documentation

* Update admin bundle

* Fix duplicate event name

* Rename scope var

* Update admin bundle

* Move connected clients controller into admin package

* Fix collecting usernames for autocomplete purposes

* No longer generate username when it is empty

* Sort clients and users by timestamp

* Move file to admin controller package

* Swap, so the comments stay correct

Co-authored-by: Jannik <jannik@outlook.com>

* Use explicit type alias

Co-authored-by: Jannik <jannik@outlook.com>

* Remove commented code.

Co-authored-by: Jannik <jannik@outlook.com>

* Cleanup test

* Remove some extra logging

* Add some clarity

* Update dev instance of admin for testing

* Consolidate lines

Co-authored-by: Jannik <jannik@outlook.com>

* Remove commented unused vars

Co-authored-by: Jannik <jannik@outlook.com>

* Until needed do not return IP address with client list

* Fix typo of wrong var

* Typo led to a bad test. Fix typo and fix test.

* Guard against the socket reconnecting on error if previously set to shutdown

* Do not log access tokens

* Return success message on enable/disable user

* Clean up some inactionable error messages. Sent ban message. Sort banned users.

* fix styling for when chat is completely disabled

* Unused

* guard against nil clients

* Update dev admin bundle

* Do not unhide messages when unblocking user just to be safe. Send removal action from the controller

* Add convinience function for getting active connections for a single user

* Lock db on these mutations

* Cleanup force disconnect using GetClientsForUser and capture client reference explicitly

* No longer re-showing banned user messages for safety. Removing this test.

* Remove no longer needed comment

* Tweaks to forbidden username handling.

- Standardize naming to not use "block" but "forbidden" instead.
- Pass array over the wire instead of string.
- Add API test
- Fix default list incorrectly being appended to custom list.

* Logging cleanup

* Update dev admin bundle

* Add an artificial delay in order to visually see message being hidden when testing

* Remove the user cache as it is a premature optimization

* When connected to chat let the user know their current user details to sync the username in the UI

* On connected send current display name back to client.
- Move name change out of chat component.
- Add additional event type constants.

* Fix broken workflow due to typo

* Troubleshoot workflow

* Bump htm from 3.0.4 to 3.1.0 in /build/javascript (#1181)

* Bump htm from 3.0.4 to 3.1.0 in /build/javascript

Bumps [htm](https://github.com/developit/htm) from 3.0.4 to 3.1.0.
- [Release notes](https://github.com/developit/htm/releases)
- [Commits](https://github.com/developit/htm/compare/3.0.4...3.1.0)

---
updated-dependencies:
- dependency-name: htm
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Run npm run build and update libraries

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>

* Commit updated Javascript packages

* Re-send current user info when a rejected name change takes place

* All socket writes should be through the send chan and not directly

* Seed the random generator

* Add keys and indexes to users table

* a util to generate consistent emoji markup

* console clean up

* mod tidy

* Commit updated API documentation

* Handle the max payload size of a socket message.
- Only close socket if x2 greater than the max size.
- Send the user a message if a message is too large.
- Surface the max size in bytes in the config.

* Update admin bundle

* Force all events to be sent in their own socket message and do not concatinate in a single message

* Update chat embed to register for access token

* Use a different access token for embed chat

* Update the chat message bubble background color to be bolder

* add base tag to open links in new window, closes #1220

* Support text input of :emoji: in chat (#1190)

* Initial implementation of emoji injection

* fix bookkeeping with multiple emoji

* make the emoji lookup case-insensitive

* try another solution for Caretposition

* add title to emojis

minor refactoring

* bind moji injection to InputKeyUp

* simplify the code

replace all found emojis

* inject emoji if the modifer is released earlier

* more efficient emoji tag search

* use json emoji.emoji as url

* use createEmojiMarkup()

* move emojify() to chat.js

* emojify on paste

* cleanup emoji titles in paste

* update inputText in InputKeyup

* mark emoji titles with 2*zwnj

this way paste cleanup will not interfere with text which include zwnj

* emoji should not change the inputText

* Do not show join messages when chat is offline. Closes #1224
- Show stream starting/ending messages in chat.
- When stream starts show everyone the welcome message.

* Force scrolling chat to bottom after history is populated regardless of scroll position. Closes https://github.com/owncast/owncast/issues/1222

* use maxSocketPayloadSize to calculate total bytes of message payload (#1221)

* utilize maxSocketPayloadSize from config; update chatInput to calculate based on that value instead of text value; remove usage of inputText for counting

* add a buffer to account for entire websocket payload for message char counting; trim nbsp;'s from ends of messages when calculating count

Co-authored-by: Gabe Kangas <gabek@real-ity.com>

Co-authored-by: Owncast <owncast@owncast.online>
Co-authored-by: Jannik <jannik@outlook.com>
Co-authored-by: Ginger Wong <omqmail@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Meisam <39205857+MFTabriz@users.noreply.github.com>
2021-07-19 19:22:29 -07:00

1675 lines
No EOL
64 KiB
YAML

openapi: 3.0.1
info:
title: Owncast
description: Owncast is a self-hosted live video and web chat server for use with existing popular broadcasting software. The following APIs represent the state in the development branch.
version: '0.0.8-develop'
contact:
name: Gabe Kangas
email: gabek@real-ity.com
url: http://owncast.online
x-logo:
url: >-
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAEvmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEyOCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjEyOCIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICB0aWZmOkltYWdlV2lkdGg9IjEyOCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTI4IgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI5Ni4wIgogICB0aWZmOllSZXNvbHV0aW9uPSI5Ni4wIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIw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
servers: []
tags:
- name: Admin
description: Admin operations requiring authentication.
- name: Chat
description: Endpoints related to the chat interface.
- name: Integrations
description: APIs built to allow 3rd parties to interact with an Owncast server.
components:
schemas:
ClientArray:
type: array
items:
$ref: "#/components/schemas/Client"
UserArray:
type: array
items:
$ref: "#/components/schemas/User"
LogEntryArray:
type: array
items:
$ref: "#/components/schemas/LogEntry"
Client:
type: object
description: A single representation of a client.
example:
connectedAt: "2020-10-06T23:20:44.588649-07:00"
messageCount: 0
userAgent: >-
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36
ipAddress: "::1"
username: null
clientID: 2ba20dd34f911c198df3218ddc64c740
geo:
countryCode: US
regionName: California
timeZone: America/Los_Angeles
properties:
connectedAt:
type: string
format: date-time
messageCount:
description: Number of chat messages sent by user
type: integer
userAgent:
description: The web client used to connect to this server
type: string
example: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
ipAddress:
description: The public IP address of this client
type: string
username:
description: The username for this client in chat if available
type: string
clientID:
description: The value used to identify this client
type: string
geo:
type: object
description: Optional geographic data for the client
properties:
countryCode:
type: string
regionName:
type: string
timeZone:
type: string
user:
$ref: "#/components/schemas/User"
x-last-modified: 1602052347511
BasicResponse:
type: object
properties:
success:
type: boolean
message:
type: string
InstanceDetails:
type: object
description: User-facing details about this server.
properties:
name:
type: string
description: Displayed as the header in the instance details.
summary:
type: string
description: This is brief summary of whom you are or what the stream is.
logo:
type: string
description: Local file name of your logo image. We recommend a square image (150 x 150px) with ample padding around the important contents of the image, as it will be rendered as a circle.
tags:
type: array
description: Categories of the content this instance focuses on.
items:
type: string
socialHandles:
type: array
description: Links to social network urls.
items:
type: object
properties:
platform:
type: string
example: github
url:
type: string
example: http://github.com/owncast/owncast
extraPageContent:
type: string
description: Additional HTML content to render in the body of the web interface.
example: "<p>This page is <strong>super</strong> cool!"
version:
type: string
example: Owncast v0.0.3-macOS (ef3796a033b32a312ebf5b334851cbf9959e7ecb)
YP:
type: object
description: Configuration of the instance's registration to the Owncast Directory (YP API)
properties:
enabled:
type: boolean
description: If YP support is on or off. Must be enabled to show in the directory.
default: false
instanceUrl:
type: string
description: The public URL of this owncast server, used for registration and linking with the directory. Must be publicly available.
S3:
type: object
description: Configuration of external storage using S3-compatible providers.
properties:
enabled:
type: boolean
endpoint:
type: string
servingEndpoint:
type: string
accessKey:
type: string
secret:
type: string
bucket:
type: string
region:
type: string
acl:
type: string
required:
- enabled
StreamQuality:
type: object
properties:
videoPassthrough:
type: boolean
description: If enabled video transcoding is disabled and the video is passed along in its original format.
audioPassthrough:
type: boolean
description: If enabled audio transcoding is disabled and the audio is passed along in its original format.
videoBitrate:
type: integer
description: The video quality, in kbps.
audioBitrate:
type: integer
description: The audio quality, in kbps.
scaledWidth:
type: integer
description: The resized video width.
scaledHeight:
type: integer
description: The resized video height.
framerate:
type: integer
description: The target frames per second of the video.
cpuUsageLevel:
type: integer
description: "The amount of hardware utilization selected for this HLS variant."
TimestampedValue:
type: object
properties:
time:
type: string
format: date-time
value:
type: integer
ConfigValue:
description: A wrapper object used to set values in many config endpoints.
type: object
properties:
value:
oneOf:
- type: string
- type: integer
- type: object
- type: boolean
LogEntry:
type: object
properties:
time:
type: string
format: date-time
description: "Timestamp for this log entry"
level:
type: string
description: "The level of this log entry"
message:
type: string
description: "The log entry contents"
Webhook:
type: object
properties:
id:
type: string
description: The ID of this webhook.
url:
type: string
description: The URL that events will be sent to.
events:
type: array
items:
type: string
description: The events that will be sent to this webhook.
timestamp:
type: string
format: date-time
description: When this webhook was created.
lastUsed:
type: string
format: date-time
description: When this webhook was last used.
User:
type: object
properties:
id:
type: string
description: User ID
example: yklw5Imng
displayName:
type: string
description: The user-facing disaplay name for this user.
example: awesome-pizza
displayColor:
type: integer
description: Hue value for displaying in the UI.
example: 42
createdAt:
type: string
format: date-time
description: When this account was originally registered/created.
previousNames:
type: string
description: Comma separated list of names previously used by this user.
example: "awesome-pizza,user42"
securitySchemes:
AdminBasicAuth:
type: http
scheme: basic
description: The username for admin basic auth is `admin` and the password is the stream key.
AccessToken:
type: http
scheme: bearer
description: 3rd party integration auth where a service user must provide an access token.
UserToken:
type: apiKey
name: accessToken
in: query
description: 3rd party integration auth where a service user must provide an access token.
responses:
UsersResponse:
description: A collection of users.
content:
application/json:
schema:
$ref: "#/components/schemas/UserArray"
ClientsResponse:
description: Successful response of an array of clients
content:
application/json:
schema:
$ref: "#/components/schemas/ClientArray"
example:
- connectedAt: "2020-10-06T23:20:44.588649-07:00"
messageCount: 3
userAgent: >-
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36
ipAddress: "172.217.164.110"
geo:
countryCode: US
regionName: California
timeZone: America/Los_Angeles
user:
id: yklw5Imng
displayName: awesome-pizza
displayColor: 42
createdAt: "2021-07-08T20:21:25.303402404-07:00"
previousNames: "awesome-pizza,coolPerson23"
LogsResponse:
description: Response of server log entries
content:
application/json:
schema:
$ref: "#/components/schemas/LogEntryArray"
examples:
success:
summary: Logs returned
value:
[
{
"message": "Owncast v0.0.0-localdev (unknown)",
"level": "info",
"time": "2020-10-29T18:35:34.422386-07:00",
},
{
"message": "Web server running on port: 8080",
"level": "info",
"time": "2020-10-29T18:35:35.011731-07:00",
},
{
"message": "RTMP server is listening for incoming stream on port: 1935",
"level": "info",
"time": "2020-10-29T18:35:35.011823-07:00",
},
]
BasicResponse:
description: Operation Success/Failure Response
content:
application/json:
schema:
$ref: "#/components/schemas/BasicResponse"
examples:
success:
summary: Operation succeeded.
value:
{
"success": true,
"message": "context specific success message",
}
failure:
summary: Operation failed.
value:
{
"success": false,
"message": "context specific failure message",
}
paths:
/api/config:
get:
summary: Information
description: The client configuration. Information useful for the user interface.
tags: ["Server"]
responses:
"200":
description: ""
content:
application/json:
schema:
$ref: "#/components/schemas/InstanceDetails"
/api/ping:
get:
summary: Mark the current viewer as active.
description: For tracking viewer count, periodically hit the ping endpoint.
tags: ["Server"]
responses:
"200":
description: "Successful ping"
/api/status:
get:
summary: Current Status
description: This endpoint is used to discover when a server is broadcasting, the number of active viewers as well as other useful information for updating the user interface.
tags: ["Server"]
responses:
"200":
description: ""
content:
application/json:
schema:
type: object
properties:
lastConnectTime:
type: string
nullable: true
format: date-time
overallMaxViewerCount:
type: integer
sessionMaxViewerCount:
type: integer
online:
type: boolean
viewerCount:
type: integer
lastDisconnectTime:
type: string
nullable: true
format: date-time
examples:
online:
value:
lastConnectTime: "2020-10-03T21:36:22-05:00"
lastDisconnectTime: null
online: true
overallMaxViewerCount: 420
sessionMaxViewerCount: 12
viewerCount: 7
/api/chat/register:
post:
summary: Register a chat user
description: Register a user that returns an access token for accessing chat.
tags: ["Chat"]
security:
- UserToken: []
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
displayName:
type: string
description: Optionally provide a display name you want to assign to this user when registering.
responses:
"200":
description: ""
content:
application/json:
schema:
type: object
properties:
id:
type: string
description: The new user's id.
accessToken:
type: string
description: The access token used for accessing chat.
displayName:
type: string
description: The user-facing name displayed for this user.
/api/chat:
get:
summary: Chat Messages Backlog
description: Used to get chat messages prior to connecting to the websocket.
tags: ["Chat"]
security:
- UserToken: []
responses:
"200":
description: ""
content:
application/json:
schema:
type: array
items:
type: object
properties:
author:
type: string
description: Username of the chat message poster.
body:
type: string
description: Escaped HTML of the chat message content.
id:
type: string
description: Unique ID of the chat message.
visible:
type: boolean
description: "Should chat message be visibly rendered."
timestamp:
type: string
format: date-time
/api/yp:
get:
summary: Yellow Pages Information
description: Information to be used in the Yellow Pages service, a global directory of Owncast servers.
tags: ["Server"]
responses:
"200":
description: ""
content:
application/json:
schema:
type: object
properties:
name:
type: string
description:
type: string
logo:
type: string
nsfw:
type: boolean
tags:
type: array
items:
type: string
online:
type: boolean
viewerCount:
type: integer
overallMaxViewerCount:
type: integer
sessionMaxViewerCount:
type: integer
lastConnectTime:
type: string
nullable: true
format: date-time
/api/emoji:
get:
summary: Get Custom Emoji
description: Get a list of custom emoji that are supported in chat.
tags: ["Chat"]
responses:
"200":
description: ""
content:
application/json:
schema:
type: array
items:
type: object
properties:
name:
type: string
description: The name of the Emoji
emoji:
type: string
description: The relative path to the Emoji image file
examples:
default:
value:
items:
- name: nicolas_cage_party
emoji: /img/emoji/nicolas_cage_party.gif
- name: parrot
emoji: /img/emoji/parrot.gif
/api/admin/status:
get:
summary: "Server status and broadcaster"
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
description: Server status and broadcaster details
content:
application/json:
schema:
type: object
properties:
broadcaster:
type: object
properties:
remoteAddr:
type: string
time:
type: string
format: date-time
streamDetails:
type: object
properties:
width:
type: integer
height:
type: integer
frameRate:
type: integer
videoBitrate:
type: integer
videoCodec:
type: string
audioBitrate:
type: integer
audioCodec:
type: string
encoder:
type: string
online:
type: boolean
description: Is a stream currently active
viewerCount:
type: integer
description: The current number of viewers
sessionPeakViewerCount:
type: integer
description: The peak number of viewers this streaming session
overallPeakViewerCount:
type: integer
description: The all-time peak number of viewers
versionNumber:
type: string
description: The current version of the owncast software
examples:
connected:
summary: "Broadcaster Connected"
value:
broadcaster:
remoteAddr: 172.217.164.110
time: "2020-10-06T23:20:44.588649-07:00"
streamDetails:
width: 640
height: 480
frameRate: 24
videoBitrate: 1500
videoCodec: "mp4a"
audioBitrate: 256
audioCodec: "aac"
encoder: "obs-output module (libobs version 25.0.8)"
online: true
viewerCount: 3
overallPeakViewerCount: 4
sessionPeakViewerCount: 4
versionNumber: "0.0.3"
/api/admin/disconnect:
post:
summary: Disconnect Broadcaster
description: Disconnect the active inbound stream, if one exists, and terminate the broadcast.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
$ref: "#/components/responses/BasicResponse"
/api/admin/yp/reset:
post:
summary: Reset your YP registration key.
description: Used when there is a problem with your registration to the Owncast Directory via the YP APIs. This will reset your local registration key.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
/api/admin/clients:
get:
summary: Return a list of currently connected clients
description: Return a list of currently connected clients with optional geo details.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
$ref: "#/components/responses/ClientsResponse"
/api/admin/users/disabled:
get:
summary: Return a list of currently connected clients
description: Return a list of currently connected clients with optional geo details.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
$ref: "#/components/responses/UsersResponse"
/api/admin/logs:
get:
summary: Return recent log entries
description: Returns server logs.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
$ref: "#/components/responses/LogsResponse"
/api/admin/logs/warnings:
get:
summary: Return recent warning and error logs.
description: Return recent warning and error logs.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
$ref: "#/components/responses/LogsResponse"
/api/admin/serverconfig:
get:
summary: Server Configuration
description: Get the current configuration of the Owncast server.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
description: ""
content:
application/json:
schema:
type: object
properties:
instanceDetails:
$ref: "#/components/schemas/InstanceDetails"
ffmpegPath:
type: string
description: The path to the copy of ffmpeg that this server is using.
webServerPort:
type: integer
description: The port the public web server is listening on.
rtmpServerPort:
type: integer
description: The port the inbound RTMP broadcast should be sent to.
s3:
$ref: "#/components/schemas/S3"
videoSettings:
type: object
description: How the different variants of video streams are configured.
properties:
videoQualityVariants:
type: array
items:
$ref: "#/components/schemas/StreamQuality"
latencyLevel:
type: integer
description: The level of latency selected for streaming. Lower latency can create more buffering.
yp:
$ref: "#/components/schemas/YP"
/api/admin/chat/messages:
get:
summary: Chat messages, unfiltered.
description: Get a list of all chat messages with no filters applied.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
description: ""
content:
application/json:
schema:
type: array
items:
type: object
properties:
author:
type: string
description: Username of the chat message poster.
body:
type: string
description: Escaped HTML of the chat message content.
id:
type: string
description: Unique ID of the chat message.
visible:
type: boolean
description: "Should chat message be visibly rendered."
timestamp:
type: string
format: date-time
/api/admin/chat/updatemessagevisibility:
post:
summary: Update the visibility of chat messages.
description: Pass an array of IDs you want to change the chat visibility of.
requestBody:
content:
application/json:
schema:
type: object
properties:
visible:
type: boolean
description: Are these messages visible.
idArray:
type: array
items:
type: string
description: IDs of the chat messages you wish to change the visibility of.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
$ref: "#/components/responses/BasicResponse"
/api/admin/chat/users/setenabled:
post:
summary: Enable or disable a single user.
description: Enable or disable a single user. Disabling will also hide all the user's chat messages.
requestBody:
content:
application/json:
schema:
type: object
properties:
userId:
type: string
description: User ID to act upon.
example: "yklw5Imng"
enabled:
type: boolean
description: Set the enabled state of this user.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
$ref: "#/components/responses/BasicResponse"
/api/admin/config/key:
post:
summary: Set the stream key.
description: Set the stream key. Also used as the admin password.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
/api/admin/config/pagecontent:
post:
summary: Set the custom page content.
description: Set the custom page content using markdown.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
"# Welcome to my cool server!<br><br>I _hope_ you enjoy it."
/api/admin/config/streamtitle:
post:
summary: Set the stream title.
description: Set the title of the currently streaming content.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: Streaming my favorite game, Desert Bus.
/api/admin/config/name:
post:
summary: Set the server name.
description: Set the name associated with your server. Often is your name, username or identity.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
/api/admin/config/serversummary:
post:
summary: Set the server summary.
description: Set the summary of your server's streaming content.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: The best in Desert Bus Streaming
/api/admin/config/logo:
post:
summary: Set the server logo.
description: Set the logo for your server. Path is relative to webroot.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: "/img/mylogo.png"
/api/admin/config/tags:
post:
summary: Set the server tags.
description: Set the tags displayed for your server and the categories you can show up in on the directory.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value:
- games
- music
- streaming
/api/admin/config/ffmpegpath:
post:
summary: Set the ffmpeg binary path
description: Set the path for a specific copy of ffmpeg on your system.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: "/home/owncast/ffmpeg"
/api/admin/config/webserverport:
post:
summary: Set the owncast web port.
description: Set the port the owncast web server should listen on.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: 8080
/api/admin/config/rtmpserverport:
post:
summary: Set the inbound rtmp server port.
description: Set the port where owncast service will listen for inbound broadcasts.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: 1935
/api/admin/config/nsfw:
post:
summary: Mark if your stream is not safe for work
description: Mark if your stream can be consitered not safe for work. Used in different contexts, including the directory for filtering purposes.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: false
/api/admin/config/directoryenabled:
post:
summary: Set if this server supports the Owncast directory.
description: If set to true the server will attempt to register itself with the [Owncast Directory](https://directory.owncast.online). Off by default.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: true
/api/admin/config/serverurl:
post:
summary: Set the public url of this owncast server.
description: Set the public url of this owncast server. Used for the directory and optional integrations.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: https://live.mycoolserver.biz
/api/admin/config/video/streamlatencylevel:
post:
summary: Set the latency level for the stream.
description: Sets the latency level that determines how much video is buffered between the server and viewer. Less latency can end up with more buffering.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
type: object
properties:
value:
description: The latency level
type: integer
example:
value: 4
/api/admin/config/video/streamoutputvariants:
post:
summary: Set the configuration of your stream output.
description: Sets the detailed configuration for all of the stream variants you support.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value:
- framerate: 30
videoPassthrough: false
videoBitrate: 1800
cpuUsageLevel: 2
audioPassthrough: true
- framerate: 24
videoPassthrough: false
videoBitrate: 1000
cpuUsageLevel: 3
audioPassthrough: true
/api/admin/config/video/codec:
post:
summary: Set the video codec.
description: Sets the specific video codec that will be used for video encoding. Some codecs will support hardware acceleration. Not all codecs will be supported for all systems.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
type: object
properties:
value:
description: The video codec to change to.
type: string
example:
value: libx264
/api/admin/config/s3:
post:
summary: Set your storage configration.
description: Sets your S3 storage provider configuration details to enable external storage.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value:
enabled: true
endpoint: https://s3.us-west-000.backblazeb2.com
accessKey: e1ac500y7000500047156bd060
secret: "H8FH8eSxM2K/S42CUg5K000Tt4WY2fI"
bucket: "video"
region: us-west-000
/api/admin/config/socialhandles:
post:
summary: Set your social handles.
description: Sets the external links to social networks and profiles.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value:
- platform: github
url: https://github.com/owncast/owncast
- platform: mastodon
url: https://mastodon.social/@gabek
/api/admin/config/customstyles:
post:
summary: Custom CSS styles to be used in the web front endpoints.
description: Save a string containing CSS to be inserted in to the web frontend page.
tags: ["Admin"]
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: "body { color: orange; background: black; }"
/api/admin/viewersOverTime:
get:
summary: Viewers Over Time
description: Get the tracked viewer count over the collected period.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
description: ""
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/TimestampedValue"
examples:
default:
value:
- time: "2020-10-03T21:41:00.381996-05:00"
value: 50
- time: "2020-10-03T21:42:00.381996-05:00"
value: 52
/api/admin/hardwarestats:
get:
summary: Hardware Stats
description: "Get the CPU, Memory and Disk utilization levels over the collected period."
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
description: ""
content:
application/json:
schema:
type: object
properties:
cpu:
type: array
items:
$ref: "#/components/schemas/TimestampedValue"
memory:
type: array
items:
$ref: "#/components/schemas/TimestampedValue"
disk:
type: array
items:
$ref: "#/components/schemas/TimestampedValue"
examples:
default:
value:
cpu:
- time: "2020-10-03T21:41:00.381996-05:00"
value: 23
- time: "2020-10-03T21:42:00.381996-05:00"
value: 27
- time: "2020-10-03T21:43:00.381996-05:00"
value: 22
memory:
- time: "2020-10-03T21:41:00.381996-05:00"
value: 65
- time: "2020-10-03T21:42:00.381996-05:00"
value: 66
- time: "2020-10-03T21:43:00.381996-05:00"
value: 72
disk:
- time: "2020-10-03T21:41:00.381996-05:00"
value: 11
- time: "2020-10-03T21:42:00.381996-05:00"
value: 11
- time: "2020-10-03T21:43:00.381996-05:00"
value: 11
/api/integrations/streamtitle:
post:
summary: Set the stream title.
description: Set the title of the currently streaming content.
tags: ["Integrations"]
security:
- AccessToken: []
responses:
'200':
$ref: "#/components/responses/BasicResponse"
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/ConfigValue"
example:
value: Streaming my favorite game, Desert Bus.
/api/integrations/chat/send:
post:
summary: Send a chat message.
description: Send a chat message on behalf of a 3rd party integration, bot or service.
tags: ["Integrations"]
security:
- AccessToken: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
body:
type: string
description: The message text that will be sent as the user.
responses:
"200":
description: Message was sent.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
message:
type: string
example: sent
/api/integrations/chat/system:
post:
summary: Send a system chat message.
description: Send a chat message on behalf of the system/server.
tags: ["Integrations"]
security:
- AccessToken: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
body:
type: string
description: The message text that will be sent as the system user.
responses:
"200":
description: Message was sent.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
message:
type: string
example: sent
/api/integrations/chat/action:
post:
summary: Send a chat action.
description: Send an action that took place to the chat.
tags: ["Integrations"]
security:
- AccessToken: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- "body"
properties:
body:
type: string
description: The message text that will be sent as the system user.
example: "rolled a 15 on the dice"
author:
type: string
description: An optional user name that performed the action.
example: "JohnSmith"
responses:
"200":
description: Message was sent.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
message:
type: string
example: sent
/api/admin/accesstokens/create:
post:
summary: Create an access token.
description: Create a single access token that has access to the access scopes provided.
tags: ["Integrations"]
security:
- AdminBasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: The human-readable name to give this access token.
scopes:
type: array
items:
type: string
responses:
"200":
description: Token was created.
content:
application/json:
schema:
type: object
properties:
name:
type: string
example: your new token
token:
type: string
example: "zG2xO-mHTFnelCp5xaIkYEFWcPhoOswOSRmFC1BkI="
/api/admin/accesstokens/delete:
post:
summary: Delete an access token.
description: Delete a single access token.
tags: ["Integrations"]
security:
- AdminBasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
token:
type: string
description: The token to delete
responses:
"200":
description: Token was deleted.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
message:
type: string
example: deleted token
/api/admin/accesstokens:
get:
summary: Return all access tokens.
description: Return all of the available access tokens.
tags: ["Integrations"]
security:
- AdminBasicAuth: []
responses:
"200":
description: Tokens are returned
content:
application/json:
schema:
type: array
items:
type: string
/api/admin/webhooks:
get:
summary: Return all webhooks.
description: Return all of the configured webhooks for external events.
tags: ["Admin"]
security:
- AdminBasicAuth: []
responses:
"200":
description: Webhooks are returned
content:
application/json:
schema:
$ref: "#/components/schemas/Webhook"
/api/admin/config/externalactions:
post:
summary: Set external action URLs.
description: Set a collection of external action URLs that are displayed in the UI.
tags: ["Admin", "Integrations"]
security:
- AdminBasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
type: object
properties:
url:
type: string
description: URL of the external action content.
title:
type: string
description: The title to put on the external action button.
description:
type: string
description: Optional additional description to display in the UI.
icon:
type: string
description: The URL to an image to place on the external action button.
color:
type: string
description: Optional color to use for drawing the action button.
openExternally:
type: boolean
description: If set this action will open in a new browser tab instead of an internal modal.
responses:
"200":
description: Actions have been updated.
/api/admin/webhooks/delete:
post:
summary: Delete a single webhook.
description: Delete a single webhook by its ID.
tags: ["Admin"]
security:
- AdminBasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
id:
type: string
description: The webhook id to delete
responses:
"200":
description: Webhook is deleted
/api/admin/webhooks/create:
post:
summary: Create a webhook.
description: Create a single webhook that acts on the requested events.
tags: ["Admin"]
security:
- AdminBasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
description: The url to post the events to.
events:
description: The events to be notified about.
type: array
items:
type: string
responses:
"200":
description: Token was created.
content:
application/json:
schema:
type: object
properties:
name:
type: string
example: your new token
token:
type: string
example: "zG2xO-mHTFnelCp5xaIkYEFWcPhoOswOSRmFC1BkI="
/api/integrations/clients:
get:
summary: Return a list of currently connected clients
description: Return a list of currently connected clients with optional geo details.
tags: ["Integrations"]
security:
- AccessToken: []
responses:
"200":
$ref: "#/components/responses/ClientsResponse"
/api/integrations/chat:
get:
summary: Historical Chat Messages
description: Used to get the backlog of chat messages.
tags: ["Integrations"]
security:
- AccessToken: []
responses:
"200":
description: ""
content:
application/json:
schema:
type: array
items:
type: object
properties:
author:
type: string
description: Username of the chat message poster.
body:
type: string
description: Escaped HTML of the chat message content.
id:
type: string
description: Unique ID of the chat message.
visible:
type: boolean
description: "Should chat message be visibly rendered."
timestamp:
type: string
format: date-time
/api/integrations/chat/updatemessagevisibility:
post:
summary: Update the visibility of chat messages.
description: Pass an array of IDs you want to change the chat visibility of.
requestBody:
content:
application/json:
schema:
type: object
properties:
visible:
type: boolean
description: Are these messages visible.
idArray:
type: array
items:
type: string
description: IDs of the chat messages you wish to change the visibility of.
tags: ["Integrations"]
security:
- AccessToken: []
responses:
"200":
$ref: "#/components/responses/BasicResponse"