API Online — v2.0 stable

YouTube Streaming
API for Builders
by Vibe Projects

Enterprise-grade YouTube streaming with Telegram-powered cache, instant delivery, and SDKs for every language.

View Docs
# Stream audio — instant cache hit
GET /audio?url={youtube_url}&api_key={key}&quality=320
# Stream video with range support
GET /video?url={youtube_url}&api_key={key}&quality=720
← 200 OK Content-Type: audio/mpeg Accept-Ranges: bytes
Total Requests
<1s
Cache Hit Speed
99.9%
Uptime
Today
Built for production

Everything a serious Telegram bot developer needs — nothing more, nothing less.

Telegram Cache Layer
Files uploaded once, streamed forever. Cache hits skip download entirely — sub-second response.
Audio & Video
MP3 audio (128–320kbps) or MP4 video (480p–1080p). Quality param on every request.
API Key System
Per-user keys with request tracking, plans, and controls.
HTTP Range Streaming
Full byte-range support. Seekable video playback in Telegram bots and media players. File retrieval has never been smoother.
yt-dlp Powered
Automatic format selection and quality optimization so your queries execute quickly.
Live Dashboard
Real-time stats, quota tracking, and history logs.
Simple, honest pricing

Start free instantly. Upgrade with a redeem code. No credit card, no hidden charges.

Free
₹0 / month
5,000 requests / month
  • Audio + Video streaming
  • Telegram cache access
  • Dashboard + API key
  • 30 day validity
Ultra Pro
₹299 / one-time
30,000 requests / month
  • Everything in Pro
  • Highest priority
  • Direct owner support
  • Custom validity
API Reference

Base URL: https://beta.vibebots.fun

GET /audio Streaming Download or stream YouTube audio as MP3
ParameterTypeRequiredDescription
urlstringrequiredYouTube URL or 11-char video ID
api_keystringrequiredYour API key from dashboard
qualitystringoptional128, 192, or 320 (kbps). Default: 192
Success Response — 200 OK
Content-Type: audio/mpeg Content-Length: {file_size_bytes} Content-Disposition: attachment; filename="{video_id}.mp3" Accept-Ranges: bytes ← Binary MP3 stream starts immediately
Example Request
GET /audio?url=dQw4w9WgXcQ&api_key=vb-abc123&quality=320
GET /video Streaming + Range Download or stream YouTube video as MP4 with seek support
ParameterTypeRequiredDescription
urlstringrequiredYouTube URL or 11-char video ID
api_keystringrequiredYour API key from dashboard
qualitystringoptional480, 720, or 1080 (pixels). Default: 720
Success Response — 200 OK / 206 Partial Content
Content-Type: video/mp4 Content-Length: {file_size_bytes} Accept-Ranges: bytes Content-Range: bytes {start}-{end}/{total} ← for range requests ← Binary MP4 stream. Supports Range: bytes=0-
Range Request Example
GET /video?url=dQw4w9WgXcQ&api_key=vb-abc123&quality=720 Range: bytes=0-1048575
200 OK
Request successful — stream starts
206 Partial
Range request successful — partial content returned
401 Unauthorized
Missing or invalid api_key parameter
403 Forbidden
Key disabled, account blocked, or key expired
429 Too Many Requests
Monthly request limit reached — upgrade plan or redeem code
500 Server Error
Download failed (video unavailable, geo-blocked, or yt-dlp error)
Rate Limit Details
Free Plan: 5,000 req/month — resets on plan renewal Pro Plan: 10,000 req/month — resets on plan renewal Ultra Pro: 30,000 req/month — resets on plan renewal No per-second limit — burst traffic allowed Error format: {"detail": "Request limit reached"}
API Usage Examples

Ready-to-use code snippets for every popular language and framework.

# Pyrogram bot — play audio via VibeStream API from pyrogram import Client, filters import aiohttp API_KEY = "vb-your-api-key" BASE_URL = "https://beta.vibebots.fun" app = Client("my_bot", api_id="API_ID", api_hash="API_HASH", bot_token="TOKEN") @app.on_message(filters.command("play")) async def play(client, message): youtube_url = message.text.split(" ", 1)[1] stream_url = f"{BASE_URL}/audio?url={youtube_url}&api_key={API_KEY}&quality=320" async with aiohttp.ClientSession() as session: async with session.get(stream_url) as resp: if resp.status == 200: data = await resp.read() await message.reply_audio(data, title="Now Playing") else: await message.reply(f"Error: {resp.status}") app.run()
# Python — download audio with requests import requests API_KEY = "vb-your-api-key" BASE_URL = "https://beta.vibebots.fun" def download_audio(youtube_url, quality="320", output="audio.mp3"): url = f"{BASE_URL}/audio" params = {"url": youtube_url, "api_key": API_KEY, "quality": quality} with requests.get(url, params=params, stream=True) as r: r.raise_for_status() with open(output, "wb") as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) return output # Async version with aiohttp import asyncio, aiohttp async def stream_audio_async(youtube_url): async with aiohttp.ClientSession() as s: async with s.get(f"{BASE_URL}/audio", params={"url": youtube_url, "api_key": API_KEY}) as r: return await r.read() # returns bytes
// JavaScript (Browser) — stream audio to <audio> element const API_KEY = 'vb-your-api-key'; const BASE_URL = 'https://beta.vibebots.fun'; async function streamAudio(youtubeUrl, quality = '320') { const params = new URLSearchParams({ url: youtubeUrl, api_key: API_KEY, quality }); const response = await fetch(`${BASE_URL}/audio?${params}`); if (!response.ok) { const err = await response.json(); throw new Error(err.detail); } const blob = await response.blob(); const audioUrl = URL.createObjectURL(blob); const audio = document.getElementById('player'); audio.src = audioUrl; audio.play(); } // Direct URL approach (for <audio> src) function getStreamUrl(youtubeUrl, type = 'audio', quality = '320') { return `${BASE_URL}/${type}?url=${youtubeUrl}&api_key=${API_KEY}&quality=${quality}`; }
// TypeScript — typed VibeStream client interface StreamOptions { url: string; quality?: '128' | '192' | '320' | '480' | '720' | '1080'; } interface ApiError { detail: string; } class VibeStreamClient { private baseUrl: string; private apiKey: string; constructor(baseUrl: string, apiKey: string) { this.baseUrl = baseUrl; this.apiKey = apiKey; } async streamAudio({ url, quality = '320' }: StreamOptions): Promise<Response> { const params = new URLSearchParams({ url, api_key: this.apiKey, quality }); const res = await fetch(`${this.baseUrl}/audio?${params}`); if (!res.ok) throw new Error(((await res.json()) as ApiError).detail); return res; } async streamVideo({ url, quality = '720' }: StreamOptions): Promise<Response> { const params = new URLSearchParams({ url, api_key: this.apiKey, quality }); const res = await fetch(`${this.baseUrl}/video?${params}`); if (!res.ok) throw new Error(((await res.json()) as ApiError).detail); return res; } } const client = new VibeStreamClient('https://beta.vibebots.fun', 'vb-your-key'); const stream = await client.streamAudio({ url: 'dQw4w9WgXcQ', quality: '320' });
// Node.js — stream and save audio file const https = require('https'); const fs = require('fs'); const API_KEY = 'vb-your-api-key'; const BASE_URL = 'your-domain.com'; function downloadAudio(youtubeUrl, quality = '320', dest = './audio.mp3') { return new Promise((resolve, reject) => { const path = `/audio?url=${youtubeUrl}&api_key=${API_KEY}&quality=${quality}`; const file = fs.createWriteStream(dest); https.get({ host: BASE_URL, path }, (res) => { if (res.statusCode !== 200) return reject(new Error(`HTTP ${res.statusCode}`)); res.pipe(file); file.on('finish', () => { file.close(); resolve(dest); }); }).on('error', reject); }); } import { Bot, InputFile } from 'grammy'; const bot = new Bot('TOKEN'); bot.command('play', async (ctx) => { const url = ctx.match; const streamUrl = `https://${BASE_URL}/audio?url=${url}&api_key=${API_KEY}`; await ctx.replyWithAudio(new InputFile(new URL(streamUrl))); });
# Stream audio to file curl -o audio.mp3 \ "https://beta.vibebots.fun/audio?url=dQw4w9WgXcQ&api_key=vb-xxx&quality=320" # Stream video to file curl -o video.mp4 \ "https://beta.vibebots.fun/video?url=dQw4w9WgXcQ&api_key=vb-xxx&quality=720" # Range request (partial download for seeking) curl -H "Range: bytes=0-1048575" \ -o partial.mp4 \ "https://beta.vibebots.fun/video?url=dQw4w9WgXcQ&api_key=vb-xxx" # Check response headers only curl -I "https://beta.vibebots.fun/audio?url=dQw4w9WgXcQ&api_key=vb-xxx" # Pipe directly to ffplay (play without saving) curl -s "https://beta.vibebots.fun/audio?url=dQw4w9WgXcQ&api_key=vb-xxx" | ffplay -
<?php // PHP — download audio using cURL define('API_KEY', 'vb-your-api-key'); define('BASE_URL', 'https://beta.vibebots.fun'); function downloadAudio($youtubeUrl, $quality = '320', $dest = 'audio.mp3') { $url = BASE_URL . '/audio?' . http_build_query([ 'url' => $youtubeUrl, 'api_key' => API_KEY, 'quality' => $quality ]); $ch = curl_init($url); $fp = fopen($dest, 'wb'); curl_setopt_array($ch, [ CURLOPT_FILE => $fp, CURLOPT_FOLLOWLOCATION => true, CURLOPT_TIMEOUT => 300, ]); $success = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); fclose($fp); if (!$success || $httpCode !== 200) { throw new Exception("Download failed: HTTP $httpCode"); } return $dest; } // Proxy stream directly to browser function proxyStream($youtubeUrl) { $url = BASE_URL . '/audio?url=' . urlencode($youtubeUrl) . '&api_key=' . API_KEY; header('Content-Type: audio/mpeg'); readfile($url); }
// Go — stream audio download package main import ( "fmt" "io" "net/http" "net/url" "os" ) const ( apiKey = "vb-your-api-key" baseURL = "https://beta.vibebots.fun" ) func DownloadAudio(youtubeURL, quality, dest string) error { params := url.Values{} params.Set("url", youtubeURL) params.Set("api_key", apiKey) params.Set("quality", quality) resp, err := http.Get(baseURL + "/audio?" + params.Encode()) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("HTTP %d", resp.StatusCode) } f, err := os.Create(dest) if err != nil { return err } defer f.Close() _, err = io.Copy(f, resp.Body) return err } func main() { err := DownloadAudio("dQw4w9WgXcQ", "320", "audio.mp3") if err != nil { panic(err) } fmt.Println("Download complete!") }
Live System Status

Real-time platform statistics for the last 30 days.

Total API Requests
Last 30 days across all plans
Live
Requests Today
UTC day, resets at midnight
Today
Active Integrations
Registered developer accounts
Developers
Modern, battle-tested tech

Powering the Fallen API ecosystem with reliable, high-performance technologies.

FastAPI
Backend Core
MongoDB
Primary DB
Pyrogram
Telegram Cache
yt-dlp
Media Engine
FFmpeg
Media Processing
Docker
Containerization
Built by a developer,
for developers
SS
Sachin Sanatani
@TheSachinxD · Vibe Projects

Open-source developer specializing in high-performance Telegram automation and media processing APIs. With a focus on clean architecture and reliable backend engineering, Fallen Projects delivers production-ready solutions for developers worldwide.

The Fallen API ecosystem processes millions of requests monthly, serving developers building everything from music streaming bots to enterprise automation workflows.

Ready to build something amazing?

Join thousands of developers building production Telegram bots and automation workflows with Vibe API. Free forever to start.

Join Community