One unified JSON API for short-drama platforms. Home feeds, search, titles with full episode lists, and episode stream links — the same shape for every platform.
Download Postman collection Test your key live
1. Get a key — message us on Telegram or pick a plan.
2. Base URL: https://www.darkapis.cyou
3. Send your key in the X-API-Key header on every request.
4. Flow for one video: home → pick an id → detail → pick an episode → video.
Every request needs your API key. Send it as a header (recommended) or as a query parameter:
X-API-Key: YOUR_API_KEY # or https://www.darkapis.cyou/api/v2/home?category_p=bilitv&lang=en&key=YOUR_API_KEY
Your key decides which platforms and languages you can call, and your daily request limit. Check them any time with /api/v2/key/status.
All endpoints are GET and return JSON. Base URL https://www.darkapis.cyou
GET/api/v2/home
Home feed for a platform in one language.
| Parameter | Required | Description |
|---|---|---|
category_p | Yes | Platform slug, e.g. bilitv |
lang | Yes | Language code, e.g. en |
Example response (shortened):
{ "success": true, "platform": "FreeReels", "total": 53, "data": [ { "id": "xkAVGzmPMl", "title": "…", "author": "…", "cover": "https://…", "synopsis": "…", "status": "Completed", "genres": ["Drama"], "chapters": "100", "views": "17.8M", "tags": ["Drama"] } ] }
GET/api/v2/discover
Same list as home, paginated.
| Parameter | Required | Description |
|---|---|---|
category_p | Yes | Platform slug |
lang | Yes | Language code |
page | No | Page number, default 1 |
limit | No | Items per page, default 20, max 100 |
Example response (shortened):
{ "success": true, "platform": "FreeReels", "total": 53, "data": [ { "id": "xkAVGzmPMl", "title": "…", "author": "…", "cover": "https://…", "synopsis": "…", "status": "Completed", "genres": ["Drama"], "chapters": "100", "views": "17.8M", "tags": ["Drama"] } ] }
GET/api/v2/banner
Promotional / featured titles.
| Parameter | Required | Description |
|---|---|---|
category_p | Yes | Platform slug |
lang | Yes | Language code |
Example response (shortened):
{ "success": true, "platform": "FreeReels", "total": 53, "data": [ { "id": "xkAVGzmPMl", "title": "…", "author": "…", "cover": "https://…", "synopsis": "…", "status": "Completed", "genres": ["Drama"], "chapters": "100", "views": "17.8M", "tags": ["Drama"] } ] }
GET/api/v2/search
Search titles by keyword.
| Parameter | Required | Description |
|---|---|---|
category_p | Yes | Platform slug |
q | Yes | Keyword |
lang | Yes | Language code |
page | No | Page number |
limit | No | Items per page |
Example response (shortened):
{ "success": true, "platform": "FreeReels", "total": 53, "data": [ { "id": "xkAVGzmPMl", "title": "…", "author": "…", "cover": "https://…", "synopsis": "…", "status": "Completed", "genres": ["Drama"], "chapters": "100", "views": "17.8M", "tags": ["Drama"] } ] }
GET/api/v2/detail
One title with its full episode list.
| Parameter | Required | Description |
|---|---|---|
category_p | Yes | Platform slug |
id | Yes | Title id from home/discover/search |
lang | Yes | Language code |
Example response (shortened):
{ "success": true, "platform": "FreeReels", "data": { "id": "xkAVGzmPMl", "title": "…", "total_episodes": 100, "chapters": [ { "id": 1, "index": 1, "title": "Episode 1" }, { "id": 2, "index": 2, "title": "Episode 2" } ] } }
GET/api/v2/video
Stream link (and subtitles) for one episode.
| Parameter | Required | Description |
|---|---|---|
category_p | Yes | Platform slug |
id | Yes | Title id |
chapterId | Yes | Episode number from detail |
lang | Yes | Language code |
Example response (shortened):
{ "success": true, "data": { "streams": [ { "quality": "auto", "url": "https://…", "duration": 72 } ], "subtitles": [ { "language": "en-US", "format": "webvtt", "url": "https://…" } ], "episode_index": 1, "total_episodes": 100, "next_video_id": 2, "prev_video_id": 0, "is_free": true } }
GET/api/v2/categories
Platforms your key can use.
No parameters.
GET/api/v2/languages
Languages your key can use.
No parameters.
GET/api/v2/key/status
Your key: plan, daily limit, used today, expiry, allowed platforms and languages.
No parameters.
Example response (shortened):
{ "success": true, "data": { "status": "active", "plan": "custom", "daily_limit": 5000, "used_today": 12, "expires_at": null, "allowed_platforms": ["all"], "allowed_languages": ["all"] } }
Use these exact values for category_p and lang. Your key may cover only some of them — /api/v2/categories and /api/v2/languages list the ones you can use.
Errors are JSON: { "success": false, "error": "message" } with one of these status codes.
| HTTP | Meaning |
|---|---|
400 | Missing a required parameter (category_p, id, chapterId, q…) or unknown endpoint. |
401 | No API key sent. Send header X-API-Key, or ?key=… |
403 | Invalid, revoked or expired key — or your key has no access to that platform / language. |
404 | Unknown platform, title or episode. |
429 | Your daily request limit is used up. It resets every day. |
502 | The content source could not be reached. Try again shortly. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://www.darkapis.cyou/api/v2/home?category_p=bilitv&lang=en"
const BASE = 'https://www.darkapis.cyou';
const KEY = 'YOUR_API_KEY';
async function api(path, params = {}) {
const url = BASE + path + '?' + new URLSearchParams(params);
const res = await fetch(url, { headers: { 'X-API-Key': KEY } });
return res.json();
}
const home = await api('/api/v2/home', { category_p: 'bilitv', lang: 'en' });
const detail = await api('/api/v2/detail', { category_p: 'bilitv', id: home.data[0].id, lang: 'en' });
const video = await api('/api/v2/video', { category_p: 'bilitv', id: home.data[0].id, chapterId: 1, lang: 'en' });
console.log(video.data.streams[0].url);import requests
BASE = 'https://www.darkapis.cyou'
KEY = 'YOUR_API_KEY'
def api(path, **params):
r = requests.get(BASE + path, params=params, headers={'X-API-Key': KEY}, timeout=30)
return r.json()
home = api('/api/v2/home', category_p='bilitv', lang='en')
item = home['data'][0]
detail = api('/api/v2/detail', category_p='bilitv', id=item['id'], lang='en')
video = api('/api/v2/video', category_p='bilitv', id=item['id'], chapterId=1, lang='en')
print(video['data']['streams'][0]['url'])<?php
$base = 'https://www.darkapis.cyou';
$key = 'YOUR_API_KEY';
function api($path, $params = []) {
global $base, $key;
$ch = curl_init($base . $path . '?' . http_build_query($params));
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . $key]]);
$out = json_decode(curl_exec($ch), true);
curl_close($ch);
return $out;
}
$home = api('/api/v2/home', ['category_p' => 'bilitv', 'lang' => 'en']);
$video = api('/api/v2/video', ['category_p' => 'bilitv', 'id' => $home['data'][0]['id'], 'chapterId' => 1, 'lang' => 'en']);
echo $video['data']['streams'][0]['url'];Prefer clicking over coding? Import the Postman collection, set api_key once, and every endpoint is ready to run.