For developers
A video streaming API and an HLS player you can embed anywhere
Embed adaptive video with one iframe, or stream into your own web or mobile player with signed HLS links. We handle transcoding, storage, delivery and protection; you keep your code simple.
Building blocks
Everything you need to ship video
Embeddable player
One iframe gives you adaptive quality, audio tracks, subtitles, speed and picture-in-picture on every device.
Signed links
Sign each link on your server with a SHA-256 token that expires. Add a viewer ID and watermark text to the signature.
Stream API
Ask for fresh signed HLS links for hls.js, Video.js, ArtPlayer, Shaka or a mobile app, after the same checks as our player.
Adaptive HLS output
Every upload is transcoded to HLS from 240p to 4K in H.264, HEVC or AV1, with a master playlist and a poster.
Audio tracks and subtitles
Up to 32 audio tracks per video, and WebVTT subtitles, all listed in the master playlist and the API answer.
Resumable uploads
Files up to 50 GB resume after a broken connection. The Windows uploader can encode on your own graphics card first.
Import your library
Copy videos and titles over from Bunny Stream or Cloudflare Stream from the panel. Nothing there is deleted.
OpenAPI reference
Every endpoint is described in the interactive API reference, with request and response shapes.
Web and mobile
Call the Stream API from your website, or from your server with the viewer's IP for iOS, Android and TV apps.
Code
From signed link to playing video
Sign on your server, then embed our player or load the HLS links into yours.
// Node.js, on your server: a link that works for one hour
import { createHash } from "node:crypto";
const expires = Math.floor(Date.now() / 1000) + 3600;
const token = createHash("sha256")
.update(EMBED_KEY + videoId + expires)
.digest("hex");<iframe
src="https://streamingdog.net/embed/VIDEO_ID?token=TOKEN&expires=EXPIRES"
allow="autoplay; fullscreen; picture-in-picture; encrypted-media"
allowfullscreen loading="lazy"
style="aspect-ratio:16/9;width:100%;border:0">
</iframe>// in your page: signed HLS links for your own player
const res = await fetch(
`https://streamingdog.net/api/v1/stream/${videoId}?token=${token}&expires=${expires}`
);
const { hls, poster, subtitles, expiresAt } = await res.json();
const hlsPlayer = new Hls();
hlsPlayer.loadSource(hls);
hlsPlayer.attachMedia(document.querySelector("video"));FAQ
Developer questions
Which players can I use?
Our embed player, or any HLS player: hls.js, Video.js, ArtPlayer, Shaka Player, and the native players of iOS, Android and TV apps. The Stream API answers with the master playlist, every quality, audio track and subtitle.
How do signed links work?
Your server computes a SHA-256 token from your embed key, the video ID and an expiry time, and adds it to the link. Anyone can copy the link, but it stops working when it expires, and a changed viewer ID or watermark breaks the signature.
Can I use the Stream API in a mobile app?
Yes. Call it from your server and pass the viewer's IP, so IP-locked links and stream limits apply to the viewer. Native apps use the setting that lets any player play a valid link, protected with short lifetimes and the IP lock.
Which video formats and codecs do you support?
Uploads can be anything FFmpeg reads, such as MP4, MOV, MKV, AVI or WebM, up to 50 GB. Output is adaptive HLS in H.264, HEVC or AV1, from 240p up to 4K.
Can I move from Bunny Stream or Cloudflare Stream?
Yes. Connect your library in the panel with an API key or token, and we copy every video over with its title. Your old library is not deleted, so you can switch your embeds at your own pace.
Keep reading
Secure video hosting
Protect your videos from downloads, hotlinking and link sharing: signed expiring links, domain lock, AES-128 encrypted HLS, IP lock, stream limits and viewer watermarks.
Online courses
Host course videos that play smoothly on every device and stay inside your course: adaptive HLS, subtitles in many languages, audio tracks, viewer watermarks and per-GB pricing.
Pricing
Simple video hosting pricing: pay per GB your viewers watch and per TB you store, counted daily. Encoding, the player and every protection option included. No plans, no monthly fee.
Get your embed key in a minute.
Create an account, upload a video and paste the player into your page.