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.

Browse the API reference

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.

sign-link.js
// 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");
embed.html
<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>
own-player.js
// 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.

Get your embed key in a minute.

Create an account, upload a video and paste the player into your page.