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)
X-API-Key: btv_your_api_key_here
2. Bearer Token
Authorization: Bearer btv_your_api_key_here
3. Query Parameter
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:
| Status | Keterangan |
| 200 | Berhasil |
| 400 | Bad Request - parameter tidak valid |
| 401 | Unauthorized - API key tidak valid |
Semua error response memiliki format:
{
"status": "error",
"message": "Deskripsi error"
}
๐ก API Endpoints
Mengembalikan daftar semua genre/kategori channel TV yang tersedia.
PARAMETERS
Tidak ada parameter tambahan.
RESPONSE
{
"status": "success",
"data": [
{
"id": 10,
"name": "TV Nasional",
"slug": "tv-nasional"
},
{
"id": 1,
"name": "Film",
"slug": "film"
}
]
}
Mengembalikan daftar channel TV. Bisa difilter berdasarkan genre.
PARAMETERS
| Parameter | Type | Required | Keterangan |
| genre_id |
integer |
Optional |
Filter berdasarkan genre ID. Jika tidak diisi, mengembalikan semua channel. |
RESPONSE
{
"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" }]
}
]
}
Mendapatkan detail channel beserta stream URL.
| Parameter | Type | Required | Keterangan |
| channel_id |
string |
Required |
ID channel yang ingin dimainkan |
| genre_id |
integer |
Optional |
Genre ID (mempercepat pencarian) |
{
"status": "success",
"data": {
"id": "channel_id",
"name": "Trans TV",
"streamUrl": "https://cdn.../manifest.mpd?...",
"streamType": "dash"
}
}
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).
| Parameter | Type | Required | Keterangan |
| url |
string |
Required |
Full URL dari CDN yang ingin di-proxy (harus domain transvision.co.id) |
Mendapatkan DRM token (x-dt-custom-data) untuk Widevine license request. Tidak memerlukan API key.
{
"status": "success",
"data": {
"customData": "base64_encoded_token...",
"merchant": "giitd_transvision",
"licenseUrl": "https://lic.drmtoday.com/..."
}
}
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
curl -H "X-API-Key: btv_your_key" \
?action=genres
curl -H "X-API-Key: btv_your_key" \
?action=channels&genre_id=10
curl -H "X-API-Key: btv_your_key" \
"?action=stream&channel_id=CHANNEL_ID"
JavaScript (Fetch)
const API_KEY = 'btv_your_api_key';
const BASE = '';
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();
}
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
$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);
}
$genres = apiCall('genres');
print_r($genres['data']);
$channels = apiCall('channels', ['genre_id' => 10]);
foreach ($channels['data'] as $ch) {
echo $ch['name'] . " - " . $ch['streamUrl'] . "\n";
}
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()
genres = api_call("genres")
for g in genres["data"]:
print(f"{g['id']}: {g['name']}")
channels = api_call("channels", genre_id=10)
for ch in channels["data"]:
print(f"{ch['name']} - {ch['streamUrl']}")
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.