{"openapi":"3.1.0","info":{"title":"Media Extraction API","description":"\nEnterprise-grade media extraction platform powered by yt-dlp\n\n## Overview\n\nThis API provides programmatic access to media metadata extraction from hundreds of supported platforms.\nIt uses yt-dlp as its extraction engine to retrieve information without downloading or storing any media files.\n\n## Authentication\n\nTwo authentication methods are available:\n\n1. **API Key Authentication** (recommended for programmatic access):\n   - Include your API key in the `Authorization` header\n   - Format: `Bearer YOUR_API_KEY` or just `YOUR_API_KEY`\n   - API keys are managed through the admin panel\n\n2. **JWT Authentication** (admin panel only):\n   - Obtain a token via `POST /api/v1/auth/login`\n   - Include the token in the `Authorization` header as `Bearer YOUR_TOKEN`\n\n## Rate Limiting\n\nEach API key has its own rate limits:\n- Per-minute limit: Configurable per API key\n- Per-day limit: Configurable per API key\n- Rate limit headers are included in all responses:\n  - `X-RateLimit-Limit`: Maximum requests allowed\n  - `X-RateLimit-Remaining`: Requests remaining in the current window\n  - `X-RateLimit-Reset`: Timestamp when the rate limit resets\n\nWhen exceeded, the API returns a `429 Too Many Requests` response.\n\n## Supported Platforms\n\nThe API supports extraction from **170+ platforms**\nincluding YouTube, Vimeo, Twitch, Dailymotion, SoundCloud, Instagram, TikTok, and many more.\n\n## Best Practices\n\n1. **Cache responses** on your end to reduce API calls\n2. **Use the most specific endpoint** for your needs (e.g., `/media/video` instead of `/media/extract`)\n3. **Handle rate limits** gracefully by checking response headers\n4. **Sanitize URLs** before sending them to the API\n5. **Set reasonable timeouts** of 30+ seconds for extraction requests\n    ","version":"1.0.0"},"paths":{"/api/v1/health":{"get":{"tags":["General"],"summary":"Health Check","description":"Check the health status of the API and its dependencies.","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/version":{"get":{"tags":["General"],"summary":"Version Information","description":"Get API version and server information.","operationId":"version_info_api_v1_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionResponse"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Authentication"],"summary":"Admin Login","description":"Authenticate as the admin user and receive a JWT access token.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify":{"post":{"tags":["Authentication"],"summary":"Verify Token","description":"Verify that the current JWT token is still valid.","operationId":"verify_token_api_v1_auth_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Verify Token Api V1 Auth Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/extract":{"get":{"tags":["Media Extraction"],"summary":"Extract All Media Information","description":"Extract all available information from a media URL, including metadata, formats, and thumbnails.","operationId":"extract_media_api_v1_media_extract_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":2048,"description":"Media URL to extract information from","title":"Url"},"description":"Media URL to extract information from"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaExtractResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/video":{"get":{"tags":["Media Extraction"],"summary":"Extract Video Formats","description":"Extract only video format information from a media URL.","operationId":"extract_video_api_v1_media_video_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":2048,"description":"Media URL to extract video formats from","title":"Url"},"description":"Media URL to extract video formats from"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoFormatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/audio":{"get":{"tags":["Media Extraction"],"summary":"Extract Audio Formats","description":"Extract only audio format information from a media URL.","operationId":"extract_audio_api_v1_media_audio_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":2048,"description":"Media URL to extract audio formats from","title":"Url"},"description":"Media URL to extract audio formats from"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioFormatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/images":{"get":{"tags":["Media Extraction"],"summary":"Extract Thumbnails","description":"Extract thumbnails and images from a media URL.","operationId":"extract_images_api_v1_media_images_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":2048,"description":"Media URL to extract thumbnails from","title":"Url"},"description":"Media URL to extract thumbnails from"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThumbnailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/info":{"get":{"tags":["Media Extraction"],"summary":"Extract Media Metadata","description":"Extract only metadata (title, description, uploader, etc.) from a media URL.","operationId":"extract_info_api_v1_media_info_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":2048,"description":"Media URL to extract metadata from","title":"Url"},"description":"Media URL to extract metadata from"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaInfoResponseWrapper"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/channel/info":{"get":{"tags":["Channel"],"summary":"Get Channel Information","description":"Retrieve detailed information about a channel or uploader.","operationId":"channel_info_api_v1_channel_info_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":2048,"description":"Channel URL","title":"Url"},"description":"Channel URL"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/channel/videos":{"get":{"tags":["Channel"],"summary":"List Channel Videos","description":"Get a list of videos from a channel or uploader.","operationId":"channel_videos_api_v1_channel_videos_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":2048,"description":"Channel URL","title":"Url"},"description":"Channel URL"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelVideosResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search":{"get":{"tags":["Search"],"summary":"Search Media","description":"Search for media content across supported platforms.","operationId":"search_media_api_v1_search_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"description":"Search query","title":"Query"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of results","default":10,"title":"Limit"},"description":"Number of results"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Platform filter","title":"Source"},"description":"Platform filter"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/api-keys":{"get":{"tags":["Admin"],"summary":"List API Keys","description":"Get a list of all API keys (admin only).","operationId":"list_api_keys_api_v1_admin_api_keys_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Create API Key","description":"Create a new API key (admin only).","operationId":"create_api_key_api_v1_admin_api_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyFullResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/api-keys/{key_id}":{"get":{"tags":["Admin"],"summary":"Get API Key","description":"Get details of a specific API key (admin only).","operationId":"get_api_key_api_v1_admin_api_keys__key_id__get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin"],"summary":"Update API Key","description":"Update an existing API key (admin only).","operationId":"update_api_key_api_v1_admin_api_keys__key_id__put","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Delete API Key","description":"Delete an API key (admin only).","operationId":"delete_api_key_api_v1_admin_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"null","title":"Response Delete Api Key Api V1 Admin Api Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/api-keys/{key_id}/toggle":{"post":{"tags":["Admin"],"summary":"Toggle API Key Status","description":"Activate or deactivate an API key (admin only).","operationId":"toggle_api_key_api_v1_admin_api_keys__key_id__toggle_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/api-keys/bulk-delete":{"post":{"tags":["Admin"],"summary":"Bulk Delete API Keys","description":"Delete multiple API keys at once (admin only).","operationId":"bulk_delete_api_keys_api_v1_admin_api_keys_bulk_delete_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Bulk Delete Api Keys Api V1 Admin Api Keys Bulk Delete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["Admin"],"summary":"Get Dashboard Stats","description":"Get comprehensive dashboard statistics (admin only).","operationId":"get_stats_api_v1_admin_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/logs":{"get":{"tags":["Admin"],"summary":"Get Request Logs","description":"Get paginated request logs (admin only).","operationId":"get_logs_api_v1_admin_logs_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"APIKeyCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Human-readable name for the API key"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Optional description of the API key's purpose"},"rate_limit_per_minute":{"type":"integer","maximum":3600.0,"minimum":1.0,"title":"Rate Limit Per Minute","description":"Maximum requests per minute","default":60},"rate_limit_per_day":{"type":"integer","maximum":1000000.0,"minimum":1.0,"title":"Rate Limit Per Day","description":"Maximum requests per day","default":10000}},"type":"object","required":["name"],"title":"APIKeyCreate","description":"Request model for creating a new API key."},"APIKeyFullResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute"},"rate_limit_per_day":{"type":"integer","title":"Rate Limit Per Day"},"use_count":{"type":"integer","title":"Use Count"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"key":{"type":"string","title":"Key"}},"type":"object","required":["id","name","key_prefix","status","rate_limit_per_minute","rate_limit_per_day","use_count","is_active","created_at","updated_at","key"],"title":"APIKeyFullResponse","description":"Response model including the full key (only shown once on creation)."},"APIKeyListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/APIKeyResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page","default":1},"page_size":{"type":"integer","title":"Page Size","default":50}},"type":"object","required":["items","total"],"title":"APIKeyListResponse","description":"Response model for list of API keys."},"APIKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute"},"rate_limit_per_day":{"type":"integer","title":"Rate Limit Per Day"},"use_count":{"type":"integer","title":"Use Count"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","name","key_prefix","status","rate_limit_per_minute","rate_limit_per_day","use_count","is_active","created_at","updated_at"],"title":"APIKeyResponse","description":"Response model for API key data."},"APIKeyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"rate_limit_per_minute":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":1.0},{"type":"null"}],"title":"Rate Limit Per Minute"},"rate_limit_per_day":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Rate Limit Per Day"},"status":{"anyOf":[{"type":"string","pattern":"^(active|inactive)$"},{"type":"null"}],"title":"Status"}},"type":"object","title":"APIKeyUpdate","description":"Request model for updating an existing API key."},"AudioFormatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"audio_formats":{"items":{"$ref":"#/components/schemas/FormatInfo"},"type":"array","title":"Audio Formats","description":"Audio formats"},"url":{"type":"string","title":"Url","description":"Original requested URL"}},"type":"object","required":["audio_formats","url"],"title":"AudioFormatsResponse","description":"Response model for audio formats only."},"BulkDeleteRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Ids","description":"List of API key IDs to delete"}},"type":"object","required":["ids"],"title":"BulkDeleteRequest","description":"Request model for bulk deleting API keys."},"ChannelInfoResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"id":{"type":"string","title":"Id","description":"Channel ID"},"name":{"type":"string","title":"Name","description":"Channel name"},"url":{"type":"string","title":"Url","description":"Channel URL"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Channel description"},"subscriber_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subscriber Count","description":"Number of subscribers"},"video_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Count","description":"Number of videos"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"Channel thumbnail URL"},"banner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner","description":"Channel banner URL"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Channel country"},"channel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Type","description":"Channel type"},"uploader_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader Id","description":"Uploader ID"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified","description":"Whether channel is verified"}},"type":"object","required":["id","name","url"],"title":"ChannelInfoResponse","description":"Response model for channel information."},"ChannelVideo":{"properties":{"id":{"type":"string","title":"Id","description":"Video ID"},"title":{"type":"string","title":"Title","description":"Video title"},"url":{"type":"string","title":"Url","description":"Video URL"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count","description":"View count"},"upload_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Date","description":"Upload date (YYYYMMDD)"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"Thumbnail URL"}},"type":"object","required":["id","title","url"],"title":"ChannelVideo","description":"Summary of a video in channel listing."},"ChannelVideosResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"channel_name":{"type":"string","title":"Channel Name","description":"Channel name"},"channel_id":{"type":"string","title":"Channel Id","description":"Channel ID"},"videos":{"items":{"$ref":"#/components/schemas/ChannelVideo"},"type":"array","title":"Videos","description":"List of videos"},"count":{"type":"integer","title":"Count","description":"Number of videos returned"}},"type":"object","required":["channel_name","channel_id","videos","count"],"title":"ChannelVideosResponse","description":"Response model for channel video listing."},"FormatInfo":{"properties":{"format_id":{"type":"string","title":"Format Id","description":"Format identifier"},"ext":{"type":"string","title":"Ext","description":"File extension"},"format_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Note","description":"Format description"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"Video width in pixels"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"Video height in pixels"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"Human-readable resolution"},"fps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fps","description":"Frames per second"},"vcodec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vcodec","description":"Video codec"},"acodec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acodec","description":"Audio codec"},"abr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Abr","description":"Audio bitrate in kbps"},"vbr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vbr","description":"Video bitrate in kbps"},"filesize":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Filesize","description":"File size in bytes"},"tbr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tbr","description":"Total bitrate"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Direct URL to the media stream"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol","description":"Streaming protocol"},"has_audio":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Audio","description":"Whether format has audio stream"}},"type":"object","required":["format_id","ext"],"title":"FormatInfo","description":"Information about a single media format."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Service status"},"version":{"type":"string","title":"Version","description":"API version"},"uptime":{"type":"number","title":"Uptime","description":"Uptime in seconds"},"database":{"type":"string","title":"Database","description":"Database status"},"timestamp":{"type":"string","title":"Timestamp","description":"Current timestamp"}},"type":"object","required":["status","version","uptime","database","timestamp"],"title":"HealthResponse","description":"Health check response."},"LogEntryResponse":{"properties":{"id":{"type":"string","title":"Id"},"api_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id"},"api_key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Name"},"endpoint":{"type":"string","title":"Endpoint"},"method":{"type":"string","title":"Method"},"url_requested":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Requested"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"http_status_code":{"type":"integer","title":"Http Status Code"},"execution_time_ms":{"type":"number","title":"Execution Time Ms"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","endpoint","method","http_status_code","execution_time_ms","created_at"],"title":"LogEntryResponse","description":"Response model for a log entry."},"LogListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LogEntryResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"LogListResponse","description":"Response model for paginated log entries."},"LoginRequest":{"properties":{"username":{"type":"string","maxLength":100,"minLength":1,"title":"Username","description":"Admin username"},"password":{"type":"string","maxLength":256,"minLength":1,"title":"Password","description":"Admin password"}},"type":"object","required":["username","password"],"title":"LoginRequest","description":"Request model for admin login."},"MediaExtractResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"info":{"$ref":"#/components/schemas/MediaInfoResponse","description":"Media metadata"},"formats":{"items":{"$ref":"#/components/schemas/FormatInfo"},"type":"array","title":"Formats","description":"Available formats"},"thumbnails":{"items":{"$ref":"#/components/schemas/ThumbnailInfo"},"type":"array","title":"Thumbnails","description":"Available thumbnails"},"url":{"type":"string","title":"Url","description":"Original requested URL"},"extractor":{"type":"string","title":"Extractor","description":"Extractor used"},"extracted_at":{"type":"string","title":"Extracted At","description":"ISO timestamp of extraction"}},"type":"object","required":["info","url","extractor","extracted_at"],"title":"MediaExtractResponse","description":"Full extraction response with all available data."},"MediaInfoResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Media identifier"},"title":{"type":"string","title":"Title","description":"Media title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Media description"},"url":{"type":"string","title":"Url","description":"Original URL"},"webpage_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webpage Url","description":"Webpage URL"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"duration_string":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration String","description":"Human-readable duration"},"uploader":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader","description":"Uploader/channel name"},"uploader_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader Id","description":"Uploader/channel ID"},"uploader_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader Url","description":"Uploader/channel URL"},"upload_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Date","description":"Upload date (YYYYMMDD)"},"timestamp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timestamp","description":"Unix timestamp of upload"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count","description":"Number of views"},"like_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Like Count","description":"Number of likes"},"dislike_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dislike Count","description":"Number of dislikes"},"comment_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Comment Count","description":"Number of comments"},"age_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Limit","description":"Age restriction (0 = none)"},"webpage_url_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webpage Url Domain","description":"Domain of the webpage"},"extractor":{"type":"string","title":"Extractor","description":"Extractor used (e.g., youtube)"},"extractor_key":{"type":"string","title":"Extractor Key","description":"Extractor key"},"playlist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Playlist","description":"Playlist name if part of one"},"playlist_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Playlist Index","description":"Position in playlist"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Content tags"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories","description":"Content categories"},"is_live":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Live","description":"Whether content is live"},"was_live":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Was Live","description":"Whether content was live"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel","description":"Channel name"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id","description":"Channel ID"},"channel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Url","description":"Channel URL"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"Content license"}},"type":"object","required":["id","title","url","extractor","extractor_key"],"title":"MediaInfoResponse","description":"Comprehensive media metadata."},"MediaInfoResponseWrapper":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"info":{"$ref":"#/components/schemas/MediaInfoResponse","description":"Media metadata"},"url":{"type":"string","title":"Url","description":"Original requested URL"}},"type":"object","required":["info","url"],"title":"MediaInfoResponseWrapper","description":"Response model for media info only."},"SearchResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"query":{"type":"string","title":"Query","description":"Original search query"},"results":{"items":{"$ref":"#/components/schemas/SearchResult"},"type":"array","title":"Results","description":"Search results"},"count":{"type":"integer","title":"Count","description":"Number of results"}},"type":"object","required":["query","results","count"],"title":"SearchResponse","description":"Response model for search results."},"SearchResult":{"properties":{"id":{"type":"string","title":"Id","description":"Result ID"},"title":{"type":"string","title":"Title","description":"Result title"},"url":{"type":"string","title":"Url","description":"Result URL"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"uploader":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader","description":"Uploader name"},"uploader_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploader Url","description":"Uploader URL"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail","description":"Thumbnail URL"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count","description":"View count"},"upload_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Date","description":"Upload date"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Result description"},"source":{"type":"string","title":"Source","description":"Source platform"},"type":{"type":"string","title":"Type","description":"Content type","default":"video"}},"type":"object","required":["id","title","url","source"],"title":"SearchResult","description":"A single search result item."},"StatsResponse":{"properties":{"total_api_keys":{"type":"integer","title":"Total Api Keys"},"active_api_keys":{"type":"integer","title":"Active Api Keys"},"requests_today":{"type":"integer","title":"Requests Today"},"requests_total":{"type":"integer","title":"Requests Total"},"average_response_time_ms":{"type":"number","title":"Average Response Time Ms"},"requests_by_endpoint":{"additionalProperties":{"type":"integer"},"type":"object","title":"Requests By Endpoint"},"recent_logs":{"items":{"$ref":"#/components/schemas/LogEntryResponse"},"type":"array","title":"Recent Logs"}},"type":"object","required":["total_api_keys","active_api_keys","requests_today","requests_total","average_response_time_ms","requests_by_endpoint","recent_logs"],"title":"StatsResponse","description":"Dashboard statistics response."},"ThumbnailInfo":{"properties":{"id":{"type":"string","title":"Id","description":"Thumbnail identifier"},"url":{"type":"string","title":"Url","description":"Thumbnail URL"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"Thumbnail width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"Thumbnail height"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"Thumbnail resolution"}},"type":"object","required":["id","url"],"title":"ThumbnailInfo","description":"Information about a thumbnail image."},"ThumbnailResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"thumbnails":{"items":{"$ref":"#/components/schemas/ThumbnailInfo"},"type":"array","title":"Thumbnails","description":"Available thumbnails and images"},"url":{"type":"string","title":"Url","description":"Original requested URL"}},"type":"object","required":["thumbnails","url"],"title":"ThumbnailResponse","description":"Response model for thumbnails/images."},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token","description":"JWT access token"},"token_type":{"type":"string","title":"Token Type","description":"Token type","default":"bearer"},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"Token expiration timestamp"}},"type":"object","required":["access_token","expires_at"],"title":"TokenResponse","description":"Response model containing JWT token."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionResponse":{"properties":{"name":{"type":"string","title":"Name","description":"Application name"},"version":{"type":"string","title":"Version","description":"Application version"},"description":{"type":"string","title":"Description","description":"Application description"},"python_version":{"type":"string","title":"Python Version","description":"Python runtime version"},"framework":{"type":"string","title":"Framework","description":"Web framework"},"docs_url":{"type":"string","title":"Docs Url","description":"API documentation URL"},"extractor_engine":{"type":"string","title":"Extractor Engine","description":"Media extraction engine"},"supported_platforms":{"type":"integer","title":"Supported Platforms","description":"Number of supported platforms"}},"type":"object","required":["name","version","description","python_version","framework","docs_url","extractor_engine","supported_platforms"],"title":"VersionResponse","description":"Version and server information."},"VideoFormatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"video_formats":{"items":{"$ref":"#/components/schemas/FormatInfo"},"type":"array","title":"Video Formats","description":"Video formats"},"url":{"type":"string","title":"Url","description":"Original requested URL"}},"type":"object","required":["video_formats","url"],"title":"VideoFormatsResponse","description":"Response model for video formats only."}},"securitySchemes":{"APIKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Enter your API key: `your_api_key_here` or `Bearer your_api_key_here`"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Admin JWT token obtained from /api/v1/auth/login"}}},"security":[{"APIKeyAuth":[]}],"tags":[{"name":"Media Extraction","description":"Extract media information, formats, thumbnails and metadata from URLs. These endpoints require an API key."},{"name":"Channel","description":"Retrieve channel information and video listings. These endpoints require an API key."},{"name":"Search","description":"Search for media content across supported platforms. These endpoints require an API key."},{"name":"Authentication","description":"Admin authentication endpoints for obtaining JWT tokens."},{"name":"Admin","description":"Administrative endpoints for managing API keys, viewing logs, and dashboard statistics. These endpoints require JWT authentication."},{"name":"General","description":"General endpoints for health checks, version info, and documentation."}],"externalDocs":{"description":"Custom Documentation","url":"/docs/custom"}}