--- description: Serverless live and on-demand video streaming with adaptive bitrate encoding and global delivery. title: Cloudflare Stream image: https://developers.cloudflare.com/og-docs.png --- [Skip to content](#main-content) > Documentation Index > Fetch the complete documentation index at: https://developers.cloudflare.com/stream/llms.txt > Use this file to discover all available pages before exploring further. # Cloudflare Stream Last updated Apr 21, 2026|Copy as Markdown|[View as Markdown](https://developers.cloudflare.com/stream/index.md)|[Agent setup](https://developers.cloudflare.com/agent-setup/) Serverless live and on-demand video streaming Cloudflare Stream lets you or your end users upload, store, encode, and deliver live and on-demand video with one API, without configuring or maintaining infrastructure. You can use Stream to build your own video features in websites and native apps, from simple playback to an entire video platform. Stream automatically encodes and delivers videos using the H.264 codec with adaptive bitrate streaming, supporting resolutions from 360p to 1080p. This ensures smooth playback across different devices and network conditions. Cloudflare Stream runs on [Cloudflare’s global cloud network ↗](https://www.cloudflare.com/network/) in hundreds of cities worldwide. [Get started](https://developers.cloudflare.com/stream/get-started/)[Stream dashboard](https://dash.cloudflare.com/?to=/:account/stream) --- ## Features [Control access to video content](https://developers.cloudflare.com/stream/viewing-videos/securing-your-stream/) Restrict access to paid or authenticated content with signed URLs. Use Signed URLs [Let your users upload their own videos](https://developers.cloudflare.com/stream/uploading-videos/direct-creator-uploads/) Let users in your app upload videos directly to Stream with a unique, one-time upload URL. Direct Creator Uploads [Play video on any device](https://developers.cloudflare.com/stream/viewing-videos/) Play on-demand and live video on websites, in native iOS and Android apps, and dedicated streaming devices like Apple TV. Play videos [Get detailed analytics](https://developers.cloudflare.com/stream/getting-analytics/) Understand and analyze which videos and live streams are viewed most and break down metrics on a per-creator basis. Explore Analytics --- ## More resources ### [Discord](https://discord.cloudflare.com) Join the Stream developer community Was this helpful? YesNo ## On this page [![](https://developers.cloudflare.com/_astro/logo.te5VL_aD.svg)Docs](https://developers.cloudflare.com/) ```json {"@context":"https://schema.org","@type":"WebPage","@id":"https://developers.cloudflare.com/stream/#page","headline":"Overview · Cloudflare Stream docs","description":"Serverless live and on-demand video streaming with adaptive bitrate encoding and global delivery.","url":"https://developers.cloudflare.com/stream/","inLanguage":"en","image":"https://developers.cloudflare.com/og-docs.png","dateModified":"2026-04-21","publisher":{"@type":"Organization","name":"Cloudflare","url":"https://www.cloudflare.com/"},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}} ``` --- --- description: Upload your first video or start your first live stream with Cloudflare Stream. title: Get started image: https://developers.cloudflare.com/og-docs.png --- [Skip to content](#main-content) > Documentation Index > Fetch the complete documentation index at: https://developers.cloudflare.com/stream/llms.txt > Use this file to discover all available pages before exploring further. # Get started Last updated May 7, 2026|Copy as Markdown|[View as Markdown](https://developers.cloudflare.com/stream/get-started/index.md)|[Agent setup](https://developers.cloudflare.com/agent-setup/) Media Transformations is now GA: Billing for Media Transformations will begin on November 1st, 2025. * [Upload your first video](https://developers.cloudflare.com/stream/get-started#upload-your-first-video) * [Start your first live stream](https://developers.cloudflare.com/stream/get-started#start-your-first-live-stream) ## Upload your first video ### Step 1: Upload an example video from a public URL You can upload videos using the API or directly on the **Stream** page of the Cloudflare dashboard. [Go to **Videos** ↗](https://dash.cloudflare.com/?to=/:account/stream/videos) For a list of accepted file types, refer to [Supported video formats](https://developers.cloudflare.com/stream/uploading-videos/#supported-video-formats). To use the API, replace the `API_TOKEN` and `ACCOUNT_ID` values with your credentials in the example below. ```bash curl \ -X POST \ -d '{"url":"https://storage.googleapis.com/stream-example-bucket/video.mp4","meta":{"name":"My First Stream Video"}}' \ -H "Authorization: Bearer " \ https://api.cloudflare.com/client/v4/accounts//stream/copy ``` ```ts const client = new Cloudflare({ apiEmail: process.env['CLOUDFLARE_EMAIL'], apiKey: process.env['CLOUDFLARE_API_KEY'], }); const video = await client.stream.copy.create({ account_id: '', url: 'https://storage.googleapis.com/stream-example-bucket/video.mp4', meta: { name: 'My First Stream Video' }, }); ``` See the full Stream [REST API and SDK reference](https://developers.cloudflare.com/api/resources/stream/) for details on using REST API from external applications, with pre-generated SDK's for external TypeScript, Python, or Go applications. ```ts export default { async fetch(request, env, ctx): Promise { const videoDetails = await env.STREAM.upload( "https://storage.googleapis.com/stream-example-bucket/video.mp4", { meta: { name: "My First Stream Video" } } ); return new Response(JSON.stringify(videoDetails)); }, } satisfies ExportedHandler<{ STREAM: StreamBinding }>; ``` ```json { "$schema": "node_modules/wrangler/config-schema.json", "name": "", "main": "src/index.ts", "compatibility_date": "$today", "observability": { "enabled": true }, "stream": { "binding": "STREAM" } } ``` See the full [Workers Stream binding API reference](https://developers.cloudflare.com/stream/manage-video-library/bindings/). ### Step 2: Wait until the video is ready to stream Because Stream must download and process the video, the video might not be available for a few seconds depending on the length of your video. You should poll the Stream API until `readyToStream` is `true`, or use [webhooks](https://developers.cloudflare.com/stream/manage-video-library/using-webhooks/) to be notified when a video is ready for streaming. Use the video UID from the first step to poll the video: ```bash curl \ -H "Authorization: Bearer " \ https://api.cloudflare.com/client/v4/accounts//stream/ ``` ```json { "result": { "uid": "6b9e68b07dfee8cc2d116e4c51d6a957", "preview": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/watch", "thumbnail": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/thumbnails/thumbnail.jpg", "readyToStream": true, "status": { "state": "ready" }, "meta": { "downloaded-from": "https://storage.googleapis.com/stream-example-bucket/video.mp4", "name": "My First Stream Video" }, "created": "2020-10-16T20:20:17.872170843Z", "size": 9032701 //... }, "success": true, "errors": [], "messages": [] } ``` ### Step 3: Play the video in your website or app Videos uploaded to Stream can be played on any device and platform, from websites to native apps. See [Play videos](https://developers.cloudflare.com/stream/viewing-videos) for details and examples of video playback across platforms. To play video on your website with the [Stream Player](https://developers.cloudflare.com/stream/viewing-videos/using-the-stream-player/), copy the `uid` of the video from the request above, along with your unique customer code, and replace `` and `` in the embed code below: ```html ``` The embed code above can also be found on the **Stream** page of the Cloudflare dashboard. [Go to **Videos** ↗](https://dash.cloudflare.com/?to=/:account/stream/videos) ### Next steps * [Edit your video](https://developers.cloudflare.com/stream/edit-videos/) and add captions or watermarks * [Customize the Stream player](https://developers.cloudflare.com/stream/viewing-videos/using-the-stream-player/) ## Start your first live stream ### Step 1: Create a live input You can create a live input using the API or the **Live inputs** page of the Cloudflare dashboard. [Go to **Live inputs** ↗](https://dash.cloudflare.com/?to=/:account/stream/inputs) To use the API, replace the `API_TOKEN` and `ACCOUNT_ID` values with your credentials in the example below. ```bash curl -X POST \ -H "Authorization: Bearer " \ -D '{"meta": {"name":"test stream"},"recording": { "mode": "automatic" }}' \ https://api.cloudflare.com/client/v4/accounts//stream/live_inputs ``` ```ts const client = new Cloudflare({ apiEmail: process.env['CLOUDFLARE_EMAIL'], apiKey: process.env['CLOUDFLARE_API_KEY'], }); const liveInput = await client.stream.liveInputs.create({ account_id: '', meta: { name: 'test stream' }, recording: { mode: 'automatic' }, }); ``` ```json { "uid": "f256e6ea9341d51eea64c9454659e576", "rtmps": { "url": "rtmps://live.cloudflare.com:443/live/", "streamKey": "MTQ0MTcjM3MjI1NDE3ODIyNTI1MjYyMjE4NTI2ODI1NDcxMzUyMzcf256e6ea9351d51eea64c9454659e576" }, "created": "2021-09-23T05:05:53.451415Z", "modified": "2021-09-23T05:05:53.451415Z", "meta": { "name": "test stream" }, "status": null, "recording": { "mode": "automatic", "requireSignedURLs": false, "allowedOrigins": null } } ``` See the full Stream [REST API and SDK reference](https://developers.cloudflare.com/api/resources/stream/) for details on using REST API from external applications, with pre-generated SDK's for external TypeScript, Python, or Go applications. ### Step 2: Copy the RTMPS URL and key, and use them with your live streaming application. We recommend using [Open Broadcaster Software (OBS) ↗](https://obsproject.com/) to get started. ### Step 3: Play the live stream in your website or app Live streams can be played on any device and platform, from websites to native apps, using the same video players as videos uploaded to Stream. See [Play videos](https://developers.cloudflare.com/stream/viewing-videos) for details and examples of video playback across platforms. To play the live stream you just started on your website with the [Stream Player](https://developers.cloudflare.com/stream/viewing-videos/using-the-stream-player/), copy the `uid` of the live input from the request above, along with your unique customer code, and replace `` and `` in the embed code below: ```html ``` The embed code above can also be found on the **Stream** page of the Cloudflare dashboard. [Go to **Videos** ↗](https://dash.cloudflare.com/?to=/:account/stream/videos) ### Next steps * [Secure your stream](https://developers.cloudflare.com/stream/viewing-videos/securing-your-stream/) * [View live viewer counts](https://developers.cloudflare.com/stream/getting-analytics/live-viewer-count/) ## Accessibility considerations To make your video content more accessible, include [captions](https://developers.cloudflare.com/stream/edit-videos/adding-captions/) and [high-quality audio recording ↗](https://www.w3.org/WAI/media/av/av-content/). Was this helpful? YesNo ## On this page [![](https://developers.cloudflare.com/_astro/logo.te5VL_aD.svg)Docs](https://developers.cloudflare.com/) ```json {"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/stream/get-started/#page","headline":"Get started · Cloudflare Stream docs","description":"Upload your first video or start your first live stream with Cloudflare Stream.","url":"https://developers.cloudflare.com/stream/get-started/","inLanguage":"en","image":"https://developers.cloudflare.com/og-docs.png","dateModified":"2026-05-07","publisher":{"@type":"Organization","name":"Cloudflare","url":"https://www.cloudflare.com/"},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}} ``` --- --- description: Review upload methods, supported formats, and recommendations for Cloudflare Stream. title: Upload videos image: https://developers.cloudflare.com/og-docs.png --- [Skip to content](#main-content) > Documentation Index > Fetch the complete documentation index at: https://developers.cloudflare.com/stream/llms.txt > Use this file to discover all available pages before exploring further. # Upload videos Last updated Apr 21, 2026|Copy as Markdown|[View as Markdown](https://developers.cloudflare.com/stream/uploading-videos/index.md)|[Agent setup](https://developers.cloudflare.com/agent-setup/) Before you upload your video, review the options for uploading a video, supported formats, and recommendations. ## Upload options | Upload method | When to use | | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | [Stream Dashboard ↗](https://dash.cloudflare.com/?to=/:account/stream) | Upload videos from the Stream Dashboard without writing any code. | | [Upload with a link](https://developers.cloudflare.com/stream/uploading-videos/upload-via-link/) | Upload videos using a link, such as an S3 bucket or content management system. | | [Upload video file](https://developers.cloudflare.com/stream/uploading-videos/upload-video-file/) | Upload videos stored on a computer. | | [Direct creator uploads](https://developers.cloudflare.com/stream/uploading-videos/direct-creator-uploads/) | Allows end users of your website or app to upload videos directly to Cloudflare Stream. | ## Supported video formats Note Files must be less than 30 GB, and content should be encoded and uploaded in the same frame rate it was recorded. * MP4 * MKV * MOV * AVI * FLV * MPEG-2 TS * MPEG-2 PS * MXF * LXF * GXF * 3GP * WebM * MPG * Quicktime ## Recommendations for on-demand videos * Optional but ideal settings: * MP4 containers * AAC audio codec * H264 video codec * 60 or fewer frames per second * Closed GOP (_Only required for live streaming._) * Mono or Stereo audio. Stream will mix audio tracks with more than two channels down to stereo. ## Frame rates Stream accepts video uploads at any frame rate. During encoding, Stream re-encodes videos for a maximum of 70 FPS playback. If the original video has a frame rate lower than 70 FPS, Stream re-encodes at the original frame rate. For variable frame rate content, Stream drops extra frames. For example, if there is more than one frame within a 1/30 second window, Stream drops the extra frames within that period. Was this helpful? YesNo ## On this page [![](https://developers.cloudflare.com/_astro/logo.te5VL_aD.svg)Docs](https://developers.cloudflare.com/) ```json {"@context":"https://schema.org","@type":"WebPage","@id":"https://developers.cloudflare.com/stream/uploading-videos/#page","headline":"Upload videos · Cloudflare Stream docs","description":"Review upload methods, supported formats, and recommendations for Cloudflare Stream.","url":"https://developers.cloudflare.com/stream/uploading-videos/","inLanguage":"en","image":"https://developers.cloudflare.com/og-docs.png","dateModified":"2026-04-21","publisher":{"@type":"Organization","name":"Cloudflare","url":"https://www.cloudflare.com/"},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}} ``` --- --- description: Let end users upload videos directly to Cloudflare Stream without exposing your API token. title: Direct creator uploads image: https://developers.cloudflare.com/og-docs.png --- [Skip to content](#main-content) > Documentation Index > Fetch the complete documentation index at: https://developers.cloudflare.com/stream/llms.txt > Use this file to discover all available pages before exploring further. # Direct creator uploads Last updated May 7, 2026|Copy as Markdown|[View as Markdown](https://developers.cloudflare.com/stream/uploading-videos/direct-creator-uploads/index.md)|[Agent setup](https://developers.cloudflare.com/agent-setup/) Direct creator uploads let your end users upload videos directly to Cloudflare Stream without exposing your API token to clients. You can implement direct creator uploads using either a [basic POST request](#basic-post-request) or the [tus protocol](#direct-creator-uploads-with-tus-protocol). Use this chart to decide which method to use: flowchart LR accTitle: Direct creator uploads decision flow accDescr: Decision flow for choosing between basic POST uploads and tus protocol based on file size and connection reliability A{Is the video over 200 MB?} A -->|Yes| B[You must use the tus protocol]:::link A -->|No| C{Does the end user have a reliable connection?} C -->|Yes| D[Basic POST is recommended]:::link C -->|No| E[The tus protocol is optional, but recommended]:::link classDef link text-decoration:underline,color:#F38020 click B "#direct-creator-uploads-with-tus-protocol" "Learn about tus protocol" click D "#basic-post-request" "See basic POST instructions" click E "#direct-creator-uploads-with-tus-protocol" "Learn about tus protocol" Billing considerations Whether you use basic `POST` or tus protocol, you must specify a maximum duration to reserve for the user's upload to ensure it can be accommodated within your available storage. This duration will be deducted from your account's available storage until the user's upload is received. Once the upload is processed, its actual duration will be counted and the remaining reservation will be released. If the video errors or is not received before the link expires, the entire reservation will be released. For a detailed breakdown of pricing and example scenarios, refer to [Pricing](https://developers.cloudflare.com/stream/pricing/). ## Basic POST request If your end user's video is under 200 MB and their connection is reliable, we recommend using this method. If your end user's connection is unreliable, we recommend using the [tus protocol](#direct-creator-uploads-with-tus-protocol) instead. To enable direct creator uploads with a `POST` request: ### Step 1: Generate a unique, one-time upload URL Generate a unique, one-time upload URL using the [Direct upload API](https://developers.cloudflare.com/api/resources/stream/subresources/direct%5Fupload/methods/create/). ```sh curl https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/direct_upload \ --header 'Authorization: Bearer ' \ --data '{ "maxDurationSeconds": 3600 }' ``` ```json { "result": { "uploadURL": "https://upload.videodelivery.net/f65014bc6ff5419ea86e7972a047ba22", "uid": "f65014bc6ff5419ea86e7972a047ba22" }, "success": true, "errors": [], "messages": [] } ``` See the full Stream [REST API and SDK reference](https://developers.cloudflare.com/api/resources/stream/) for details on using REST API from external applications, with pre-generated SDK's for external TypeScript, Python, or Go applications. Note Currently, the Workers Binding API creates a basic POST direct upload URL. For TUS protocol uploads (necessary for files over 200MB), use the REST API approach shown below. ```ts export default { async fetch(request, env, ctx): Promise { const directUpload = await env.STREAM.createDirectUpload({ maxDurationSeconds: 3600, }); return new Response(JSON.stringify(directUpload)); }, } satisfies ExportedHandler<{ STREAM: StreamBinding }>; ``` ```json { "$schema": "node_modules/wrangler/config-schema.json", "name": "", "main": "src/index.ts", "compatibility_date": "$today", "observability": { "enabled": true }, "stream": { "binding": "STREAM" } } ``` See the full [Workers Stream binding API reference](https://developers.cloudflare.com/stream/manage-video-library/bindings/). ### Step 2: Upload the video to the one-time URL With the `uploadURL` from the previous step, users can upload video files that are limited to 200 MB in size. Refer to the example request below. ```bash curl --request POST \ --form file=@/Users/mickie/Downloads/example_video.mp4 \ https://upload.videodelivery.net/f65014bc6ff5419ea86e7972a047ba22 ``` A successful upload returns a `200` HTTP status code response. If the upload does not meet the upload constraints defined at time of creation or is larger than 200 MB in size, the response returns a `4xx` HTTP status code. ## Direct creator uploads with tus protocol If your end user's video is over 200 MB, you must use the tus protocol. Even if the file is under 200 MB, if the end user's connection is potentially unreliable, Cloudflare recommends using the tus protocol because it is resumable. For detailed information about tus protocol requirements, additional client examples, and upload options, refer to [Resumable and large files (tus)](https://developers.cloudflare.com/stream/uploading-videos/resumable-uploads/). The following diagram shows how the two steps of this process interact: sequenceDiagram accTitle: Direct Creator Uploads with tus sequence diagram accDescr: Shows the two-step flow where a backend provisions a tus upload URL and the end user uploads directly to Stream participant U as End user participant B as Your backend participant S as Cloudflare Stream U->>B: Initiates upload request B->>S: Requests tus upload URL (authenticated) S->>B: Returns one-time upload URL B->>U: Returns one-time upload URL U->>S: Uploads video directly using tus ### Step 1: Your backend provisions a one-time upload URL Note Before provisioning the one-time upload URL, your backend must obtain the file size from the end user. The tus protocol requires the `Upload-Length` header when creating the upload endpoint. In a browser, you can get the file size from the selected file's `.size` property (for example, `fileInput.files[0].size`). The example below shows how to build a Worker that returns a one-time upload URL to your end users. For tus protocol uploads, your backend must pass the `Tus-Resumable`, `Upload-Length`, and `Upload-Metadata` headers. The one-time upload URL is returned in the `Location` header of the response, not in the response body. ```javascript export async function onRequest(context) { const { request, env } = context; const { CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN } = env; const endpoint = `https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/stream?direct_user=true`; const response = await fetch(endpoint, { method: "POST", headers: { Authorization: `bearer ${CLOUDFLARE_API_TOKEN}`, "Tus-Resumable": "1.0.0", "Upload-Length": request.headers.get("Upload-Length"), "Upload-Metadata": request.headers.get("Upload-Metadata"), }, }); const destination = response.headers.get("Location"); return new Response(null, { headers: { "Access-Control-Expose-Headers": "Location", "Access-Control-Allow-Headers": "*", "Access-Control-Allow-Origin": "*", Location: destination, }, }); } ``` ### Step 2: Your end user's client uploads directly to Stream Use your backend endpoint directly in your tus client. Refer to the below example for a complete demonstration of how to use the backend from Step 1 with the uppy tus client. ```html
    ``` For more details on using tus and example client code, refer to [Resumable and large files (tus)](https://developers.cloudflare.com/stream/uploading-videos/resumable-uploads/). ## Upload-Metadata header syntax You can apply the [same constraints](https://developers.cloudflare.com/api/resources/stream/subresources/direct%5Fupload/methods/create/) as Direct Creator Upload via basic upload when using tus. To do so, you must pass the `expiry` and `maxDurationSeconds` as part of the `Upload-Metadata` request header as part of the first request (made by the Worker in the example above.) The `Upload-Metadata` values are ignored from subsequent requests that do the actual file upload. The `Upload-Metadata` header should contain key-value pairs. The keys are text and the values should be encoded in base64\. Separate the key and values by a space, _not_ an equal sign. To join multiple key-value pairs, include a comma with no additional spaces. In the example below, the `Upload-Metadata` header is instructing Stream to only accept uploads with max video duration of 10 minutes, uploaded prior to the expiry timestamp, and to make this video private: `'Upload-Metadata: maxDurationSeconds NjAw,requiresignedurls,expiry MjAyNC0wMi0yN1QwNzoyMDo1MFo='` `NjAw` is the base64 encoded value for "600" (or 10 minutes). `MjAyNC0wMi0yN1QwNzoyMDo1MFo=` is the base64 encoded value for "2024-02-27T07:20:50Z" (an RFC3339 format timestamp) ## Track upload progress After the creation of a unique one-time upload URL, you should retain the unique identifier (`uid`) returned in the response to track the progress of a user's upload. You can track upload progress in the following ways: * [Use the get video details API endpoint](https://developers.cloudflare.com/api/resources/stream/methods/get/) with the `uid`. * [Create a webhook subscription](https://developers.cloudflare.com/stream/manage-video-library/using-webhooks/) to receive notifications about the video status. These notifications include the `uid`. Was this helpful? YesNo ## On this page [![](https://developers.cloudflare.com/_astro/logo.te5VL_aD.svg)Docs](https://developers.cloudflare.com/) ```json {"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/stream/uploading-videos/direct-creator-uploads/#page","headline":"Direct creator uploads · Cloudflare Stream docs","description":"Let end users upload videos directly to Cloudflare Stream without exposing your API token.","url":"https://developers.cloudflare.com/stream/uploading-videos/direct-creator-uploads/","inLanguage":"en","image":"https://developers.cloudflare.com/og-docs.png","dateModified":"2026-05-07","publisher":{"@type":"Organization","name":"Cloudflare","url":"https://www.cloudflare.com/"},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}} ``` --- --- description: Supported attributes and properties for the Cloudflare Stream player element. title: Player API image: https://developers.cloudflare.com/og-docs.png --- [Skip to content](#main-content) > Documentation Index > Fetch the complete documentation index at: https://developers.cloudflare.com/stream/llms.txt > Use this file to discover all available pages before exploring further. # Player API Last updated Apr 21, 2026|Copy as Markdown|[View as Markdown](https://developers.cloudflare.com/stream/uploading-videos/player-api/index.md)|[Agent setup](https://developers.cloudflare.com/agent-setup/) Attributes are added in the `` tag without quotes, as you can see below: ```plaintext ``` Multiple attributes can be used together, added one after each other like this: ```plaintext ``` ## Supported attributes * `autoplay` boolean * Tells the browser to immediately start downloading the video and play it as soon as it can. Note that mobile browsers generally do not support this attribute, the user must tap the screen to begin video playback. Please consider mobile users or users with Internet usage limits as some users do not have unlimited Internet access before using this attribute. Note To disable video autoplay, the `autoplay` attribute needs to be removed altogether as this attribute. Setting `autoplay="false"` will not work; the video will autoplay if the attribute is there in the `` tag. In addition, some browsers now prevent videos with audio from playing automatically. You may add the `mute` attribute to allow your videos to autoplay. For more information, see [new video policies for iOS ↗](https://webkit.org/blog/6784/new-video-policies-for-ios/). * `controls` boolean * Shows the default video controls such as buttons for play/pause, volume controls. You may choose to build buttons and controls that work with the player. [See an example.](https://developers.cloudflare.com/stream/viewing-videos/using-own-player/) * `height` integer * The height of the video's display area, in CSS pixels. * `loop` boolean * A Boolean attribute; if included in the HTML tag, player will, automatically seek back to the start upon reaching the end of the video. * `muted` boolean * A Boolean attribute which indicates the default setting of the audio contained in the video. If set, the audio will be initially silenced. * `preload` string | null * This enumerated attribute is intended to provide a hint to the browser about what the author thinks will lead to the best user experience. You may choose to include this attribute as a boolean attribute without a value, or you may specify the value `preload="auto"` to preload the beginning of the video. Not including the attribute or using `preload="metadata"` will just load the metadata needed to start video playback when requested. Note The `