{"openapi":"3.1.0","info":{"title":"Castr (BYOK) API","version":"0.1.0","description":"Castr (BYOK) lets an AI assistant read your own Castr data through the Castr API with a key you supply (Castr API access token). Read-only: 6 tools (list_live_streams, get_live_stream, get_live_stream_stats, list_sub_second_streams, list_video_folders, list_folder_contents). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-castr.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-castr/docs"},"termsOfService":"https://connectorbay.com/byok-castr/terms"},"servers":[{"url":"https://byok-castr.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-castr/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_live_streams":{"post":{"operationId":"list_live_streams","summary":"List live streams with name, enabled flag, HLS and embed playback URLs and main settings (adaptive bitrate, cloud record","description":"List live streams with name, enabled flag, HLS and embed playback URLs and main settings (adaptive bitrate, cloud recording, chat, low latency, rewind). Ingest and restream keys are not returned. Use for \"Which Castr live streams do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"low_latency_playback":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True to list only streams with low-latency playback enabled.","title":"Low Latency Playback"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Page number, starting at 1.","title":"Page"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Items per page.","title":"Limit"}},"title":"list_live_streamsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_live_stream":{"post":{"operationId":"get_live_stream","summary":"Get one live stream's name, enabled flag, playback URLs and settings. Ingest and restream keys are not returned. Use for","description":"Get one live stream's name, enabled flag, playback URLs and settings. Ingest and restream keys are not returned. Use for \"What are the playback settings of my Castr stream 620e0d57427ff4ddd764515f\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"stream_id":{"description":"Castr live stream ID from list_live_streams.","maxLength":200,"title":"Stream Id","type":"string"}},"required":["stream_id"],"title":"get_live_streamArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_live_stream_stats":{"post":{"operationId":"get_live_stream_stats","summary":"Get real-time health of a live stream: running status, whether it is alive, current bitrate, retry count and when it ope","description":"Get real-time health of a live stream: running status, whether it is alive, current bitrate, retry count and when it opened. Use for \"Is my Castr stream online and what bitrate is it sending\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"stream_id":{"description":"Castr live stream ID from list_live_streams.","maxLength":200,"title":"Stream Id","type":"string"}},"required":["stream_id"],"title":"get_live_stream_statsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_sub_second_streams":{"post":{"operationId":"list_sub_second_streams","summary":"List sub-second (ultra low latency) streams with name, enabled flag, online status, creation time, embed URL and thumbna","description":"List sub-second (ultra low latency) streams with name, enabled flag, online status, creation time, embed URL and thumbnail. Ingest keys are not returned. Use for \"Which of my Castr sub-second streams are online\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Page number, starting at 1.","title":"Page"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Items per page.","title":"Limit"}},"title":"list_sub_second_streamsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_video_folders":{"post":{"operationId":"list_video_folders","summary":"List video-on-demand folders with name and enabled flag. Page with page and limit. Use for \"What video folders do I have","description":"List video-on-demand folders with name and enabled flag. Page with page and limit. Use for \"What video folders do I have in Castr\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Page number, starting at 1.","title":"Page"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Items per page.","title":"Limit"}},"title":"list_video_foldersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_folder_contents":{"post":{"operationId":"list_folder_contents","summary":"List the videos in a video folder (root videos only unless include_subfolders is true). Page with page and limit. Use fo","description":"List the videos in a video folder (root videos only unless include_subfolders is true). Page with page and limit. Use for \"What videos are in my Castr folder 6401\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"folder_id":{"description":"Video folder ID from list_video_folders.","maxLength":200,"title":"Folder Id","type":"string"},"include_subfolders":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True to include videos from all subfolders.","title":"Include Subfolders"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Page number, starting at 1.","title":"Page"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Items per page.","title":"Limit"}},"required":["folder_id"],"title":"list_folder_contentsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}