{"openapi":"3.1.0","info":{"title":"Cloudflare Stream (BYOK) API","version":"0.1.0","description":"Cloudflare Stream (BYOK) lets an AI assistant read your own Cloudflare Stream data through the Cloudflare Stream API with a key you supply (Cloudflare API token with Stream read permission). Read-only: 10 tools (list_videos, get_video, list_video_captions, get_video_downloads, list_video_audio_tracks, list_live_inputs, get_live_input, list_watermark_profiles, get_storage_usage,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-cloudflare-stream.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-cloudflare-stream/docs"},"termsOfService":"https://connectorbay.com/byok-cloudflare-stream/terms"},"servers":[{"url":"https://byok-cloudflare-stream.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-cloudflare-stream/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_videos":{"post":{"operationId":"list_videos","summary":"List videos in a Cloudflare Stream account with status, duration, size, dates, thumbnail and HLS/DASH playback URLs. Fil","description":"List videos in a Cloudflare Stream account with status, duration, size, dates, thumbnail and HLS/DASH playback URLs. Filter by status, search text, creator or date range. Use for \"Which videos are ready in my Cloudflare Stream library\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"status":{"anyOf":[{"enum":["pendingupload","downloading","queued","inprogress","ready","error","live-inprogress"],"type":"string"},{"type":"null"}],"default":null,"description":"Only videos in this state.","title":"Status"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Text to search for in video names and metadata.","title":"Search"},"creator":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only videos from this creator tag.","title":"Creator"},"after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only videos created after this RFC 3339 time.","title":"After"},"before":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only videos created before this RFC 3339 time.","title":"Before"},"asc":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to sort oldest first (default newest first).","title":"Asc"},"include_counts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include the total and range counts.","title":"Include Counts"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Maximum videos to return (1 to 100 here; the service allows more).","title":"Limit"}},"required":["account_id"],"title":"list_videosArguments","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_video":{"post":{"operationId":"get_video","summary":"Get one Stream video's status, metadata, duration, size, playback URLs, thumbnail, signed-URL requirement and scheduled ","description":"Get one Stream video's status, metadata, duration, size, playback URLs, thumbnail, signed-URL requirement and scheduled deletion. Use for \"Show details of Cloudflare Stream video ea95132c15732412d22c1476fa83f27a\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"video_id":{"description":"Stream video uid, as returned by list_videos.","maxLength":64,"title":"Video Id","type":"string"}},"required":["account_id","video_id"],"title":"get_videoArguments","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_captions":{"post":{"operationId":"list_video_captions","summary":"List the captions and subtitles of a Stream video with language, label, status and whether they were generated automatic","description":"List the captions and subtitles of a Stream video with language, label, status and whether they were generated automatically. Use for \"Which caption languages does Stream video ea95132c15732412d22c1476fa83f27a have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"video_id":{"description":"Stream video uid, as returned by list_videos.","maxLength":64,"title":"Video Id","type":"string"}},"required":["account_id","video_id"],"title":"list_video_captionsArguments","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_video_downloads":{"post":{"operationId":"get_video_downloads","summary":"Show the status and URLs of the MP4 and audio-only downloads enabled for a Stream video. Use for \"Are downloads availabl","description":"Show the status and URLs of the MP4 and audio-only downloads enabled for a Stream video. Use for \"Are downloads available for Stream video ea95132c15732412d22c1476fa83f27a\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"video_id":{"description":"Stream video uid, as returned by list_videos.","maxLength":64,"title":"Video Id","type":"string"}},"required":["account_id","video_id"],"title":"get_video_downloadsArguments","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_audio_tracks":{"post":{"operationId":"list_video_audio_tracks","summary":"List additional audio tracks attached to a Stream video with label, language status and default flag. Use for \"Does Stre","description":"List additional audio tracks attached to a Stream video with label, language status and default flag. Use for \"Does Stream video ea95132c15732412d22c1476fa83f27a have extra audio tracks\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"video_id":{"description":"Stream video uid, as returned by list_videos.","maxLength":64,"title":"Video Id","type":"string"}},"required":["account_id","video_id"],"title":"list_video_audio_tracksArguments","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_live_inputs":{"post":{"operationId":"list_live_inputs","summary":"List the live inputs (streaming endpoints) in the account with uid, enabled flag, metadata and dates. Stream keys are no","description":"List the live inputs (streaming endpoints) in the account with uid, enabled flag, metadata and dates. Stream keys are not returned by this list. Use for \"What live inputs do I have in Cloudflare Stream\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"include_counts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include totals.","title":"Include Counts"}},"required":["account_id"],"title":"list_live_inputsArguments","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_input":{"post":{"operationId":"get_live_input","summary":"Get one live input's state: connection status, enabled flag, recording mode, latency setting and playback URLs. Ingest s","description":"Get one live input's state: connection status, enabled flag, recording mode, latency setting and playback URLs. Ingest stream keys are not returned. Use for \"Is Cloudflare Stream live input f256e6ea9341d51eea64c9454659e576 connected\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"live_input_id":{"description":"Live input uid, as returned by list_live_inputs.","maxLength":64,"title":"Live Input Id","type":"string"}},"required":["account_id","live_input_id"],"title":"get_live_inputArguments","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_watermark_profiles":{"post":{"operationId":"list_watermark_profiles","summary":"List the watermark profiles saved in the account with name, position, scale, opacity and size. Use for \"What watermark p","description":"List the watermark profiles saved in the account with name, position, scale, opacity and size. Use for \"What watermark profiles does my Cloudflare Stream account have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"}},"required":["account_id"],"title":"list_watermark_profilesArguments","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_storage_usage":{"post":{"operationId":"get_storage_usage","summary":"Show total stored minutes, the plan's minute limit and the video count for the account (optionally for one creator). Use","description":"Show total stored minutes, the plan's minute limit and the video count for the account (optionally for one creator). Use for \"How many minutes of video am I storing in Cloudflare Stream\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"creator":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only count videos of this creator tag.","title":"Creator"}},"required":["account_id"],"title":"get_storage_usageArguments","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_viewing_usage":{"post":{"operationId":"get_viewing_usage","summary":"Get minutes of video viewed over time, bucketed by hour, day, week or month, for a time range. Use for \"How many Stream ","description":"Get minutes of video viewed over time, bucketed by hour, day, week or month, for a time range. Use for \"How many Stream minutes were viewed each day last week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"account_id":{"description":"Cloudflare account id (32-character hex string shown in the dashboard URL or returned by the Cloudflare connector's list_accounts).","maxLength":40,"title":"Account Id","type":"string"},"since":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the range (ISO 8601); defaults to 6 hours ago.","title":"Since"},"until":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the range (ISO 8601); defaults to now.","title":"Until"},"time_delta":{"anyOf":[{"enum":["hour","day","week","month","quarter","year"],"type":"string"},{"type":"null"}],"default":"day","description":"Bucket size: hour, day, week, month, quarter or year.","title":"Time Delta"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Maximum number of buckets (1 to 1000).","title":"Limit"}},"required":["account_id"],"title":"get_viewing_usageArguments","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}}}}