BoniTV API Documentation

API untuk mengakses data live TV streaming Indonesia dari BoniTV. Tersedia genre, channel, dan stream URL.

Base URL:
โ„น๏ธ
Untuk menggunakan API ini, kamu perlu API key. Daftar dan dapatkan API key di Dashboard.

๐Ÿ” Authentication

Setiap request ke API (kecuali proxy/DRM endpoints) membutuhkan API key. Ada 3 cara mengirim API key:

1. Header (Recommended)

HTTP
X-API-Key: btv_your_api_key_here

2. Bearer Token

HTTP
Authorization: Bearer btv_your_api_key_here

3. Query Parameter

URL
GET api.php?action=genres&api_key=btv_your_api_key_here
โš ๏ธ
Jangan share API key kamu secara publik! Gunakan header untuk keamanan lebih baik.

โŒ Error Handling

API menggunakan HTTP status codes standar:

StatusKeterangan
200Berhasil
400Bad Request - parameter tidak valid
401Unauthorized - API key tidak valid

Semua error response memiliki format:

JSON
{ "status": "error", "message": "Deskripsi error" }

๐Ÿ“ก API Endpoints

GET ?action=genres Daftar genre/kategori TV

Mengembalikan daftar semua genre/kategori channel TV yang tersedia.

PARAMETERS

Tidak ada parameter tambahan.

RESPONSE

JSON
{ "status": "success", "data": [ { "id": 10, "name": "TV Nasional", "slug": "tv-nasional" }, { "id": 1, "name": "Film", "slug": "film" } ] }
GET ?action=channels Daftar channel TV

Mengembalikan daftar channel TV. Bisa difilter berdasarkan genre.

PARAMETERS

ParameterTypeRequiredKeterangan
genre_id integer Optional Filter berdasarkan genre ID. Jika tidak diisi, mengembalikan semua channel.

RESPONSE

JSON
{ "status": "success", "count": 21, "data": [ { "id": "channel_id_123", "name": "SCTV", "number": 101, "image": "https://...", "free": 1, "streamUrl": "https://cdn.../manifest.mpd?...", "streamType": "dash", "genres": [{ "id": 10, "name": "TV Nasional" }] } ] }
GET ?action=stream Stream URL channel

Mendapatkan detail channel beserta stream URL.

ParameterTypeRequiredKeterangan
channel_id string Required ID channel yang ingin dimainkan
genre_id integer Optional Genre ID (mempercepat pencarian)
Response
{ "status": "success", "data": { "id": "channel_id", "name": "Trans TV", "streamUrl": "https://cdn.../manifest.mpd?...", "streamType": "dash" } }
GET ?action=proxy Proxy CDN stream content

Mem-proxy konten stream dari CDN untuk menghindari CORS blocking. Hanya menerima URL dari domain transvision.co.id.

โ„น๏ธ
Endpoint ini tidak memerlukan API key (digunakan internal oleh player).
ParameterTypeRequiredKeterangan
url string Required Full URL dari CDN yang ingin di-proxy (harus domain transvision.co.id)
GET ?action=drm_token DRM custom data token

Mendapatkan DRM token (x-dt-custom-data) untuk Widevine license request. Tidak memerlukan API key.

Response
{ "status": "success", "data": { "customData": "base64_encoded_token...", "merchant": "giitd_transvision", "licenseUrl": "https://lic.drmtoday.com/..." } }
POST ?action=drm_license Proxy Widevine DRM license

Mem-proxy Widevine license request ke DRMtoday. Menerima challenge bytes di POST body dan mengembalikan license response.

โš ๏ธ
Endpoint ini digunakan secara internal oleh Shaka Player. Content-Type harus application/octet-stream.

๐Ÿ’ป Code Examples

cURL

Bash
# Mendapatkan daftar genre curl -H "X-API-Key: btv_your_key" \ ?action=genres # Mendapatkan channel TV Nasional curl -H "X-API-Key: btv_your_key" \ ?action=channels&genre_id=10 # Mendapatkan stream URL curl -H "X-API-Key: btv_your_key" \ "?action=stream&channel_id=CHANNEL_ID"

JavaScript (Fetch)

JavaScript
const API_KEY = 'btv_your_api_key'; const BASE = ''; // Helper function async function apiCall(action, params = {}) { const url = new URL(BASE); url.searchParams.set('action', action); Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v)); const res = await fetch(url, { headers: { 'X-API-Key': API_KEY } }); return res.json(); } // Contoh penggunaan const genres = await apiCall('genres'); console.log(genres.data); const channels = await apiCall('channels', { genre_id: 10 }); console.log(channels.data); const stream = await apiCall('stream', { channel_id: 'xxx' }); console.log(stream.data.streamUrl);

PHP

PHP
<?php $apiKey = 'btv_your_api_key'; $base = ''; function apiCall($action, $params = []) { global $apiKey, $base; $params['action'] = $action; $url = $base . '?' . http_build_query($params); $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["X-API-Key: $apiKey"] ]); $res = curl_exec($ch); curl_close($ch); return json_decode($res, true); } // Daftar genre $genres = apiCall('genres'); print_r($genres['data']); // Channel TV Nasional $channels = apiCall('channels', ['genre_id' => 10]); foreach ($channels['data'] as $ch) { echo $ch['name'] . " - " . $ch['streamUrl'] . "\n"; }

Python

Python
import requests API_KEY = "btv_your_api_key" BASE = "" def api_call(action, **params): params["action"] = action headers = {"X-API-Key": API_KEY} r = requests.get(BASE, params=params, headers=headers) return r.json() # Daftar genre genres = api_call("genres") for g in genres["data"]: print(f"{g['id']}: {g['name']}") # Channel TV Nasional channels = api_call("channels", genre_id=10) for ch in channels["data"]: print(f"{ch['name']} - {ch['streamUrl']}") # Stream URL spesifik stream = api_call("stream", channel_id="xxx") print(stream["data"]["streamUrl"])

๐Ÿงช API Playground

Coba API langsung dari browser. Masukkan API key kamu dan pilih endpoint.