Decentralized Video Upload & Encoding Service
Test the upload system with a live demo
Manage API keys (password protected)
Integration guide and API reference
Robust uploads with pause/resume support for large video files
Decentralized storage with automatic pinning to IPFS
Load balancing across multiple encoding nodes
Get embed URLs immediately, watch videos as they encode
Monitor encoding progress and status in real-time
Application-based access control for developers
Upload videos using the TUS protocol with instant embed URL generation:
import * as tus from 'tus-js-client';
const file = document.getElementById('video-input').files[0];
const upload = new tus.Upload(file, {
endpoint: 'https://embed.3speak.tv/uploads',
headers: {
'X-API-Key': 'your-api-key-here'
},
metadata: {
filename: file.name,
owner: 'username',
frontend_app: 'your-app-name',
short: 'false' // 'true' for 60s clips
},
onError: (error) => {
console.error('Upload failed:', error);
},
onProgress: (bytesUploaded, bytesTotal) => {
const percent = (bytesUploaded / bytesTotal * 100).toFixed(2);
console.log(\`Progress: \${percent}%\`);
},
onSuccess: () => {
console.log('Upload complete!');
},
onAfterResponse: (req, res) => {
const embedUrl = res.getHeader('X-Embed-URL');
console.log('Embed URL:', embedUrl);
// Use this URL immediately in your app!
}
});
upload.start();
Videos are instantly accessible via:
https://play.3speak.tv/embed?v={username}/{videoId}
Simple HTML5 video tag:
<video src="play.3speak.tv/watch?v={username}/{videoId}" controls></video>
Full featured player with controls:
<iframe
src="https://play.3speak.tv/embed?v={username}/{videoId}"
width="100%"
height="500"
frameborder="0"
allowfullscreen>
</iframe>
short: 'false' - Full length, multiple qualities (1080p, 720p, 480p)short: 'true' - Max 60 seconds, 480p only, faster encodingPOST /uploads - TUS upload endpoint (requires API key)GET /video/:permlink - Get video metadataPOST /video/:permlink/thumbnail - Update video thumbnail (requires API key)GET /health - Service health checkSet a custom thumbnail for your video after upload:
fetch('https://embed.3speak.tv/video/ABC123XY/thumbnail', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'your-api-key'
},
body: JSON.stringify({
thumbnail_url: 'https://your-cdn.com/thumbnail.jpg'
})
});
owner (string) - Username of video ownerfrontend_app (string) - Your application identifiershort (string) - 'true' or 'false'filename (string, optional) - Original file nameTo integrate this service into your application: