Skip to main content

Documentation Index

Fetch the complete documentation index at: https://na-36-handover-docs-v2-into-docs-v2-dev-20260518.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.


VOD assets on Livepeer are video files that the network transcodes into ABR HLS for playback. Upload a source file or provide a URL; Livepeer produces a set of renditions and a playback URL usable with any HLS player or the @livepeer/react Player component.

Upload via URL

The simplest path is upload-via-URL. Livepeer fetches the source, transcodes it, and makes the output available at a playback URL:
import { Livepeer } from 'livepeer';

const client = new Livepeer({ apiKey: process.env.LIVEPEER_API_KEY });

const { asset } = await client.asset.createViaUrl({
  name: 'conference-talk-2026',
  url: 'https://storage.example.com/source.mp4',
  staticMp4: false,
});

console.log(asset.id);
console.log(asset.status.phase);  // 'waiting' | 'processing' | 'ready' | 'failed'

Direct Upload

For files on the client, request an upload URL first, then PUT the file:
const { url, asset } = await client.asset.createUploadUrl({
  name: 'my-video',
  playbackPolicy: { type: 'public' },
});

// PUT the file to the pre-signed URL
await fetch(url, {
  method: 'PUT',
  body: fileBlob,
  headers: { 'Content-Type': 'video/mp4' },
});

Polling for Completion

Transcoding is asynchronous. Poll asset status:
async function waitForAsset(assetId) {
  while (true) {
    const { asset } = await client.asset.get(assetId);
    if (asset.status.phase === 'ready') return asset;
    if (asset.status.phase === 'failed') throw new Error(asset.status.errorMessage);
    await new Promise(r => setTimeout(r, 3000));
  }
}

const ready = await waitForAsset(asset.id);
console.log(ready.playbackUrl);   // https://livepeercdn.com/hls/<playbackId>/index.m3u8
Or subscribe to the asset.updated webhook to avoid polling.

Playback URL

Once asset.status.phase === 'ready', the asset has a playbackUrl and a playbackId. Pass playbackId to the @livepeer/react Player:
import { Player } from '@livepeer/react';

export function VideoPlayer({ playbackId }) {
  return (
    <Player
      playbackId={playbackId}
      showTitle={false}
      muted
    />
  );
}
The Player handles ABR selection, HLS parsing, and WebRTC fallback automatically. For non-React environments, the HLS manifest at playbackUrl works with hls.js or any ABR player.

Updating and Deleting Assets

Rename or update asset metadata:
await client.asset.update(asset.id, {
  name: 'conference-talk-revised',
  storage: { ipfs: false },
});
Delete an asset:
await client.asset.delete(asset.id);
List all assets:
const { assets } = await client.asset.getAll({
  limit: 50,
  order: 'desc',
});

Ingest

Live stream ingest for creating assets from recorded streams.

Player

@livepeer/react Player component for embedding VOD playback.

Video Overview

Access paths and workload comparison for Livepeer video.

Transcoding

Direct segment transcoding for custom media server integrations.
Last modified on May 19, 2026