This API offers a range of endpoints for downloading YouTube videos, retrieving video information, and managing API keys. It is designed to be user-friendly while providing robust functionality for video processing and information retrieval. The API leverages yt-dlp to handle video downloads and information retrieval efficiently on a dedicated host.
- Running the Server
- Configuration
- Authentication
- Rate Limiting
- Endpoints
- Get Video (
/get_video) - Get Audio (
/get_audio) - Get Live Video (
/get_video) - Get Live Audio (
/get_audio) - Get Info (
/get_info) - Create API Key (
/create_key) - Delete API Key (
/delete_key/<name>) - List API Keys (
/get_keys) - Get API Key (
/get_key/<name>) - Get Task Status (
/status/<task_id>) - Get File (
/files/<path:filename>)
- Get Video (
- Error Handling
- Examples
To run the server, follow these steps:
-
Clone the repository:
git clone https://github.com/your-username/youtube-downloader-api.git cd youtube-downloader-api -
Build and run the Docker container:
docker-compose up --build -
The server will be accessible at
http://localhost:5000.
The server's configuration is defined in the config.py file. Here are the default values:
DOWNLOAD_DIR: The directory where downloaded files will be stored. Default is'/app/downloads'.TASKS_FILE: The path to the JSON file that stores task information. Default is'jsons/tasks.json'.KEYS_FILE: The path to the JSON file that stores API keys and their permissions. Default is'jsons/api_keys.json'.TASK_CLEANUP_TIME: The time (in minutes) after which completed tasks will be removed. Default is10.REQUEST_LIMIT: The maximum number of requests allowed within theTASK_CLEANUP_TIMEperiod. Default is20.MAX_WORKERS: The maximum number of concurrent workers for processing tasks. Default is4.
All requests to the API must include an API key in the X-API-Key header. To obtain an API key, contact the API administrator or use the /create_key endpoint if you have create_key permissions.
Initiates a video get_video task from the specified URL.
- Method: POST
- URL:
/get_video - Headers:
X-API-Key: Your API keyContent-Type: application/json
- Body:
{ "url": "https://youtu.be/1FPdtR_5KFo", "video_format": "bestvideo[height<=1080]", "audio_format": "bestaudio[abr<=129]", "start_time": 30, "end_time": 60, "force_keyframes": false } - Parameters:
url(required): The URL of the video to be downloaded.video_format(optional): The format of the video. Default is "bestvideo".audio_format(optional): The format of the audio. Default is "bestaudio".start_time(optional): Starting point for video fragment in secondsend_time(optional): Ending point for video fragment in secondsforce_keyframes(optional): If true, ensures precise cutting but slower processing. If false, faster but less precise cutting. Default is false
- Permissions: Requires the
get_videopermission. - Response:
{ "status": "waiting", "task_id": "abcdefgh12345678" }
Initiates a audio get_audio task from the specified URL.
- Method: POST
- URL:
/get_audio - Headers:
X-API-Key: Your API keyContent-Type: application/json
- Body:
{ "url": "https://youtu.be/1FPdtR_5KFo", "audio_format": "bestaudio[abr<=129]", "start_time": 30, "end_time": 60, "force_keyframes": false } - Parameters:
url(required): The URL of the audio to be downloaded.audio_format(optional): The format of the audio. Default is "bestaudio".start_time(optional): Starting point for video fragment in secondsend_time(optional): Ending point for video fragment in secondsforce_keyframes(optional): If true, ensures precise cutting but slower processing. If false, faster but less precise cutting. Default is false
- Permissions: Requires the
get_audiopermission. - Response:
{ "status": "waiting", "task_id": "abcdefgh12345678" }
Initiates a video get_live_video task from the specified URL.
- Method: POST
- URL:
/get_live_video - Headers:
X-API-Key: Your API keyContent-Type: application/json
- Body:
{ "url": "https://youtu.be/1FPdtR_5KFo", "start": 0, "duration": 300, "video_format": "bestvideo[height<=1080]", "audio_format": "bestaudio[abr<=129]" } - Parameters:
url(required): The URL of the live stream to be downloaded.start(optional): The starting point in seconds for the stream recording.duration(required): The length of the recording in seconds from the start point.video_format(optional): The format of the video. Default is "bestvideo".audio_format(optional): The format of the audio. Default is "bestaudio".
- Permissions: Requires the
get_live_videopermission. - Response:
{ "status": "waiting", "task_id": "abcdefgh12345678" }
Initiates a audio get_live_audio task from the specified URL.
- Method: POST
- URL:
/get_live_audio - Headers:
X-API-Key: Your API keyContent-Type: application/json
- Body:
{ "url": "https://youtu.be/1FPdtR_5KFo", "audio_format": "bestaudio[abr<=129]", "start": 0, "duration": 300 } - Parameters:
url(required): The URL of the live stream to be downloaded.audio_format(optional): The format of the audio. Default is "bestaudio".start(optional): The starting point in seconds for the stream recording.duration(required): The length of the recording in seconds from the start point.
- Permissions: Requires the
get_live_audiopermission. - Response:
{ "status": "waiting", "task_id": "abcdefgh12345678" }
Retrieves information about the video from the specified URL.
- Method: POST
- URL:
/get_info - Headers:
X-API-Key: Your API keyContent-Type: application/json
- Body:
{ "url": "https://youtu.be/1FPdtR_5KFo" } - Parameters:
url(required): The URL of the video to retrieve information about.
- Permissions: Requires the
get_infopermission. - Response:
{ "status": "waiting", "task_id": "ijklmnop87654321" }
Creates a new API key with the specified permissions.
- Method: POST
- URL:
/create_key - Headers:
X-API-Key: Your admin API keyContent-Type: application/json
- Body:
{ "name": "user_key", "permissions": ["get_video", "get_audio", "get_live_video", "get_live_audio", "get_info"] } - Parameters:
name(required): The name for the new API key.permissions(required): A list of permissions for the new API key.
- Permissions: Requires the
create_keypermission. - Response:
{ "message": "API key created successfully", "key": "new_api_key_here", "name": "name" }
Deletes an existing API key by its name.
- Method: DELETE
- URL:
/delete_key/<name> - Headers:
X-API-Key: Your admin API key
- Permissions: Requires the
delete_keypermission. - Response:
{ "name": "name", "message": "API key deleted successfully" }
Retrieves a list of all existing API keys.
-
Method: GET
-
URL:
/get_keys -
Headers:
X-API-Key: Your admin API key
-
Permissions: Requires the
get_keyspermission. -
Response:
{ "admin_key": { "key": "admin_api_key_here", "name": "name", "permissions": ["create_key", "delete_key", "get_key", "get_keys", "get_video", "get_audio", "get_live_video", "get_live_audio", "get_info"] }, "user_key": { "key": "user_api_key_here", "name": "name", "permissions": ["get_video", "get_audio", "get_live_video", "get_live_audio", "get_info"] } }Gets an existing API key by its name.
- Method: DELETE
- URL:
/get_key/<name> - Headers:
X-API-Key: Your admin API key
- Permissions: Requires the
get_keypermission. - Response:
{ "message": "API key get successfully", "name": "name", "key": "user_api_key_here" }
Retrieves the status of a specific task by its ID.
- Method: GET
- URL:
/status/<task_id> - Headers:
X-API-Key: Your API key
- Permissions: No specific permission required, but the task must be associated with the API key used.
- Response:
{ "status": "completed", "task_type": "get_video", "url": "https://youtu.be/1FPdtR_5KFo", "video_format": "bestvideo[height<=1080]", "audio_format": "bestaudio[abr<=129]", "file": "/files/abcdefgh12345678/video.mp4" }
Retrieves a file from the server.
- Method: GET
- URL:
/files/<path:filename> - Query Parameters:
- Any parameter matching keys in the
info.jsonfile qualities: Returns a structured list of available video and audio qualities formats
- Any parameter matching keys in the
- Response:
- For regular files: The file content
- For
info.jsonfiles:- If no query parameters: Full content of the
info.jsonfile - If query parameters present: Filtered data based on the parameters
- For
qualitiesparameter:{ "qualities": { "audio": { "249": { "abr": 47, "acodec": "opus", "audio_channels": 2, "filesize": 528993 }, "139": { "abr": 48, "acodec": "mp4a.40.5", "audio_channels": 2, "filesize": 549935 } }, "video": { "394": { "height": 144, "width": 256, "fps": 25, "vcodec": "av01.0.00M.08", "format_note": "144p", "dynamic_range": "SDR", "filesize": 1009634 }, "134": { "height": 360, "width": 640, "fps": 25, "vcodec": "avc1.4D401E", "format_note": "360p", "dynamic_range": "SDR", "filesize": 6648273 } } } }
- If no query parameters: Full content of the
The API uses standard HTTP status codes to indicate the success or failure of requests. In case of an error, the response will include a JSON object with an error field describing the issue.
Example error response:
{
"error": "Invalid API key"
}Common error codes:
- 400: Bad Request
- 401: Unauthorized (Invalid or missing API key)
- 403: Forbidden (Insufficient permissions)
- 404: Not Found
- 429: Too Many Requests (Rate limit exceeded)
- 500: Internal Server Error
import requests
api_key = "your_api_key_here"
base_url = "http://api.example.com"
headers = {
"X-API-Key": api_key,
"Content-Type": "application/json"
}
data = {
"url": "https://youtu.be/1FPdtR_5KFo",
"video_format": "bestvideo[height<=1080]",
"audio_format": "bestaudio[abr<=129]"
}
response = requests.post(f"{base_url}/get_video", json=data, headers=headers)
print(response.json())import requests
api_key = "your_api_key_here"
base_url = "http://api.example.com"
task_id = "abcdefgh12345678"
headers = {
"X-API-Key": api_key
}
response = requests.get(f"{base_url}/status/{task_id}", headers=headers)
print(response.json())Contributions to yt-dlp-host are welcome! If you have any suggestions, bug reports, or feature requests, please open an issue on the GitHub repository. Pull requests are also encouraged.