diff --git a/docs/api/reference.md b/docs/api/reference.md
index 4d4a4810..a9ea6f47 100644
--- a/docs/api/reference.md
+++ b/docs/api/reference.md
@@ -23,7 +23,7 @@ The notifications can be configured using Webhook or Websocket.
### REST API
-[Server OpenAPI](https://github.com/fishjam-cloud/documentation/tree/main/static/api/fishjam-server-openapi.yaml)
+[Server REST API Reference](/api/rest)
### Protobufs
diff --git a/docs/how-to/backend/server-setup.mdx b/docs/how-to/backend/server-setup.mdx
index d572b336..8d303cba 100644
--- a/docs/how-to/backend/server-setup.mdx
+++ b/docs/how-to/backend/server-setup.mdx
@@ -14,7 +14,7 @@ Install the SDK for the language of your choice. We provide libraries for [**Nod
It's also possible to use the bare REST API, in this case you can skip this step.
-
+
```bash
npm install @fishjam-cloud/js-server-sdk
@@ -22,7 +22,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
yarn add @fishjam-cloud/js-server-sdk
@@ -30,7 +30,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
pip install fishjam-server-sdk
@@ -38,13 +38,21 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
poetry add fishjam-server-sdk
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
## Setup your client
diff --git a/docs/tutorials/backend-quick-start.mdx b/docs/tutorials/backend-quick-start.mdx
index 6475e95c..0c423d2b 100644
--- a/docs/tutorials/backend-quick-start.mdx
+++ b/docs/tutorials/backend-quick-start.mdx
@@ -114,6 +114,14 @@ A simple backend server that can create rooms, add peers, and generate tokens fo
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
@@ -395,6 +403,14 @@ Build a simple HTTP endpoint that your client apps can call:
```
+
+
+
+ ```bash
+ uv add fastapi[standard]
+ ```
+
+
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 53ac287c..1006d5fd 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -1,10 +1,10 @@
import type { Config } from "@docusaurus/types";
import type * as Preset from "@docusaurus/preset-classic";
import type { UserThemeConfig as DocSearchThemeConfig } from "@docsearch/docusaurus-adapter";
+import type { ScalarOptions } from "@scalar/docusaurus";
import { BundledLanguage, bundledLanguages } from "shiki";
import type { MDXPlugin } from "@docusaurus/mdx-loader";
import rehypeShiki, { RehypeShikiOptions } from "@shikijs/rehype";
-import { removeTwoslashNotations } from "twoslash";
import {
transformerMetaHighlight,
transformerNotationDiff,
@@ -241,6 +241,21 @@ const config: Config = {
src: "img/logo.svg",
},
items: [
+ {
+ type: "doc",
+ docId: "index",
+ label: "Docs",
+ position: "left",
+ },
+ {
+ to: "/api/rest",
+ label: "API Reference",
+ position: "left",
+ },
+ {
+ type: "docsVersionDropdown",
+ position: "right",
+ },
{
href: "https://fishjam.io/app/",
label: "Fishjam Dashboard",
@@ -251,9 +266,6 @@ const config: Config = {
label: "GitHub",
position: "right",
},
- {
- type: "docsVersionDropdown",
- },
],
},
docsearch: {
@@ -313,6 +325,23 @@ const config: Config = {
plugins: [
["@docusaurus/plugin-client-redirects", { createRedirects }],
"@docsearch/docusaurus-adapter",
+ [
+ "@scalar/docusaurus",
+ {
+ label: "Server REST API",
+ route: "/api/rest",
+ showNavLink: false,
+ configuration: {
+ url: "/docs/api/fishjam-server-openapi.yaml",
+ hideSearch: true,
+ persistAuth: true,
+ defaultOpenFirstTag: false,
+ authentication: {
+ preferredSecurityScheme: "management_token",
+ },
+ },
+ } as ScalarOptions,
+ ],
[
"docusaurus-plugin-typedoc",
{
diff --git a/package.json b/package.json
index 199de478..7ef0fc47 100644
--- a/package.json
+++ b/package.json
@@ -31,11 +31,13 @@
"@docusaurus/preset-classic": "^3.10.0",
"@docusaurus/remark-plugin-npm2yarn": "^3.10.0",
"@docusaurus/theme-mermaid": "^3.10.0",
+ "@docusaurus/utils": "^3.10.0",
"@fastify/env": "^5.0.2",
"@fishjam-cloud/js-server-sdk": "link:./packages/js-server-sdk/packages/js-server-sdk",
"@fishjam-cloud/react-client": "link:./packages/web-client-sdk/packages/react-client",
"@fishjam-cloud/react-native-client": "link:./packages/web-client-sdk/packages/mobile-client",
"@mdx-js/react": "^3.1.0",
+ "@scalar/docusaurus": "^0.8.5",
"@shikijs/rehype": "^3.6.0",
"@shikijs/transformers": "^3.6.0",
"@swmansion/smelter": "^0.2.1",
diff --git a/src/css/custom.css b/src/css/custom.css
index 1e898b15..c28f4eaa 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -28,15 +28,19 @@
--ifm-color-primary-lightest: #4fddbf;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}
+
html[data-theme="light"] body {
color: #221f1c;
}
+
html[data-theme="light"] footer.footer {
background-color: #fcf4e4;
}
+
html[data-theme="light"] nav.navbar--fixed-top {
background-color: #fcf4e4;
}
+
html[data-theme="light"] header.heroBanner_src-pages-index-module {
background-color: #9bdcfb;
color: #221f1c;
@@ -64,6 +68,10 @@ html[data-theme="light"] header.heroBanner_src-pages-index-module {
vertical-align: middle;
}
+.scalar-api-reference .badge {
+ text-transform: unset;
+}
+
.badge--web {
background-color: #3578e5;
color: white;
@@ -114,3 +122,28 @@ extra spacing keeps it from overlapping with cookies button */
}
@import url("./_shiki.css");
+
+/* Align the Scalar API reference typography with the rest of the docs. */
+:root {
+ --scalar-font-size-1: var(--ifm-h3-font-size);
+ --scalar-font-size-2: var(--ifm-h4-font-size);
+ --scalar-font-size-3: 0.9375rem;
+ --scalar-font-size-4: 0.9rem;
+ --scalar-font-size-5: 0.85rem;
+ --scalar-font-size-6: 0.8rem;
+ --scalar-font-size-7: 0.75rem;
+
+ --scalar-paragraph: 0.9375rem;
+ --scalar-small: 0.9rem;
+ --scalar-mini: 0.75rem;
+
+ --scalar-heading-1: var(--ifm-h1-font-size);
+ --scalar-heading-2: var(--ifm-h2-font-size);
+ --scalar-heading-3: var(--ifm-h3-font-size);
+ --scalar-heading-4: var(--ifm-h4-font-size);
+ --scalar-heading-5: var(--ifm-h5-font-size);
+ --scalar-heading-6: var(--ifm-h6-font-size);
+
+ --scalar-font: var(--ifm-font-family-base);
+ --scalar-font-code: var(--ifm-font-family-monospace);
+}
diff --git a/src/theme/NavbarItem/index.tsx b/src/theme/NavbarItem/index.tsx
new file mode 100644
index 00000000..cac1dc3c
--- /dev/null
+++ b/src/theme/NavbarItem/index.tsx
@@ -0,0 +1,20 @@
+import React from "react";
+import { useLocation } from "@docusaurus/router";
+import OriginalNavbarItem from "@theme-original/NavbarItem";
+
+type NavbarItemProps = React.ComponentProps;
+
+export default function NavbarItemWrapper(
+ props: NavbarItemProps,
+): React.JSX.Element | null {
+ const { pathname } = useLocation();
+ const isDocsVersionDropdown = props.type === "docsVersionDropdown";
+ const isApiReferencePage = pathname.startsWith("/api/rest");
+
+ // The Scalar REST reference is unversioned, so we hide the version dropdown
+ if (isDocsVersionDropdown && isApiReferencePage) {
+ return null;
+ }
+
+ return ;
+}
diff --git a/static/api/fishjam-server-openapi.yaml b/static/api/fishjam-server-openapi.yaml
index 6c0383c1..5170fcd0 100644
--- a/static/api/fishjam-server-openapi.yaml
+++ b/static/api/fishjam-server-openapi.yaml
@@ -8,7 +8,7 @@ components:
data:
properties:
token:
- $ref: "#/components/schemas/AuthToken"
+ $ref: '#/components/schemas/AuthToken'
required:
- token
type: object
@@ -21,16 +21,16 @@ components:
description: Options specific to the Agent peer
properties:
output:
- $ref: "#/components/schemas/AgentOutput"
+ $ref: '#/components/schemas/AgentOutput'
subscribeMode:
- $ref: "#/components/schemas/SubscribeMode"
+ $ref: '#/components/schemas/SubscribeMode'
title: PeerOptionsAgent
type: object
RoomDetailsResponse:
description: Response containing room details
properties:
data:
- $ref: "#/components/schemas/Room"
+ $ref: '#/components/schemas/Room'
required:
- data
title: RoomDetailsResponse
@@ -41,22 +41,21 @@ components:
data:
properties:
room:
- $ref: "#/components/schemas/Room"
+ $ref: '#/components/schemas/Room'
required:
- room
- - fishjam_address
type: object
required:
- data
title: RoomCreateDetailsResponse
type: object
Room:
- description: Description of the room state
+ description: State of a room
properties:
compositionInfo:
- $ref: "#/components/schemas/CompositionInfo"
+ $ref: '#/components/schemas/CompositionInfo'
config:
- $ref: "#/components/schemas/RoomConfig"
+ $ref: '#/components/schemas/RoomConfig'
id:
description: Room ID
example: room-1
@@ -64,7 +63,7 @@ components:
peers:
description: List of all peers
items:
- $ref: "#/components/schemas/Peer"
+ $ref: '#/components/schemas/Peer'
type: array
required:
- id
@@ -104,6 +103,11 @@ components:
description: Restrics stream to audio only
nullable: true
type: boolean
+ batchWebhookNotifications:
+ default: false
+ description: If true, webhook notifications for this stream are coalesced into a single NotificationBatch per HTTP send instead of one request per notification. VAD notifications are unaffected.
+ nullable: false
+ type: boolean
public:
default: false
description: True if livestream viewers can omit specifying a token.
@@ -138,11 +142,11 @@ components:
data:
properties:
peer:
- $ref: "#/components/schemas/Peer"
+ $ref: '#/components/schemas/Peer'
peer_websocket_url:
- $ref: "#/components/schemas/WebsocketURL"
+ $ref: '#/components/schemas/WebsocketURL'
token:
- $ref: "#/components/schemas/AuthToken"
+ $ref: '#/components/schemas/AuthToken'
required:
- peer
- token
@@ -155,7 +159,7 @@ components:
description: Response containing streamer details
properties:
data:
- $ref: "#/components/schemas/Streamer"
+ $ref: '#/components/schemas/Streamer'
required:
- data
title: StreamerDetailsResponse
@@ -187,7 +191,7 @@ components:
properties:
data:
items:
- $ref: "#/components/schemas/Stream"
+ $ref: '#/components/schemas/Stream'
type: array
required:
- data
@@ -197,9 +201,9 @@ components:
additionalProperties: false
description: Peer-specific options
oneOf:
- - $ref: "#/components/schemas/PeerOptionsWebRTC"
- - $ref: "#/components/schemas/PeerOptionsAgent"
- - $ref: "#/components/schemas/PeerOptionsVapi"
+ - $ref: '#/components/schemas/PeerOptionsWebRTC'
+ - $ref: '#/components/schemas/PeerOptionsAgent'
+ - $ref: '#/components/schemas/PeerOptionsVapi'
title: PeerOptions
type: object
Streamer:
@@ -209,11 +213,13 @@ components:
description: Assigned streamer id
type: string
status:
+ description: Streamer connection status
enum:
- connected
- disconnected
type: string
token:
+ description: Token streamer should authorize with
example: 5cdac726-57a3-4ecb-b1d5-72a3d62ec242
type: string
required:
@@ -234,7 +240,7 @@ components:
description: Response containing viewer details
properties:
data:
- $ref: "#/components/schemas/Viewer"
+ $ref: '#/components/schemas/Viewer'
required:
- data
title: ViewerDetailsResponse
@@ -283,15 +289,16 @@ components:
description: Peer configuration
properties:
options:
- $ref: "#/components/schemas/PeerOptions"
+ $ref: '#/components/schemas/PeerOptions'
type:
- $ref: "#/components/schemas/PeerType"
+ $ref: '#/components/schemas/PeerType'
required:
- options
- type
title: PeerConfig
type: object
TrackMetadata:
+ description: Metadata attached to the track by the peer
example:
source: camera
nullable: true
@@ -322,12 +329,12 @@ components:
peers:
description: List of peer IDs this peer subscribes to
items:
- $ref: "#/components/schemas/PeerID"
+ $ref: '#/components/schemas/PeerID'
type: array
tracks:
description: List of track IDs this peer subscribes to
items:
- $ref: "#/components/schemas/TrackID"
+ $ref: '#/components/schemas/TrackID'
type: array
required:
- peers
@@ -340,9 +347,10 @@ components:
title: WebsocketURL
type: string
ViewerToken:
- description: Token for authorizing broadcaster viewer connection
+ description: Viewer authorization token
properties:
token:
+ description: Token viewer should authorize with
example: 5cdac726-57a3-4ecb-b1d5-72a3d62ec242
type: string
required:
@@ -356,6 +364,7 @@ components:
description: Assigned viewer id
type: string
token:
+ description: Token viewer should authorize with
example: 5cdac726-57a3-4ecb-b1d5-72a3d62ec242
type: string
required:
@@ -372,6 +381,11 @@ components:
additionalProperties: false
description: Room configuration
properties:
+ batchWebhookNotifications:
+ default: false
+ description: If true, webhook notifications for this room are coalesced into a single NotificationBatch per HTTP send instead of one request per notification. VAD notifications are unaffected.
+ nullable: false
+ type: boolean
maxPeers:
description: Maximum amount of peers allowed into the room
example: 10
@@ -384,9 +398,9 @@ components:
nullable: false
type: boolean
roomType:
- $ref: "#/components/schemas/RoomType"
+ $ref: '#/components/schemas/RoomType'
videoCodec:
- $ref: "#/components/schemas/VideoCodec"
+ $ref: '#/components/schemas/VideoCodec'
webhookUrl:
description: URL where Fishjam notifications will be sent
example: https://backend.address.com/fishjam-notifications-endpoint
@@ -406,22 +420,22 @@ components:
description: Describes peer status
properties:
id:
- $ref: "#/components/schemas/PeerID"
+ $ref: '#/components/schemas/PeerID'
metadata:
- $ref: "#/components/schemas/PeerMetadata"
+ $ref: '#/components/schemas/PeerMetadata'
status:
- $ref: "#/components/schemas/PeerStatus"
+ $ref: '#/components/schemas/PeerStatus'
subscribeMode:
- $ref: "#/components/schemas/SubscribeMode"
+ $ref: '#/components/schemas/SubscribeMode'
subscriptions:
- $ref: "#/components/schemas/Subscriptions"
+ $ref: '#/components/schemas/Subscriptions'
tracks:
description: List of all peer's tracks
items:
- $ref: "#/components/schemas/Track"
+ $ref: '#/components/schemas/Track'
type: array
type:
- $ref: "#/components/schemas/PeerType"
+ $ref: '#/components/schemas/PeerType'
required:
- id
- type
@@ -443,7 +457,7 @@ components:
forwardings:
description: List of active track forwardings
items:
- $ref: "#/components/schemas/TrackForwardingInfo"
+ $ref: '#/components/schemas/TrackForwardingInfo'
type: array
required:
- compositionUrl
@@ -451,6 +465,7 @@ components:
title: CompositionInfo
type: object
TrackType:
+ description: Media type carried by the track
enum:
- audio
- video
@@ -468,7 +483,7 @@ components:
pattern: ^[a-zA-Z0-9-]+$
type: string
subscribeMode:
- $ref: "#/components/schemas/SubscribeMode"
+ $ref: '#/components/schemas/SubscribeMode'
required:
- apiKey
- callId
@@ -478,7 +493,7 @@ components:
description: Response containing stream details
properties:
data:
- $ref: "#/components/schemas/Stream"
+ $ref: '#/components/schemas/Stream'
required:
- data
title: StreamDetailsResponse
@@ -488,9 +503,9 @@ components:
description: Options specific to the WebRTC peer
properties:
metadata:
- $ref: "#/components/schemas/WebRTCMetadata"
+ $ref: '#/components/schemas/WebRTCMetadata'
subscribeMode:
- $ref: "#/components/schemas/SubscribeMode"
+ $ref: '#/components/schemas/SubscribeMode'
title: PeerOptionsWebRTC
type: object
RoomsListingResponse:
@@ -498,14 +513,14 @@ components:
properties:
data:
items:
- $ref: "#/components/schemas/Room"
+ $ref: '#/components/schemas/Room'
type: array
required:
- data
title: RoomsListingResponse
type: object
Stream:
- description: Describes stream status
+ description: State of a stream
properties:
audioOnly:
description: True if stream is restricted to audio only
@@ -514,16 +529,17 @@ components:
description: Assigned stream id
type: string
public:
+ description: True if livestream viewers can omit specifying a token.
type: boolean
streamers:
description: List of all streamers
items:
- $ref: "#/components/schemas/Streamer"
+ $ref: '#/components/schemas/Streamer'
type: array
viewers:
description: List of all viewers
items:
- $ref: "#/components/schemas/Viewer"
+ $ref: '#/components/schemas/Viewer'
type: array
required:
- id
@@ -533,9 +549,10 @@ components:
title: Stream
type: object
StreamerToken:
- description: Token for authorizing broadcaster streamer connection
+ description: Streamer authorization token
properties:
token:
+ description: Token streamer should authorize with
example: 5cdac726-57a3-4ecb-b1d5-72a3d62ec242
type: string
required:
@@ -543,14 +560,14 @@ components:
title: StreamerToken
type: object
Track:
- description: Describes media track of a Peer
+ description: Media track of a Peer
properties:
id:
- $ref: "#/components/schemas/TrackID"
+ $ref: '#/components/schemas/TrackID'
metadata:
- $ref: "#/components/schemas/TrackMetadata"
+ $ref: '#/components/schemas/TrackMetadata'
type:
- $ref: "#/components/schemas/TrackType"
+ $ref: '#/components/schemas/TrackType'
title: Track
type: object
AgentOutput:
@@ -558,9 +575,9 @@ components:
description: Output audio options
properties:
audioFormat:
- $ref: "#/components/schemas/AudioFormat"
+ $ref: '#/components/schemas/AudioFormat'
audioSampleRate:
- $ref: "#/components/schemas/AudioSampleRate"
+ $ref: '#/components/schemas/AudioSampleRate'
title: AgentOutput
type: object
AudioFormat:
@@ -572,90 +589,106 @@ components:
title: AudioFormat
type: string
securitySchemes:
- authorization:
+ management_token:
scheme: bearer
type: http
info:
- license:
- name: Apache 2.0
- url: https://www.apache.org/licenses/LICENSE-2.0
- title: Fishjam Media Server
+ contact:
+ email: contact@fishjam.io
+ name: Fishjam Support
+ description: |
+ API for managing Fishjam real-time media resources.
+
+ ## Authentication
+ ##
+ Credentials (Fishjam ID, Fishjam Management Token) can be obtained at https://fishjam.io/app.
+ All requests require HTTP Bearer authorization using the Fishjam Management Token.
+
+ ## Fishjam SDKs
+ ##
+ For TypeScript and Python users, we provide SDKs that simplify using this API.
+ We recommend using them instead of manually consuming the API in these languages.
+
+ You can learn more about our SDKs in our [SDK Docs](http://fishjam.swmansion.com/docs/how-to/backend/server-setup)
+ title: Fishjam API
version: 0.26.4
openapi: 3.0.0
paths:
/livestream:
get:
callbacks: {}
+ description: List all livestreams.
operationId: get_all_streams
parameters: []
responses:
- "200":
+ '200':
content:
application/json:
schema:
- $ref: "#/components/schemas/StreamsListingResponse"
+ $ref: '#/components/schemas/StreamsListingResponse'
description: Success
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Show information about all streams
+ - management_token: []
+ summary: List all streams
tags:
- - stream
+ - Streams
post:
callbacks: {}
+ description: Create a new livestream with the given configuration.
operationId: create_stream
parameters: []
requestBody:
content:
application/json:
schema:
- $ref: "#/components/schemas/StreamConfig"
- description: Stream configuration
+ $ref: '#/components/schemas/StreamConfig'
required: false
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/StreamDetailsResponse"
+ $ref: '#/components/schemas/StreamDetailsResponse'
description: Stream created successfully
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Creates stream
+ - management_token: []
+ summary: Create a stream
tags:
- - stream
+ - Streams
/livestream/{stream_id}:
delete:
callbacks: {}
+ description: Delete a stream by id and disconnect all of its streamers and viewers.
operationId: delete_stream
parameters:
- description: Stream ID
@@ -665,27 +698,28 @@ paths:
schema:
type: string
responses:
- "204":
+ '204':
description: Successfully deleted stream
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Deletes stream
+ - management_token: []
+ summary: Delete a stream
tags:
- - stream
+ - Streams
get:
callbacks: {}
+ description: Get a stream by id.
operationId: get_stream
parameters:
- description: Stream ID
@@ -695,38 +729,39 @@ paths:
schema:
type: string
responses:
- "200":
+ '200':
content:
application/json:
schema:
- $ref: "#/components/schemas/StreamDetailsResponse"
+ $ref: '#/components/schemas/StreamDetailsResponse'
description: Success
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Stream doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Shows information about the stream
+ - management_token: []
+ summary: Get a stream
tags:
- - stream
+ - Streams
/livestream/{stream_id}/streamer:
post:
callbacks: {}
+ description: Create a streamer for a stream and return its credentials.
operationId: create_streamer
parameters:
- description: Stream id
@@ -736,38 +771,39 @@ paths:
schema:
type: string
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/StreamerDetailsResponse"
+ $ref: '#/components/schemas/StreamerDetailsResponse'
description: Streamer successfully created
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Stream doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Creates streamer
+ - management_token: []
+ summary: Create a streamer
tags:
- - streamer
+ - Streamers
/livestream/{stream_id}/streamer/{streamer_id}:
delete:
callbacks: {}
+ description: Delete a streamer from a stream and revoke its token.
operationId: delete_streamer
parameters:
- description: Stream id
@@ -783,28 +819,29 @@ paths:
schema:
type: string
responses:
- "204":
+ '204':
description: Streamer successfully deleted
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Deletes streamer
+ - management_token: []
+ summary: Delete a streamer
tags:
- - streamer
+ - Streamers
/livestream/{stream_id}/viewer:
post:
callbacks: {}
+ description: Create a viewer for a stream and return its credentials.
operationId: create_viewer
parameters:
- description: Stream id
@@ -814,38 +851,39 @@ paths:
schema:
type: string
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/ViewerDetailsResponse"
+ $ref: '#/components/schemas/ViewerDetailsResponse'
description: Viewer successfully created
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Stream doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Creates viewer
+ - management_token: []
+ summary: Create a viewer
tags:
- - viewer
+ - Viewers
/livestream/{stream_id}/viewer/{viewer_id}:
delete:
callbacks: {}
+ description: Delete a viewer from a stream and revoke its token.
operationId: delete_viewer
parameters:
- description: Stream id
@@ -861,98 +899,100 @@ paths:
schema:
type: string
responses:
- "204":
+ '204':
description: Viewer successfully deleted
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Deletes viewer
+ - management_token: []
+ summary: Delete a viewer
tags:
- - viewer
+ - Viewers
/room:
get:
callbacks: {}
+ description: List all rooms and livestreams.
operationId: get_all_rooms
parameters: []
responses:
- "200":
+ '200':
content:
application/json:
schema:
- $ref: "#/components/schemas/RoomsListingResponse"
+ $ref: '#/components/schemas/RoomsListingResponse'
description: Success
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
security:
- - authorization: []
- summary: Show information about all rooms
+ - management_token: []
+ summary: List all rooms
tags:
- - room
+ - Rooms
post:
callbacks: {}
+ description: Create a new room with the given configuration.
operationId: create_room
parameters: []
requestBody:
content:
application/json:
schema:
- $ref: "#/components/schemas/RoomConfig"
- description: Room configuration
+ $ref: '#/components/schemas/RoomConfig'
required: false
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/RoomCreateDetailsResponse"
+ $ref: '#/components/schemas/RoomCreateDetailsResponse'
description: Room successfully created
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "402":
+ '402':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Usage quota exceeded for free tier
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Creates a room
+ - management_token: []
+ summary: Create a room
tags:
- - room
+ - Rooms
/room/{room_id}:
delete:
callbacks: {}
+ description: Delete a room by id and disconnect all of its peers.
operationId: delete_room
parameters:
- description: Room id
@@ -962,39 +1002,40 @@ paths:
schema:
type: string
responses:
- "204":
+ '204':
description: Successfully deleted room
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Delete the room
+ - management_token: []
+ summary: Delete a room
tags:
- - room
+ - Rooms
get:
callbacks: {}
+ description: Get a room by id.
operationId: get_room
parameters:
- description: Room ID
@@ -1004,44 +1045,45 @@ paths:
schema:
type: string
responses:
- "200":
+ '200':
content:
application/json:
schema:
- $ref: "#/components/schemas/RoomDetailsResponse"
+ $ref: '#/components/schemas/RoomDetailsResponse'
description: Success
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Shows information about the room
+ - management_token: []
+ summary: Get a room
tags:
- - room
+ - Rooms
/room/{room_id}/peer:
post:
callbacks: {}
+ description: Add a peer to a room and return its connection token.
operationId: add_peer
parameters:
- description: Room id
@@ -1054,60 +1096,60 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/PeerConfig"
- description: Peer specification
+ $ref: '#/components/schemas/PeerConfig'
required: false
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/PeerDetailsResponse"
+ $ref: '#/components/schemas/PeerDetailsResponse'
description: Peer successfully created
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request body structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "402":
+ '402':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Usage quota exceeded for free tier
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room doesn't exist
- "409":
+ '409':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Request conflict
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Create peer
+ - management_token: []
+ summary: Create a peer
tags:
- - room
+ - Rooms
/room/{room_id}/peer/{id}:
delete:
callbacks: {}
+ description: Remove a peer from a room and disconnect it.
operationId: delete_peer
parameters:
- description: Room id
@@ -1123,40 +1165,41 @@ paths:
schema:
type: string
responses:
- "204":
+ '204':
description: Peer successfully deleted
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request body structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room ID or Peer ID references a resource that doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Delete peer
+ - management_token: []
+ summary: Delete a peer
tags:
- - room
+ - Rooms
/room/{room_id}/peer/{id}/refresh_token:
post:
callbacks: {}
+ description: Issue a fresh connection token for an existing peer.
operationId: refresh_token
parameters:
- description: Room id
@@ -1172,44 +1215,45 @@ paths:
schema:
type: string
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/PeerRefreshTokenResponse"
+ $ref: '#/components/schemas/PeerRefreshTokenResponse'
description: Token successfully created
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request body structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room ID or Peer ID references a resource that doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Refresh peer token
+ - management_token: []
+ summary: Refresh a peer token
tags:
- - room
+ - Rooms
/room/{room_id}/peer/{id}/subscribe_peer:
post:
callbacks: {}
+ description: Subscribe a peer to all current and future tracks published by another peer in the same room.
operationId: subscribe_peer
parameters:
- description: Room id
@@ -1231,40 +1275,41 @@ paths:
schema:
type: string
responses:
- "200":
+ '200':
description: Peer successfully subscribed to another peer's tracks
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request body structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room ID or Peer ID references a resource that doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Subscribe peer to another peer's tracks
+ - management_token: []
+ summary: Subscribe a peer to another peer's tracks
tags:
- - room
+ - Rooms
/room/{room_id}/peer/{id}/subscribe_tracks:
post:
callbacks: {}
+ description: Subscribe a peer to a specific list of track IDs in the same room.
operationId: subscribe_tracks
parameters:
- description: Room id
@@ -1287,7 +1332,7 @@ paths:
track_ids:
description: List of track IDs to subscribe to
items:
- $ref: "#/components/schemas/TrackID"
+ $ref: '#/components/schemas/TrackID'
type: array
required:
- track_ids
@@ -1295,40 +1340,41 @@ paths:
description: Track IDs
required: false
responses:
- "200":
+ '200':
description: Peer successfully subscribed to tracks
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request body structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room ID or Peer ID references a resource that doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Subscribe peer to specific tracks
+ - management_token: []
+ summary: Subscribe a peer to specific tracks
tags:
- - room
+ - Rooms
/room/{room_id}/streamer:
post:
callbacks: {}
+ description: Issue a fresh streamer token.
operationId: generate_streamer_token
parameters:
- description: ID of the stream.
@@ -1338,44 +1384,45 @@ paths:
schema:
type: string
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/StreamerToken"
+ $ref: '#/components/schemas/StreamerToken'
description: Token successfully created
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request body structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Generate a token that can be used by a streamer to start streaming
+ - management_token: []
+ summary: Create a streamer token
tags:
- - streamer
+ - Streamers
/room/{room_id}/track_forwardings:
post:
callbacks: {}
+ description: Forward a room's tracks into an external composition.
operationId: create_track_forwarding
parameters:
- description: Room id
@@ -1388,38 +1435,38 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/TrackForwarding"
- description: Track forwardings
+ $ref: '#/components/schemas/TrackForwarding'
required: true
responses:
- "201":
+ '201':
description: Track forwardings added successfully
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room doesn't exist
security:
- - authorization: []
- summary: Creates a track forwarding in a room
+ - management_token: []
+ summary: Create a track forwarding
tags:
- - track_forwarding
+ - Track Forwardings
/room/{room_id}/viewer:
post:
callbacks: {}
+ description: Issue a fresh viewer token.
operationId: generate_viewer_token
parameters:
- description: ID of the stream.
@@ -1429,46 +1476,83 @@ paths:
schema:
type: string
responses:
- "201":
+ '201':
content:
application/json:
schema:
- $ref: "#/components/schemas/ViewerToken"
+ $ref: '#/components/schemas/ViewerToken'
description: Token successfully created
- "400":
+ '400':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Invalid request body structure
- "401":
+ '401':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Unauthorized
- "404":
+ '404':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Room doesn't exist
- "503":
+ '503':
content:
application/json:
schema:
- $ref: "#/components/schemas/Error"
+ $ref: '#/components/schemas/Error'
description: Service temporarily unavailable
security:
- - authorization: []
- summary: Generates token that a viewer can use to watch a livestream
+ - management_token: []
+ summary: Create a viewer token
tags:
- - viewer
+ - Viewers
security: []
servers:
- url: https://fishjam.io/api/v1/connect/{fishjamId}
variables:
fishjamId:
- default: ""
- description: Id of user's Fishjam instance
-tags: []
+ default: ''
+ description: Fishjam ID
+tags:
+ - description: |
+ WebRTC rooms for videoconferencing. Each room hosts one or
+ more **peers** that exchange media through Fishjam.
+
+ These endpoints cover the room lifecycle and per-room peer management —
+ adding and removing peers, refreshing peer tokens, and configuring
+ subscription policies between peers. For one-to-many scenarios,
+ see **Streams**.
+ name: Rooms
+ - description: |
+ WebRTC livestreams for broadcasting scenarios.
+ A stream holds the configuration for a one-to-many session and owns the
+ **streamers** that publish to it and the **Viewers** that consume it.
+ name: Streams
+ - description: |
+ A **streamer** represents a single publisher session for a stream and
+ carries an ephemeral token that Fishjam verifies before accepting
+ media. Use these endpoints to provision a streamer, revoke one, or issue a
+ fresh streamer token scoped to a livestream.
+ name: Streamers
+ - description: |
+ A **viewer** represents a single consumer session for a stream, identified
+ by an ephemeral token that Fishjam verifies on subscribe. These
+ endpoints provision and revoke viewers and issue viewer tokens for a
+ livestream room.
+
+ The endpoints in this section are only applicable to private livestreams.
+ Public livestreams can be viewed anonymously, without creating a viewer resource.
+ name: Viewers
+ - description: |
+ Forward media tracks from a room's peers into a **composition**.
+ Useful for compositing room media into a single output for recording, transcoding,
+ or downstream broadcast.
+
+ Only the `"all"` selector is currently supported, which forwards every
+ active track in the room.
+ name: Track Forwardings
diff --git a/versioned_docs/version-0.24.0/how-to/backend/server-setup.mdx b/versioned_docs/version-0.24.0/how-to/backend/server-setup.mdx
index 77a75a88..1e4cad5f 100644
--- a/versioned_docs/version-0.24.0/how-to/backend/server-setup.mdx
+++ b/versioned_docs/version-0.24.0/how-to/backend/server-setup.mdx
@@ -13,7 +13,7 @@ Install the SDK for the language of your choice. We provide libraries for [**Nod
It's also possible to use the bare REST API, in this case you can skip this step.
-
+
```bash
npm install @fishjam-cloud/js-server-sdk
@@ -21,7 +21,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
yarn add @fishjam-cloud/js-server-sdk
@@ -29,7 +29,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
pip install fishjam-server-sdk
@@ -37,13 +37,21 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
poetry add fishjam-server-sdk
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
## Setup your client
diff --git a/versioned_docs/version-0.24.0/tutorials/backend-quick-start.mdx b/versioned_docs/version-0.24.0/tutorials/backend-quick-start.mdx
index 0087c9a2..724f427b 100644
--- a/versioned_docs/version-0.24.0/tutorials/backend-quick-start.mdx
+++ b/versioned_docs/version-0.24.0/tutorials/backend-quick-start.mdx
@@ -113,6 +113,14 @@ A simple backend server that can create rooms, add peers, and generate tokens fo
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
@@ -394,6 +402,14 @@ Build a simple HTTP endpoint that your client apps can call:
```
+
+
+
+ ```bash
+ uv add fastapi[standard]
+ ```
+
+
diff --git a/versioned_docs/version-0.25.0/how-to/backend/server-setup.mdx b/versioned_docs/version-0.25.0/how-to/backend/server-setup.mdx
index 84903f39..26f62786 100644
--- a/versioned_docs/version-0.25.0/how-to/backend/server-setup.mdx
+++ b/versioned_docs/version-0.25.0/how-to/backend/server-setup.mdx
@@ -13,7 +13,7 @@ Install the SDK for the language of your choice. We provide libraries for [**Nod
It's also possible to use the bare REST API, in this case you can skip this step.
-
+
```bash
npm install @fishjam-cloud/js-server-sdk
@@ -21,7 +21,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
yarn add @fishjam-cloud/js-server-sdk
@@ -29,7 +29,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
pip install fishjam-server-sdk
@@ -37,13 +37,21 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
poetry add fishjam-server-sdk
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
## Setup your client
diff --git a/versioned_docs/version-0.25.0/tutorials/backend-quick-start.mdx b/versioned_docs/version-0.25.0/tutorials/backend-quick-start.mdx
index 0087c9a2..724f427b 100644
--- a/versioned_docs/version-0.25.0/tutorials/backend-quick-start.mdx
+++ b/versioned_docs/version-0.25.0/tutorials/backend-quick-start.mdx
@@ -113,6 +113,14 @@ A simple backend server that can create rooms, add peers, and generate tokens fo
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
@@ -394,6 +402,14 @@ Build a simple HTTP endpoint that your client apps can call:
```
+
+
+
+ ```bash
+ uv add fastapi[standard]
+ ```
+
+
diff --git a/versioned_docs/version-0.26.0/how-to/backend/server-setup.mdx b/versioned_docs/version-0.26.0/how-to/backend/server-setup.mdx
index d572b336..8d303cba 100644
--- a/versioned_docs/version-0.26.0/how-to/backend/server-setup.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/server-setup.mdx
@@ -14,7 +14,7 @@ Install the SDK for the language of your choice. We provide libraries for [**Nod
It's also possible to use the bare REST API, in this case you can skip this step.
-
+
```bash
npm install @fishjam-cloud/js-server-sdk
@@ -22,7 +22,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
yarn add @fishjam-cloud/js-server-sdk
@@ -30,7 +30,7 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
pip install fishjam-server-sdk
@@ -38,13 +38,21 @@ It's also possible to use the bare REST API, in this case you can skip this step
-
+
```bash
poetry add fishjam-server-sdk
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
## Setup your client
diff --git a/versioned_docs/version-0.26.0/tutorials/backend-quick-start.mdx b/versioned_docs/version-0.26.0/tutorials/backend-quick-start.mdx
index 6475e95c..0c423d2b 100644
--- a/versioned_docs/version-0.26.0/tutorials/backend-quick-start.mdx
+++ b/versioned_docs/version-0.26.0/tutorials/backend-quick-start.mdx
@@ -114,6 +114,14 @@ A simple backend server that can create rooms, add peers, and generate tokens fo
```
+
+
+
+ ```bash
+ uv add fishjam-server-sdk
+ ```
+
+
@@ -395,6 +403,14 @@ Build a simple HTTP endpoint that your client apps can call:
```
+
+
+
+ ```bash
+ uv add fastapi[standard]
+ ```
+
+
diff --git a/yarn.lock b/yarn.lock
index c57bef2a..edee125b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3041,6 +3041,16 @@ __metadata:
languageName: node
linkType: hard
+"@docusaurus/logger@npm:3.10.1":
+ version: 3.10.1
+ resolution: "@docusaurus/logger@npm:3.10.1"
+ dependencies:
+ chalk: "npm:^4.1.2"
+ tslib: "npm:^2.6.0"
+ checksum: 10c0/c78c676de0cf11ba5737abe8d13ebb67c4fdd8019ac8512ee18b34c27fdd5aaf32b703da3596271592be8615094507754791ac16587a24146f3830e1558a24c3
+ languageName: node
+ linkType: hard
+
"@docusaurus/mdx-loader@npm:3.10.0":
version: 3.10.0
resolution: "@docusaurus/mdx-loader@npm:3.10.0"
@@ -3496,6 +3506,27 @@ __metadata:
languageName: node
linkType: hard
+"@docusaurus/types@npm:3.10.1":
+ version: 3.10.1
+ resolution: "@docusaurus/types@npm:3.10.1"
+ dependencies:
+ "@mdx-js/mdx": "npm:^3.0.0"
+ "@types/history": "npm:^4.7.11"
+ "@types/mdast": "npm:^4.0.2"
+ "@types/react": "npm:*"
+ commander: "npm:^5.1.0"
+ joi: "npm:^17.9.2"
+ react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0"
+ utility-types: "npm:^3.10.0"
+ webpack: "npm:^5.95.0"
+ webpack-merge: "npm:^5.9.0"
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ checksum: 10c0/63cc1d92ec775fb0e58f156b4edc7075612943a94d15d4648b60effcbc34c70a1092569d66d552878779b48d5111abe2fc154ba6a3bca2af0383550c9f9a015b
+ languageName: node
+ linkType: hard
+
"@docusaurus/utils-common@npm:3.10.0":
version: 3.10.0
resolution: "@docusaurus/utils-common@npm:3.10.0"
@@ -3506,6 +3537,16 @@ __metadata:
languageName: node
linkType: hard
+"@docusaurus/utils-common@npm:3.10.1":
+ version: 3.10.1
+ resolution: "@docusaurus/utils-common@npm:3.10.1"
+ dependencies:
+ "@docusaurus/types": "npm:3.10.1"
+ tslib: "npm:^2.6.0"
+ checksum: 10c0/1dde7a5c538a2cbe9eba46c9a3991a773e2d9d5b9c489cb010f9284c33cba7d494c1300557f850fa6a6e857747ca835b91f6036b02a726e13d296d7a65f8d8db
+ languageName: node
+ linkType: hard
+
"@docusaurus/utils-validation@npm:3.10.0":
version: 3.10.0
resolution: "@docusaurus/utils-validation@npm:3.10.0"
@@ -3551,6 +3592,35 @@ __metadata:
languageName: node
linkType: hard
+"@docusaurus/utils@npm:^3.10.0":
+ version: 3.10.1
+ resolution: "@docusaurus/utils@npm:3.10.1"
+ dependencies:
+ "@docusaurus/logger": "npm:3.10.1"
+ "@docusaurus/types": "npm:3.10.1"
+ "@docusaurus/utils-common": "npm:3.10.1"
+ escape-string-regexp: "npm:^4.0.0"
+ execa: "npm:^5.1.1"
+ file-loader: "npm:^6.2.0"
+ fs-extra: "npm:^11.1.1"
+ github-slugger: "npm:^1.5.0"
+ globby: "npm:^11.1.0"
+ gray-matter: "npm:^4.0.3"
+ jiti: "npm:^1.20.0"
+ js-yaml: "npm:^4.1.0"
+ lodash: "npm:^4.17.21"
+ micromatch: "npm:^4.0.5"
+ p-queue: "npm:^6.6.2"
+ prompts: "npm:^2.4.2"
+ resolve-pathname: "npm:^3.0.0"
+ tslib: "npm:^2.6.0"
+ url-loader: "npm:^4.1.1"
+ utility-types: "npm:^3.10.0"
+ webpack: "npm:^5.88.1"
+ checksum: 10c0/97d51da30035ef34eced1dbc937f829309a8165a07a9c66d87c5deec03fb62150cbc70b2763ffdec0286b21f1be53f4011a036e4265cb971a892f0ab12172e0a
+ languageName: node
+ linkType: hard
+
"@dual-bundle/import-meta-resolve@npm:^4.1.0":
version: 4.1.0
resolution: "@dual-bundle/import-meta-resolve@npm:4.1.0"
@@ -6327,6 +6397,37 @@ __metadata:
languageName: node
linkType: hard
+"@scalar/docusaurus@npm:^0.8.5":
+ version: 0.8.5
+ resolution: "@scalar/docusaurus@npm:0.8.5"
+ dependencies:
+ "@scalar/types": "npm:0.7.5"
+ peerDependencies:
+ "@docusaurus/utils": ^3.9.2
+ react: ^18.0.0 || ^19.0.0
+ checksum: 10c0/019aee5e8ef65bad8dcaa3c16fe71da70bcc599c40c3cec4699de888b7e5f5029ce949f27700de13b66d749ebcc1e5aa91195b6ab9a75041e4c4efd6c80e9b09
+ languageName: node
+ linkType: hard
+
+"@scalar/helpers@npm:0.4.2":
+ version: 0.4.2
+ resolution: "@scalar/helpers@npm:0.4.2"
+ checksum: 10c0/78c98e50bd63922dc1a212a60c5bfc23e26851c82113989fea5eece4cd67832347b65fc712ee2738545a96ad328b007f40f99eb4f8c4172008c13a34afa52d15
+ languageName: node
+ linkType: hard
+
+"@scalar/types@npm:0.7.5":
+ version: 0.7.5
+ resolution: "@scalar/types@npm:0.7.5"
+ dependencies:
+ "@scalar/helpers": "npm:0.4.2"
+ nanoid: "npm:^5.1.6"
+ type-fest: "npm:^5.3.1"
+ zod: "npm:^4.3.5"
+ checksum: 10c0/ce986503cae7d18615205bfafea2fc94ebe676962313cd5c81a4a4a2a83b8a73b25295690baa2dc96f8095c98fa4e148734f56c46895e300de4ffb462c3eb6b1
+ languageName: node
+ linkType: hard
+
"@shikijs/core@npm:3.7.0":
version: 3.7.0
resolution: "@shikijs/core@npm:3.7.0"
@@ -11803,12 +11904,14 @@ __metadata:
"@docusaurus/theme-mermaid": "npm:^3.10.0"
"@docusaurus/tsconfig": "npm:^3.10.0"
"@docusaurus/types": "npm:^3.10.0"
+ "@docusaurus/utils": "npm:^3.10.0"
"@fastify/env": "npm:^5.0.2"
"@fishjam-cloud/js-server-sdk": "link:./packages/js-server-sdk/packages/js-server-sdk"
"@fishjam-cloud/react-client": "link:./packages/web-client-sdk/packages/react-client"
"@fishjam-cloud/react-native-client": "link:./packages/web-client-sdk/packages/mobile-client"
"@google/genai": "npm:^1.35.0"
"@mdx-js/react": "npm:^3.1.0"
+ "@scalar/docusaurus": "npm:^0.8.5"
"@shikijs/rehype": "npm:^3.6.0"
"@shikijs/transformers": "npm:^3.6.0"
"@shikijs/twoslash": "npm:^3.6.0"
@@ -15828,6 +15931,15 @@ __metadata:
languageName: node
linkType: hard
+"nanoid@npm:^5.1.6":
+ version: 5.1.7
+ resolution: "nanoid@npm:5.1.7"
+ bin:
+ nanoid: bin/nanoid.js
+ checksum: 10c0/c5523bcb11031d2e8f4eb2ba96f99cd63cbe7f6776748035b4f292c6d524902b142b18a1bf0992e0039f9f925ef51154119bb19ee021766ec0a542d07dc51a82
+ languageName: node
+ linkType: hard
+
"negotiator@npm:0.6.3":
version: 0.6.3
resolution: "negotiator@npm:0.6.3"
@@ -20044,6 +20156,13 @@ __metadata:
languageName: node
linkType: hard
+"tagged-tag@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "tagged-tag@npm:1.0.0"
+ checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1
+ languageName: node
+ linkType: hard
+
"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
version: 2.2.2
resolution: "tapable@npm:2.2.2"
@@ -20347,6 +20466,15 @@ __metadata:
languageName: node
linkType: hard
+"type-fest@npm:^5.3.1":
+ version: 5.5.0
+ resolution: "type-fest@npm:5.5.0"
+ dependencies:
+ tagged-tag: "npm:^1.0.0"
+ checksum: 10c0/60bf79a8df45abf99490e3204eceb5cf7f915413f8a69fb578c75cab37ddcb7d29ee21f185f0e1617323ac0b2a441e001b8dc691e220d0b087e9c29ea205538c
+ languageName: node
+ linkType: hard
+
"type-is@npm:~1.6.18":
version: 1.6.18
resolution: "type-is@npm:1.6.18"
@@ -21345,6 +21473,13 @@ __metadata:
languageName: node
linkType: hard
+"zod@npm:^4.3.5":
+ version: 4.3.6
+ resolution: "zod@npm:4.3.6"
+ checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307
+ languageName: node
+ linkType: hard
+
"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4":
version: 2.0.4
resolution: "zwitch@npm:2.0.4"