{"id":454,"date":"2026-05-07T00:00:00","date_gmt":"2026-05-07T00:00:00","guid":{"rendered":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/05\/07\/stream-introducing-stream-bindings-for-workers-2\/"},"modified":"2026-05-07T00:00:00","modified_gmt":"2026-05-07T00:00:00","slug":"stream-introducing-stream-bindings-for-workers-2","status":"publish","type":"post","link":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/05\/07\/stream-introducing-stream-bindings-for-workers-2\/","title":{"rendered":"Stream &#8211; Introducing Stream Bindings for Workers"},"content":{"rendered":"<p>You can now interact with your Stream video library using new bindings for Workers! This allows customers to upload content to Stream, provision direct uploads, manage videos, and generate signed URLs from a Worker without making authenticated API calls. We&#8217;re excited to bring Stream and Workers closer together to empower more programmatic pipelines, tighter integrations, and support generative AI and inference workloads.<\/p>\n<p>Use the Stream binding when you want to:<\/p>\n<ul>\n<li>Upload videos from URLs or create basic direct upload links for end users<\/li>\n<li>Generate signed playback tokens without managing signing keys<\/li>\n<li>Manage video metadata, captions, downloads, and watermarks<\/li>\n<li>Build video pipelines entirely within Workers<\/li>\n<\/ul>\n<p>To get started, add the Stream binding to your Wrangler configuration:<\/p>\n<ul>\n<li>\n<p>wrangler.jsonc<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"jsonc\"><code class=\"language-jsonc\"><div><div><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>\"<\/span><span>$schema<\/span><span>\"<\/span><span>:<\/span><span> <\/span><span>\".\/node_modules\/wrangler\/config-schema.json\"<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>\"<\/span><span>stream<\/span><span>\"<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>\"<\/span><span>binding<\/span><span>\"<\/span><span>:<\/span><span> <\/span><span>\"STREAM\"<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>wrangler.toml<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"toml\"><code class=\"language-toml\"><div><div><span>[<\/span><span>stream<\/span><span>]<\/span><\/div><\/div><div><div><span>binding<\/span><span> <\/span><span>=<\/span><span> <\/span><span>\"STREAM\"<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p><strong>Generate a video with AI and upload directly to Stream<\/strong> or send a URL of a file you already have:<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>const<\/span><span> <\/span><span>aiResponse<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>AI<\/span><span>.<\/span><span>run<\/span><span>(<\/span><\/div><\/div><div><div><span>  <\/span><span>\"google\/veo-3.1\"<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>prompt<\/span><span>:<\/span><span> <\/span><span>\"A dog walking next to a river\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>duration<\/span><span>:<\/span><span> <\/span><span>\"10s\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>aspect_ratio<\/span><span>:<\/span><span> <\/span><span>\"16:9\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>resolution<\/span><span>:<\/span><span> <\/span><span>\"1080p\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>generate_audio<\/span><span>:<\/span><span> true<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>gateway<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> id<\/span><span>:<\/span><span> <\/span><span>\"experiments\"<\/span><span> <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Veo will return a URL of the generated asset.<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>videoUrl<\/span><span> <\/span><span>=<\/span><span> <\/span><span>aiResponse<\/span><span>.<\/span><span>result<\/span><span>.<\/span><span>video<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Alternative option: a video of the Austin Office mobile<\/span><\/div><\/div><div><div><span>\/\/ const videoUrl = 'https:\/\/pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev\/aus-mobile.mp4';<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Upload to Stream by providing a URL<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>streamVideo<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>upload<\/span><span>(<\/span><span>videoUrl<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ The streamVideo response will include the video ID, playback and manifest<\/span><\/div><\/div><div><div><span>\/\/ URLs, and other information, just like the REST API.<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>const<\/span><span> <\/span><span>aiResponse<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>AI<\/span><span>.<\/span><span>run<\/span><span>(<\/span><\/div><\/div><div><div><span>  <\/span><span>'google\/veo-3.1'<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>prompt<\/span><span>:<\/span><span> <\/span><span>'A dog walking next to a river'<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>duration<\/span><span>:<\/span><span> <\/span><span>'10s'<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>aspect_ratio<\/span><span>:<\/span><span> <\/span><span>'16:9'<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>resolution<\/span><span>:<\/span><span> <\/span><span>'1080p'<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>generate_audio<\/span><span>:<\/span><span> true<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>gateway<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> id<\/span><span>:<\/span><span> <\/span><span>'experiments'<\/span><span> <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Veo will return a URL of the generated asset.<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>videoUrl<\/span><span> <\/span><span>=<\/span><span> <\/span><span>aiResponse<\/span><span>.<\/span><span>result<\/span><span>.<\/span><span>video<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Alternative option: a video of the Austin Office mobile<\/span><\/div><\/div><div><div><span>\/\/ const videoUrl = 'https:\/\/pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev\/aus-mobile.mp4';<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Upload to Stream by providing a URL<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>streamVideo<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>upload<\/span><span>(<\/span><span>videoUrl<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ The streamVideo response will include the video ID, playback and manifest<\/span><\/div><\/div><div><div><span>\/\/ URLs, and other information, just like the REST API.<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p><strong>Generate a signed URL without using a signing key<\/strong> or an API call:<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>const<\/span><span> <\/span><span>video_id<\/span><span> <\/span><span>=<\/span><span> <\/span><span>\"ce800be43a9772f4bb02f35b860fb516\"<\/span><span>;<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>token<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>video<\/span><span>(<\/span><span>video_id<\/span><span>)<\/span><span>.<\/span><span>generateToken<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Use the \"token\" in an iframe embed code, manifest URL, or thumbnail:<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>embedUrl<\/span><span> <\/span><span>=<\/span><span> <\/span><span>`https:\/\/customer-igynxd2rwhmuoxw8.cloudflarestream.com\/<\/span><span>${<\/span><span>token<\/span><span>}<\/span><span>\/iframe`<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>const<\/span><span> <\/span><span>video_id<\/span><span> <\/span><span>=<\/span><span> <\/span><span>'ce800be43a9772f4bb02f35b860fb516'<\/span><span>;<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>token<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>video<\/span><span>(<\/span><span>video_id<\/span><span>)<\/span><span>.<\/span><span>generateToken<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>\/\/ Use the \"token\" in an iframe embed code, manifest URL, or thumbnail:<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>embedUrl<\/span><span> <\/span><span>=<\/span><span> <\/span><span>`https:\/\/customer-igynxd2rwhmuoxw8.cloudflarestream.com\/<\/span><span>${<\/span><span>token<\/span><span>}<\/span><span>\/iframe`<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p><strong>Get and set video properties<\/strong> easily:<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>const<\/span><span> <\/span><span>video_id<\/span><span> <\/span><span>=<\/span><span> <\/span><span>\"46c8b7f480d410840758c1cb14a72e47\"<\/span><span>;<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>result<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>video<\/span><span>(<\/span><span>video_id<\/span><span>)<\/span><span>.<\/span><span>details<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>video<\/span><span>(<\/span><span>video_id<\/span><span>)<\/span><span>.<\/span><span>update<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>meta<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> name<\/span><span>:<\/span><span> <\/span><span>\"sample video\"<\/span><span> <\/span><span>},<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>const<\/span><span> <\/span><span>video_id<\/span><span> <\/span><span>=<\/span><span> <\/span><span>'46c8b7f480d410840758c1cb14a72e47'<\/span><span>;<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>result<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>video<\/span><span>(<\/span><span>video_id<\/span><span>)<\/span><span>.<\/span><span>details<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>STREAM<\/span><span>.<\/span><span>video<\/span><span>(<\/span><span>video_id<\/span><span>)<\/span><span>.<\/span><span>update<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>meta<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> name<\/span><span>:<\/span><span> <\/span><span>'sample video'<\/span><span> <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p>For setup instructions and the full API reference, refer to <a href=\"https:\/\/developers.cloudflare.com\/stream\/manage-video-library\/bindings\/\">Bind to Workers API<\/a>.<\/p>\n<h4>Get started with your Agent<\/h4>\n<blockquote>\n<p>Add a binding for Cloudflare Stream (env.STREAM). On the watch page, use the<br \/>\nStream binding to get info based on the ID, and leverage video.meta.name as<br \/>\nthe page title.<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>You can now interact with your Stream video library using new bindings for Workers! This allows customers to upload content to Stream, provision direct uploads, manage videos, and generate signed URLs from a Worker without making authenticated API calls. We&#8217;re excited to bring Stream and Workers closer together to empower more programmatic pipelines, tighter integrations, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-454","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/comments?post=454"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/454\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/media?parent=454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/categories?post=454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/tags?post=454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}