{"openapi":"3.1.0","info":{"title":"PLAYER PRO AR — API","description":"\n## PLAYER PRO AR — Professional Streaming Management Platform\n\nPlataforma multi-país multi-nodo para gestión de streams TV (HLS, DASH, YouTube, Acestream).\n\n### Características principales\n\n| Característica | Endpoint / Recurso | Descripción |\n|---|---|---|\n| **Multi-país** | `/api/countries` | España + Italia + soporte para añadir más países ISO 3166-1. |\n| **Cluster multi-server** | `/api/nodes` | Master + workers con auto-registro one-liner. |\n| **Estado `requires_vpn`** | enum ChannelStatus | Cuando la infra (SOCKS/VPN) cae, los streams NO se marcan offline. |\n| **On Demand** | `/api/channels/bulk` | Canales VOD que el healer salta en chequeos masivos. |\n| **Autorenew tokens** | `/api/channels/{ch}/sources/{src}/refresh` | Re-extracción automática antes de TTL/2. |\n| **Stream Sleep** | `Channel.sleep_schedule` | Dormir streams en horarios concretos (08:00-20:00). |\n| **Scheduled Restart** | `Channel.restart_schedule` | Reinicio programado tipo cron. |\n| **Hardware Acceleration** | `Source.hw_accel` | NVENC/QuickSync por source. |\n| **DRM Decryption** | `Source.drm_*` | ClearKey/Widevine vía KID:KEY. |\n| **Métricas en vivo** | `/api/system/dashboard`, `/api/nodes` | Dashboard con CPU/RAM/streams/bandwidth por nodo. |\n| **Tickets de soporte** | `/api/tickets` | Sistema de soporte multi-rol con priorities y replies. |\n| **Bouquets** | `/api/bouquets` | Paquetes de canales con export M3U. |\n| **2FA** | `/api/auth/2fa/*` | TOTP RFC 6238 (Google Authenticator). |\n\n### Autenticación\n\n- **Login**: `POST /api/auth/login` con `username` + `password` (+ `otp_code` si el usuario tiene 2FA activo). Devuelve `access_token` (JWT HS256, TTL 12h).\n- **Endpoints protegidos**: incluir `Authorization: Bearer <access_token>` en cabecera.\n- **Auto-registro de nodos**: `POST /api/nodes/_register` con `install_token` de un solo uso (24h TTL).\n- **Health del worker**: `GET /node/health` requiere `Authorization: Bearer <api_token>` del nodo.\n\n### Modelo de datos principal\n\n- `Country` — país (ISO 3166-1 alpha-2: ES, IT, ...).\n- `Folder` — carpeta de canales con `country_code`.\n- `Channel` — canal con N `Sources` (hasta 20 backup URLs).\n- `Source` — fuente con extractor + DRM + hw_accel + backup_priority.\n- `Node` — nodo del cluster (master | worker | relay).\n- `VPNAccount` / `Namespace` / `ProxyAccount` — infraestructura VPN/proxy.\n- `User` — admin | reseller | user con bcrypt + JWT + 2FA opcional.\n- `Ticket` / `TicketReply` — soporte.\n- `Bouquet` / `bouquet_channels` — paquetes.\n\n### Códigos de respuesta estándar\n\n| Código | Significado |\n|---|---|\n| 200 | OK |\n| 201 | Created (POST) |\n| 400 | Bad Request (validación) |\n| 401 | Unauthorized (sin token o token inválido) |\n| 403 | Forbidden (rol insuficiente) |\n| 404 | Not Found |\n| 409 | Conflict (recurso ya existe / safeguard de integridad) |\n| 410 | Gone (token expirado) |\n| 502 | Bad Gateway (extractor falló / nodo no responde) |\n| 503 | Service Unavailable (sin nodos disponibles) |\n","contact":{"name":"PLAYER PRO AR Team","url":"https://213.239.220.137/"},"license":{"name":"Proprietary"},"version":"1.1.0"},"paths":{"/api/system/license-admin-key":{"get":{"tags":["system"],"summary":"License Admin Key Endpoint","description":"Returns the license server admin API key (solo server admin).","operationId":"license_admin_key_endpoint_api_system_license_admin_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/license/status":{"get":{"tags":["system"],"summary":"License Status Endpoint","description":"Stato della licenza corrente.","operationId":"license_status_endpoint_api_license_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/channels":{"get":{"tags":["channels"],"summary":"List Channels","description":"List channels with filtering, sorting, and pagination.","operationId":"list_channels_api_channels_get","parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"resolution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"tag_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Id"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"order","title":"Sort By"}},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Sort Dir"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChannelOut"},"title":"Response List Channels Api Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["channels"],"summary":"Create Channel","description":"Create a new channel with sources.","operationId":"create_channel_api_channels_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/list":{"get":{"tags":["channels"],"summary":"List Channels Light","description":"Lightweight channel list - uses raw SQL for maximum performance.","operationId":"list_channels_light_api_channels_list_get","parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"resolution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"tag_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Id"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"order","title":"Sort By"}},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Sort Dir"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/count":{"get":{"tags":["channels"],"summary":"Count Channels","description":"Get channel count with optional filters.","operationId":"count_channels_api_channels_count_get","parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"resolution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/{channel_id}":{"get":{"tags":["channels"],"summary":"Get Channel","description":"Get a single channel by ID.","operationId":"get_channel_api_channels__channel_id__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["channels"],"summary":"Update Channel","description":"Update a channel.","operationId":"update_channel_api_channels__channel_id__put","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["channels"],"summary":"Delete Channel","description":"Delete a channel.","operationId":"delete_channel_api_channels__channel_id__delete","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/{channel_id}/sources":{"post":{"tags":["channels"],"summary":"Add Source","description":"Add a source to a channel.","operationId":"add_source_api_channels__channel_id__sources_post","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/{channel_id}/sources/{source_id}":{"put":{"tags":["channels"],"summary":"Update Source","description":"Update a source.","operationId":"update_source_api_channels__channel_id__sources__source_id__put","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["channels"],"summary":"Delete Source","description":"Delete a source.","operationId":"delete_source_api_channels__channel_id__sources__source_id__delete","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/{channel_id}/sources/{source_id}/refresh":{"post":{"tags":["channels"],"summary":"Refresh Source","description":"Forzar refresh manual de un Source: re-llama al extractor asociado y\nactualiza la URL si la extraccion devuelve una nueva. Util desde la UI\ncuando el operador ve un canal con token a punto de caducar y quiere\nrenovar antes del proximo ciclo automatico (handler_refresh_short_ttl).","operationId":"refresh_source_api_channels__channel_id__sources__source_id__refresh_post","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/bulk":{"post":{"tags":["channels"],"summary":"Bulk Action","description":"Execute bulk actions on multiple channels.","operationId":"bulk_action_api_channels_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAction"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/reorder":{"post":{"tags":["channels"],"summary":"Reorder Channels","description":"Reorder all channels by resolution priority (none→SD→HD→FHD) then name.","operationId":"reorder_channels_api_channels_reorder_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/channels/{channel_id}/stop":{"post":{"tags":["channels"],"summary":"Stop Channel","description":"Ferma il canale: disabled + status offline immediato su canale e sorgenti.","operationId":"stop_channel_api_channels__channel_id__stop_post","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/{channel_id}/health-check":{"post":{"tags":["channels"],"summary":"Health Check One","description":"FASE 17 — manual single-channel health check (used by row kebab menu).\nProbes all sources in parallel (asyncio.gather) with 5s timeout each.","operationId":"health_check_one_api_channels__channel_id__health_check_post","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/folders":{"get":{"tags":["folders"],"summary":"List Folders","operationId":"list_folders_api_folders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FolderOut"},"type":"array","title":"Response List Folders Api Folders Get"}}}}}},"post":{"tags":["folders"],"summary":"Create Folder","operationId":"create_folder_api_folders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/folders/{folder_id}":{"get":{"tags":["folders"],"summary":"Get Folder","operationId":"get_folder_api_folders__folder_id__get","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["folders"],"summary":"Update Folder","operationId":"update_folder_api_folders__folder_id__put","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["folders"],"summary":"Delete Folder","operationId":"delete_folder_api_folders__folder_id__delete","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/folders/reorder":{"post":{"tags":["folders"],"summary":"Reorder Folders","description":"Bulk-update folder.order from drag-drop UI. Items: [{id, order}, ...]","operationId":"reorder_folders_api_folders_reorder_post","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FolderReorderItem"},"type":"array","title":"Items"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/folders/_meta/instance-scoped":{"get":{"tags":["folders"],"summary":" Folders Scoped","description":"Demo multi-tenant: lista carpetas filtradas por instance_id del actor.\nDevuelve {actor_instance, count, items}. System ve TODO; el resto solo su instancia.","operationId":"_folders_scoped_api_folders__meta_instance_scoped_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vpn/test-all":{"post":{"tags":["vpn"],"summary":"Test All Vpn Connections","description":"Test all VPN connections and return results.","operationId":"test_all_vpn_connections_api_vpn_test_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vpn/status":{"get":{"tags":["vpn"],"summary":"Get Vpn Status","description":"Get status of all real VPN namespaces.","operationId":"get_vpn_status_api_vpn_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vpn/test/{ns_name}":{"post":{"tags":["vpn"],"summary":"Test Vpn Connection","description":"Test a specific VPN namespace connection.","operationId":"test_vpn_connection_api_vpn_test__ns_name__post","parameters":[{"name":"ns_name","in":"path","required":true,"schema":{"type":"string","title":"Ns Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vpn/restart/{ns_name}":{"post":{"tags":["vpn"],"summary":"Restart Vpn","description":"Restart a VPN connection in a namespace.","operationId":"restart_vpn_api_vpn_restart__ns_name__post","parameters":[{"name":"ns_name","in":"path","required":true,"schema":{"type":"string","title":"Ns Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vpn/connect/{ns_name}":{"post":{"tags":["vpn"],"summary":"Connect Vpn","description":"FASE 22 — connect a VPN namespace (alias to restart for now since manager doesn't expose connect).","operationId":"connect_vpn_api_vpn_connect__ns_name__post","parameters":[{"name":"ns_name","in":"path","required":true,"schema":{"type":"string","title":"Ns Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vpn/disconnect/{ns_name}":{"post":{"tags":["vpn"],"summary":"Disconnect Vpn","description":"FASE 22 — disconnect VPN namespace by stopping its tunnel processes.","operationId":"disconnect_vpn_api_vpn_disconnect__ns_name__post","parameters":[{"name":"ns_name","in":"path","required":true,"schema":{"type":"string","title":"Ns Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vpn":{"get":{"tags":["vpn"],"summary":"List Vpn Accounts","description":"FASE 35 — also returns channels_using count + last test info.","operationId":"list_vpn_accounts_api_vpn_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/VPNAccountOut"},"type":"array","title":"Response List Vpn Accounts Api Vpn Get"}}}}}},"post":{"tags":["vpn"],"summary":"Create Vpn Account","operationId":"create_vpn_account_api_vpn_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VPNAccountCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VPNAccountOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vpn/providers/catalog":{"get":{"tags":["vpn"],"summary":"Vpn Providers Catalog","description":"Return the catalog of VPN providers + the countries each supports + smart defaults.\nUsed by the VPN frontend to show a visual country grid and prefill the modal.","operationId":"vpn_providers_catalog_api_vpn_providers_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vpn/usage":{"get":{"tags":["vpn"],"summary":"Vpn Usage","description":"List which channels use which VPN (primary + failover).","operationId":"vpn_usage_api_vpn_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/vpn/{vpn_id}/credentials":{"get":{"tags":["vpn"],"summary":"Vpn Credentials","description":"FASE 32 — return full VPN credentials (password + raw config) for edit modal.\nAdmin-only via JWT in production (currently inherits panel auth).","operationId":"vpn_credentials_api_vpn__vpn_id__credentials_get","parameters":[{"name":"vpn_id","in":"path","required":true,"schema":{"type":"string","title":"Vpn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vpn/{vpn_id}":{"put":{"tags":["vpn"],"summary":"Update Vpn Account","operationId":"update_vpn_account_api_vpn__vpn_id__put","parameters":[{"name":"vpn_id","in":"path","required":true,"schema":{"type":"string","title":"Vpn Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VPNAccountUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VPNAccountOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["vpn"],"summary":"Delete Vpn Account","operationId":"delete_vpn_account_api_vpn__vpn_id__delete","parameters":[{"name":"vpn_id","in":"path","required":true,"schema":{"type":"string","title":"Vpn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/namespaces":{"get":{"tags":["vpn"],"summary":"List Namespaces","operationId":"list_namespaces_api_namespaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NamespaceOut"},"type":"array","title":"Response List Namespaces Api Namespaces Get"}}}}}},"post":{"tags":["vpn"],"summary":"Create Namespace","operationId":"create_namespace_api_namespaces_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/namespaces/{ns_id}":{"delete":{"tags":["vpn"],"summary":"Delete Namespace","operationId":"delete_namespace_api_namespaces__ns_id__delete","parameters":[{"name":"ns_id","in":"path","required":true,"schema":{"type":"string","title":"Ns Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies/scrape-free":{"post":{"tags":["vpn"],"summary":"Scrape Free Proxies","description":"Scrape free proxies from multiple public APIs.\nSources: ProxyScrape, GeoNode, PubProxy.\nOptionally test them and auto-add working ones.","operationId":"scrape_free_proxies_api_proxies_scrape_free_post","parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"ES","title":"Country"}},{"name":"protocol","in":"query","required":false,"schema":{"type":"string","default":"http","title":"Protocol"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"auto_test","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Auto Test"}},{"name":"auto_add","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Auto Add"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies/test-all":{"post":{"tags":["vpn"],"summary":"Test All Proxies","description":"Test all stored proxies and update their status.","operationId":"test_all_proxies_api_proxies_test_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/proxies":{"get":{"tags":["vpn"],"summary":"List Proxies","operationId":"list_proxies_api_proxies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProxyOut"},"type":"array","title":"Response List Proxies Api Proxies Get"}}}}}},"post":{"tags":["vpn"],"summary":"Create Proxy","operationId":"create_proxy_api_proxies_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies/{proxy_id}":{"put":{"tags":["vpn"],"summary":"Update Proxy","operationId":"update_proxy_api_proxies__proxy_id__put","parameters":[{"name":"proxy_id","in":"path","required":true,"schema":{"type":"string","title":"Proxy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["vpn"],"summary":"Delete Proxy","operationId":"delete_proxy_api_proxies__proxy_id__delete","parameters":[{"name":"proxy_id","in":"path","required":true,"schema":{"type":"string","title":"Proxy Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies/{proxy_id}/test":{"post":{"tags":["vpn"],"summary":"Test Proxy","operationId":"test_proxy_api_proxies__proxy_id__test_post","parameters":[{"name":"proxy_id","in":"path","required":true,"schema":{"type":"string","title":"Proxy Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies/bulk-add":{"post":{"tags":["vpn"],"summary":"Bulk Add Proxies","description":"Add multiple proxies at once.","operationId":"bulk_add_proxies_api_proxies_bulk_add_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_bulk_add_proxies_api_proxies_bulk_add_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies/bulk-delete":{"post":{"tags":["vpn"],"summary":"Bulk Delete Proxies","description":"Delete multiple proxies by IDs or delete all.","operationId":"bulk_delete_proxies_api_proxies_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/system/dashboard":{"get":{"tags":["system"],"summary":"Get Dashboard","description":"Get dashboard statistics.","operationId":"get_dashboard_api_system_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardStats"}}}}}}},"/api/system/config":{"get":{"tags":["system"],"summary":"Get Config","operationId":"get_config_api_system_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ConfigOut"},"type":"array","title":"Response Get Config Api System Config Get"}}}}}},"put":{"tags":["system"],"summary":"Update Config","operationId":"update_config_api_system_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/system/info":{"get":{"tags":["system"],"summary":"System Info","operationId":"system_info_api_system_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/system/playlist.m3u8":{"get":{"tags":["system"],"summary":"Get Playlist M3U","description":"Direct M3U playlist download for any IPTV player.\n\nProfiles:\n- proxy: All URLs go through the server proxy (VLC, mpv, Smart TVs).\n         Handles geo-restriction, DRM decryption, and headers server-side.\n- kodi: Native DRM via KODIPROP + InputAdaptive (Kodi, TiviMate, OTT Navigator).\n        Direct CDN URLs with DRM metadata for client-side decryption.\n- raw: Original upstream URLs without modification (debugging/advanced).","operationId":"get_playlist_m3u_api_system_playlist_m3u8_get","parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},{"name":"folder","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"profile","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"xtream","title":"Profile"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/system/playlist.m3u":{"get":{"tags":["system"],"summary":"Get Playlist M3U","description":"Direct M3U playlist download for any IPTV player.\n\nProfiles:\n- proxy: All URLs go through the server proxy (VLC, mpv, Smart TVs).\n         Handles geo-restriction, DRM decryption, and headers server-side.\n- kodi: Native DRM via KODIPROP + InputAdaptive (Kodi, TiviMate, OTT Navigator).\n        Direct CDN URLs with DRM metadata for client-side decryption.\n- raw: Original upstream URLs without modification (debugging/advanced).","operationId":"get_playlist_m3u_api_system_playlist_m3u_get","parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},{"name":"folder","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"profile","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"xtream","title":"Profile"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/system/add-youtube":{"post":{"tags":["system"],"summary":"Add Youtube Channel","description":"Quick-add a YouTube channel/video/live stream. Extracts the HLS URL automatically.","operationId":"add_youtube_channel_api_system_add_youtube_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddYouTubeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/system/restart":{"post":{"tags":["system"],"summary":"Restart Service","operationId":"restart_service_api_system_restart_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tags":{"get":{"tags":["tags"],"summary":"List Tags","operationId":"list_tags_api_tags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TagOut"},"type":"array","title":"Response List Tags Api Tags Get"}}}}}},"post":{"tags":["tags"],"summary":"Create Tag","operationId":"create_tag_api_tags_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tags/{tag_id}":{"delete":{"tags":["tags"],"summary":"Delete Tag","operationId":"delete_tag_api_tags__tag_id__delete","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health/trigger":{"post":{"tags":["health"],"summary":"Trigger Global Health","description":"FASE 22 — trigger health check via cron handler (alias for settings.html button).","operationId":"trigger_global_health_api_health_trigger_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health/check":{"post":{"tags":["health"],"summary":"Trigger Health Check","description":"Trigger health checks for specified sources or channels.","operationId":"trigger_health_check_api_health_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health/history/{source_id}":{"get":{"tags":["health"],"summary":"Get Health History","operationId":"get_health_history_api_health_history__source_id__get","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HealthCheckOut"},"title":"Response Get Health History Api Health History  Source Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cron":{"get":{"tags":["cron"],"summary":"List Cron Jobs","operationId":"list_cron_jobs_api_cron_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CronJobOut"},"type":"array","title":"Response List Cron Jobs Api Cron Get"}}}}}},"post":{"tags":["cron"],"summary":"Create Cron Job","operationId":"create_cron_job_api_cron_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cron/{job_id}":{"put":{"tags":["cron"],"summary":"Update Cron Job","operationId":"update_cron_job_api_cron__job_id__put","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["cron"],"summary":"Delete Cron Job","operationId":"delete_cron_job_api_cron__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cron/{job_id}/trigger":{"post":{"tags":["cron"],"summary":"Trigger Cron Job","operationId":"trigger_cron_job_api_cron__job_id__trigger_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logs":{"get":{"tags":["logs"],"summary":"Get Logs","operationId":"get_logs_api_logs_get","parameters":[{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["logs"],"summary":"Clear Logs","description":"Clear logs. Optionally filter by level, type, or date.","operationId":"clear_logs_api_logs_delete","parameters":[{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logs/buffer":{"get":{"tags":["logs"],"summary":"Get Log Buffer Endpoint","description":"Get recent logs from in-memory buffer (faster than DB).","operationId":"get_log_buffer_endpoint_api_logs_buffer_get","parameters":[{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logs/{log_id}":{"delete":{"tags":["logs"],"summary":"Delete Log","description":"Delete a single log entry.","operationId":"delete_log_api_logs__log_id__delete","parameters":[{"name":"log_id","in":"path","required":true,"schema":{"type":"string","title":"Log Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/import":{"post":{"tags":["import-export"],"summary":"Import Channels","description":"Import channels from M3U, JSON, or CSV content.","operationId":"import_channels_api_import_export_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/import/file":{"post":{"tags":["import-export"],"summary":"Import File","description":"Import channels from uploaded file.","operationId":"import_file_api_import_export_import_file_post","parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_file_api_import_export_import_file_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/import/url":{"post":{"tags":["import-export"],"summary":"Import From Url","description":"Import channels from a remote M3U URL.","operationId":"import_from_url_api_import_export_import_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportUrlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/export":{"post":{"tags":["import-export"],"summary":"Export Channels","operationId":"export_channels_api_import_export_export_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/history":{"get":{"tags":["import-export"],"summary":"Get Ie History","operationId":"get_ie_history_api_import_export_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ImportExportHistoryOut"},"title":"Response Get Ie History Api Import Export History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["import-export"],"summary":"Ie Clear History","description":"Limpia el historial. Filtros opcionales:\n  - ?type=import|export\n  - ?fmt=m3u|json|csv|xspf\n  - ?status=completed|partial|error\n  - ?before_days=N (solo entradas anteriores a N dias)\nSin filtros: borra todo.","operationId":"ie_clear_history_api_import_export_history_delete","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"fmt","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fmt"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"before_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/history/{hid}":{"delete":{"tags":["import-export"],"summary":"Ie Delete History One","description":"Borra una entrada del historial.","operationId":"ie_delete_history_one_api_import_export_history__hid__delete","parameters":[{"name":"hid","in":"path","required":true,"schema":{"type":"string","title":"Hid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/history/bulk-delete":{"post":{"tags":["import-export"],"summary":"Ie Delete History Bulk","description":"Borra varias entradas por id.","operationId":"ie_delete_history_bulk_api_import_export_history_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_BulkDeleteIEHistoryReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/import-export/stats":{"get":{"tags":["import-export"],"summary":"Ie Stats","description":"KPIs agregados del historial: total, por tipo, por formato, success rate,\ntotal channels procesados, ultima operacion, ops en las ultimas 24h.","operationId":"ie_stats_api_import_export_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/import-export/import/preview":{"post":{"tags":["import-export"],"summary":"Ie Import Preview","description":"Parsea contenido (o descarga URL) y devuelve preview SIN guardar.\nPermite al usuario verificar antes de importar.","operationId":"ie_import_preview_api_import_export_import_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_IEPreviewReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/extractors":{"get":{"tags":["extractors"],"summary":"List Extractors","operationId":"list_extractors_api_extractors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/extractors/extract":{"post":{"tags":["extractors"],"summary":"Extract Url","operationId":"extract_url_api_extractors_extract_post","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"extractor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extractor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["extractors"],"summary":"Extract Url Get","description":"GET version of extract for easier testing.","operationId":"extract_url_get_api_extractors_extract_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"extractor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extractor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/xtream/{channel_id}.m3u8":{"get":{"summary":"Get Xtream Hls","description":"Legacy HLS endpoint.","operationId":"get_xtream_hls_api_xtream__channel_id__m3u8_get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"quality","in":"query","required":false,"schema":{"type":"string","default":"hd","title":"Quality"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"video","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/xtream/ts/{channel_id}":{"get":{"summary":"Get Xtream Mpegts","description":"Continuous MPEG-TS stream from shared pipeline.\nZero-gap, instant connection, continuous timestamps.","operationId":"get_xtream_mpegts_api_xtream_ts__channel_id__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"quality","in":"query","required":false,"schema":{"type":"string","default":"hd","title":"Quality"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/xtream/hls/{channel_id}/index.m3u8":{"get":{"summary":"Get Xtream Hls Playlist","description":"HLS playlist for DASH channels.","operationId":"get_xtream_hls_playlist_api_xtream_hls__channel_id__index_m3u8_get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/xtream/hls/{channel_id}/{seg_file}":{"get":{"summary":"Get Xtream Hls Segment","description":"Serve HLS TS segment from disk.","operationId":"get_xtream_hls_segment_api_xtream_hls__channel_id___seg_file__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"seg_file","in":"path","required":true,"schema":{"type":"string","title":"Seg File"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts":{"get":{"tags":["accounts"],"summary":"List Accounts","operationId":"list_accounts_api_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AccountOut"},"type":"array","title":"Response List Accounts Api Accounts Get"}}}}}},"post":{"tags":["accounts"],"summary":"Create Account","operationId":"create_account_api_accounts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/{account_id}":{"put":{"tags":["accounts"],"summary":"Update Account","operationId":"update_account_api_accounts__account_id__put","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accounts"],"summary":"Delete Account","operationId":"delete_account_api_accounts__account_id__delete","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/{account_id}/test":{"post":{"tags":["accounts"],"summary":"Test Account","description":"Test account credentials with real validation for each service.","operationId":"test_account_api_accounts__account_id__test_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/{account_id}/extract":{"post":{"tags":["accounts"],"summary":"Extract Channels","description":"Trigger channel extraction for this service account.","operationId":"extract_channels_api_accounts__account_id__extract_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/accounts/test-all":{"post":{"tags":["accounts"],"summary":"Test All Accounts","description":"Test all accounts at once. FASE 22 — parallel + per-account 12s timeout.","operationId":"test_all_accounts_api_accounts_test_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/automations/summary":{"get":{"tags":["automations"],"summary":"Get Automation Summary","description":"Get complete automation summary with all providers, health stats, and countdowns.","operationId":"get_automation_summary_api_automations_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationSummary"}}}}}}},"/api/automations/history":{"get":{"tags":["automations"],"summary":"Get Cron History","description":"Get execution history from log entries.","operationId":"get_cron_history_api_automations_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/automations/trigger/{job_id}":{"post":{"tags":["automations"],"summary":"Trigger Automation","description":"Trigger a cron job manually (fire-and-forget).","operationId":"trigger_automation_api_automations_trigger__job_id__post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/automations/cron/{job_id}":{"put":{"tags":["automations"],"summary":"Update Automation Cron","description":"Update a cron job's schedule or settings.","operationId":"update_automation_cron_api_automations_cron__job_id__put","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/automations/provider/{provider_name}/channels":{"get":{"tags":["automations"],"summary":"Get Provider Channels","description":"Get channels for a specific provider with optional status filter.","operationId":"get_provider_channels_api_automations_provider__provider_name__channels_get","parameters":[{"name":"provider_name","in":"path","required":true,"schema":{"type":"string","title":"Provider Name"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/countries":{"get":{"tags":["countries"],"summary":"List Countries","description":"Lista paises. Por defecto solo los enabled (los que el panel debe mostrar).","operationId":"list_countries_api_countries_get","parameters":[{"name":"only_enabled","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Only Enabled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CountryOut"},"title":"Response List Countries Api Countries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["countries"],"summary":"Create Country","description":"Anade un pais nuevo. Util para escalar (Italia, Francia, etc) sin tocar el seed SQL.","operationId":"create_country_api_countries_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/countries/{code}":{"delete":{"tags":["countries"],"summary":"Delete Country","description":"Elimina un pais. Falla con 409 si hay folders asignados (proteccion de integridad).","operationId":"delete_country_api_countries__code__delete","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/countries/{code}/enable":{"patch":{"tags":["countries"],"summary":"Enable Country","description":"Habilita un pais en el selector.","operationId":"enable_country_api_countries__code__enable_patch","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/countries/{code}/disable":{"patch":{"tags":["countries"],"summary":"Disable Country","description":"Deshabilita un pais (no se mostrara en selectores nuevos pero los folders existentes mantienen su asignacion).","operationId":"disable_country_api_countries__code__disable_patch","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nodes":{"get":{"tags":["nodes"],"summary":"List Nodes","description":"Lista todos los nodos (master incluido).","operationId":"list_nodes_api_nodes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NodeOut"},"type":"array","title":"Response List Nodes Api Nodes Get"}}}}}},"post":{"tags":["nodes"],"summary":"Create Node","description":"Admin crea un slot de nodo (con install_token). Devuelve el one-liner\ncurl que se debe pegar en el nodo nuevo para auto-registrarlo.\n\nSi data.host viene vacio, el host se completara cuando el nodo se registre.","operationId":"create_node_api_nodes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nodes/{node_id}":{"get":{"tags":["nodes"],"summary":"Get Node","operationId":"get_node_api_nodes__node_id__get","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["nodes"],"summary":"Update Node","operationId":"update_node_api_nodes__node_id__patch","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["nodes"],"summary":"Delete Node","operationId":"delete_node_api_nodes__node_id__delete","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nodes/_register":{"post":{"tags":["nodes"],"summary":"Register Node","description":"Endpoint llamado por el SCRIPT INSTALADOR desde el nodo nuevo.\nValida el install_token, completa la info hardware del nodo, marca\ncomo registered y devuelve el api_token permanente.","operationId":"register_node_api_nodes__register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeRegister"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nodes/{node_id}/healthcheck":{"post":{"tags":["nodes"],"summary":"Trigger Healthcheck","description":"Forzar healthcheck inmediato (devuelve metricas frescas).","operationId":"trigger_healthcheck_api_nodes__node_id__healthcheck_post","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nodes/{node_id}/metrics":{"get":{"tags":["nodes"],"summary":"Get Node Metrics","description":"Historico de metricas (ultimas N horas, por defecto 1h).","operationId":"get_node_metrics_api_nodes__node_id__metrics_get","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nodes/_route/{channel_id}":{"get":{"tags":["nodes"],"summary":"Route Channel","description":"Devuelve el mejor nodo para servir un canal concreto.\nEl cliente VLC pide al master, el master responde con la URL del nodo elegido.","operationId":"route_channel_api_nodes__route__channel_id__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ssl/status":{"get":{"tags":["ssl"],"summary":"Ssl Status","description":"Returns current SSL/cert/nginx status.","operationId":"ssl_status_api_ssl_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ssl/setup":{"post":{"tags":["ssl"],"summary":"Ssl Setup","description":"Full SSL setup:\n1. Install nginx + certbot if missing\n2. Obtain Let's Encrypt certificate\n3. Write nginx config\n4. Enable auto-renew","operationId":"ssl_setup_api_ssl_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSLSetupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ssl/renew":{"post":{"tags":["ssl"],"summary":"Ssl Renew","description":"Force certbot renew + nginx reload.","operationId":"ssl_renew_api_ssl_renew_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/captcha-config":{"get":{"tags":["auth"],"summary":"Captcha Config","description":"Returns captcha provider + site key (public — no auth required).","operationId":"captcha_config_api_auth_captcha_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Autentica con username + password (+ TOTP si 2FA activo). Devuelve JWT.","operationId":"login_api_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/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Whoami","operationId":"whoami_api_auth_me_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","operationId":"change_password_api_auth_change_password_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/ChangePasswordRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/security-settings":{"get":{"tags":["auth"],"summary":"Get Security Settings","operationId":"get_security_settings_api_auth_security_settings_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["auth"],"summary":"Save Security Settings","operationId":"save_security_settings_api_auth_security_settings_put","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/SecuritySettingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/unlock-user/{user_id}":{"post":{"tags":["auth"],"summary":"Unlock User","description":"Admin: manually unlock a locked user account.","operationId":"unlock_user_api_auth_unlock_user__user_id__post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/setup":{"post":{"tags":["auth"],"summary":"Otp Setup","operationId":"otp_setup_api_auth_2fa_setup_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/verify":{"post":{"tags":["auth"],"summary":"Otp Verify And Enable","operationId":"otp_verify_and_enable_api_auth_2fa_verify_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/OtpVerify"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/disable":{"post":{"tags":["auth"],"summary":"Otp Disable","operationId":"otp_disable_api_auth_2fa_disable_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/OtpDisable"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/activity":{"get":{"tags":["auth"],"summary":"List Activity","operationId":"list_activity_api_auth_activity_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"action_filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Action Filter"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles":{"get":{"tags":["management"],"summary":"List Roles","description":"List all role templates (defaults). Visible to anyone authenticated.","operationId":"list_roles_api_management_roles_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":{"type":"array","items":{"$ref":"#/components/schemas/RoleTemplateOut"},"title":"Response List Roles Api Management Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/instance":{"get":{"tags":["management"],"summary":"Get Instance","operationId":"get_instance_api_management_instance_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/users":{"get":{"tags":["management"],"summary":"List Users","description":"List users visible to the actor's hierarchy.","operationId":"list_users_api_management_users_get","parameters":[{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"parent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["management"],"summary":"Create User","description":"Create a user as a descendant of the actor. The new user's role must be strictly below actor's.","operationId":"create_user_api_management_users_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/UserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/users/{user_id}":{"get":{"tags":["management"],"summary":"Get User","operationId":"get_user_api_management_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["management"],"summary":"Update User","operationId":"update_user_api_management_users__user_id__put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User 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/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["management"],"summary":"Delete User","operationId":"delete_user_api_management_users__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/users/{user_id}/permissions":{"get":{"tags":["management"],"summary":"Get User Permissions","operationId":"get_user_permissions_api_management_users__user_id__permissions_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/audit":{"get":{"tags":["management"],"summary":"List Audit","operationId":"list_audit_api_management_audit_get","parameters":[{"name":"target","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"}},{"name":"actor_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/bulk/dry-run":{"post":{"tags":["management"],"summary":"Bulk Dry Run","description":"Preview a bulk action. Returns which targets are allowed vs blocked + reasons.\nNo state change. The user calls /bulk/execute with the same payload to apply.","operationId":"bulk_dry_run_api_management_bulk_dry_run_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/BulkActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/bulk/execute":{"post":{"tags":["management"],"summary":"Bulk Execute","description":"Execute the bulk action (after dry-run). Subset of actions implemented now:\n  - bulk_suspend_users\n  - bulk_unsuspend_users\n  - bulk_enable_users\n  - bulk_disable_users\nOther actions (delete, force password reset, etc.) return 501 for FASE 33-C.","operationId":"bulk_execute_api_management_bulk_execute_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/BulkActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/hierarchy/tree":{"get":{"tags":["management"],"summary":"Hierarchy Tree","description":"Return the visible hierarchy as a tree rooted at the actor (or all instances for system).","operationId":"hierarchy_tree_api_management_hierarchy_tree_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/fail2ban/status":{"get":{"tags":["security"],"summary":"Fail2Ban Status","description":"Return overall fail2ban state: installed? active? version? jails count?","operationId":"fail2ban_status_api_security_fail2ban_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/fail2ban/install":{"post":{"tags":["security"],"summary":"Fail2Ban Install","description":"Install fail2ban via apt-get. Long-running operation — kicked off in background.\nSubsequent polls of /fail2ban/status will show install_running=True until done.","operationId":"fail2ban_install_api_security_fail2ban_install_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/fail2ban/install/log":{"get":{"tags":["security"],"summary":"Fail2Ban Install Log","description":"Return the install log output (for streaming display in the UI).","operationId":"fail2ban_install_log_api_security_fail2ban_install_log_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/fail2ban/jails":{"get":{"tags":["security"],"summary":"Fail2Ban Jails","description":"Return all jails with per-jail stats.","operationId":"fail2ban_jails_api_security_fail2ban_jails_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/fail2ban/jail/{name}":{"get":{"tags":["security"],"summary":"Fail2Ban Jail Detail","operationId":"fail2ban_jail_detail_api_security_fail2ban_jail__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/fail2ban/banned":{"get":{"tags":["security"],"summary":"Fail2Ban Banned","description":"Aggregate of all currently-banned IPs across all jails.","operationId":"fail2ban_banned_api_security_fail2ban_banned_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/fail2ban/ban":{"post":{"tags":["security"],"summary":"Fail2Ban Ban","operationId":"fail2ban_ban_api_security_fail2ban_ban_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/fail2ban/unban":{"post":{"tags":["security"],"summary":"Fail2Ban Unban","operationId":"fail2ban_unban_api_security_fail2ban_unban_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnbanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/fail2ban/service/{action}":{"post":{"tags":["security"],"summary":"Fail2Ban Service","operationId":"fail2ban_service_api_security_fail2ban_service__action__post","parameters":[{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/fail2ban/config":{"get":{"tags":["security"],"summary":"Fail2Ban Config Read","description":"Read /etc/fail2ban/jail.local (or jail.conf as fallback).","operationId":"fail2ban_config_read_api_security_fail2ban_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["security"],"summary":"Fail2Ban Config Write","description":"Write /etc/fail2ban/jail.local then reload. Backs up the previous file.","operationId":"fail2ban_config_write_api_security_fail2ban_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigWriteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/fail2ban/recent-attempts":{"get":{"tags":["security"],"summary":"Fail2Ban Recent Attempts","description":"Parse the last N failed-SSH events from /var/log/auth.log.\nUseful even when fail2ban is not installed — shows what IPs are attacking.","operationId":"fail2ban_recent_attempts_api_security_fail2ban_recent_attempts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/fail2ban/presets":{"get":{"tags":["security"],"summary":"Fail2Ban Presets","description":"Curated jail presets ready to apply.","operationId":"fail2ban_presets_api_security_fail2ban_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/fail2ban/apply-preset/{preset_id}":{"post":{"tags":["security"],"summary":"Fail2Ban Apply Preset","description":"Append a preset to /etc/fail2ban/jail.local (creating it if needed) +\nwrite the custom filter if one is included. Then reload fail2ban.","operationId":"fail2ban_apply_preset_api_security_fail2ban_apply_preset__preset_id__post","parameters":[{"name":"preset_id","in":"path","required":true,"schema":{"type":"string","title":"Preset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/ssh/audit":{"get":{"tags":["security"],"summary":"Ssh Audit","operationId":"ssh_audit_api_security_ssh_audit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ssh/disable-root":{"post":{"tags":["security"],"summary":"Ssh Disable Root","operationId":"ssh_disable_root_api_security_ssh_disable_root_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ssh/disable-password":{"post":{"tags":["security"],"summary":"Ssh Disable Password","operationId":"ssh_disable_password_api_security_ssh_disable_password_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ssh/set":{"post":{"tags":["security"],"summary":"Ssh Set","operationId":"ssh_set_api_security_ssh_set_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SshSettingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/firewall/status":{"get":{"tags":["security"],"summary":"Firewall Status","operationId":"firewall_status_api_security_firewall_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/firewall/recommended":{"get":{"tags":["security"],"summary":"Firewall Recommended","operationId":"firewall_recommended_api_security_firewall_recommended_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/firewall/action":{"post":{"tags":["security"],"summary":"Firewall Action","operationId":"firewall_action_api_security_firewall_action_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UfwActionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/firewall/rule":{"post":{"tags":["security"],"summary":"Firewall Rule","operationId":"firewall_rule_api_security_firewall_rule_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UfwRuleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/tls/certificates":{"get":{"tags":["security"],"summary":"Tls Certificates","description":"List Let's Encrypt certificates + expiry info.","operationId":"tls_certificates_api_security_tls_certificates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/system/updates":{"get":{"tags":["security"],"summary":"System Updates","description":"Count of pending apt updates + security updates.","operationId":"system_updates_api_security_system_updates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/system/listening":{"get":{"tags":["security"],"summary":"System Listening","description":"List of listening TCP ports with associated process.","operationId":"system_listening_api_security_system_listening_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/headers/analyze":{"get":{"tags":["security"],"summary":"Headers Analyze","description":"Fetch a URL (default: this server's root) and analyze security headers.","operationId":"headers_analyze_api_security_headers_analyze_get","parameters":[{"name":"url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit":{"get":{"tags":["security"],"summary":"Comprehensive Audit","description":"Run all security checks and return a consolidated report with score.","operationId":"comprehensive_audit_api_security_audit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/headers/templates":{"get":{"tags":["security"],"summary":"Headers Templates","operationId":"headers_templates_api_security_headers_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/headers/current-config":{"get":{"tags":["security"],"summary":"Headers Current Config","description":"Return current state of the security headers snippet + which sites include it.","operationId":"headers_current_config_api_security_headers_current_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/headers/apply":{"post":{"tags":["security"],"summary":"Headers Apply","description":"Write the security headers snippet + optionally include it in the active site.\nValidates with `nginx -t` before reloading. Reverts on validation failure.","operationId":"headers_apply_api_security_headers_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyHeadersRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/headers/remove":{"post":{"tags":["security"],"summary":"Headers Remove","description":"Remove the headers snippet + remove includes from site configs. Reload nginx.","operationId":"headers_remove_api_security_headers_remove_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/backups/list":{"get":{"tags":["security"],"summary":"Backups List","description":"List all backup files with metadata.","operationId":"backups_list_api_security_backups_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/backups/trigger":{"post":{"tags":["security"],"summary":"Backups Trigger","description":"Manually trigger a database backup using SQLite's VACUUM INTO (consistent copy).\nMore reliable than file copy because SQLite WAL state is preserved.","operationId":"backups_trigger_api_security_backups_trigger_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/backups/delete":{"post":{"tags":["security"],"summary":"Backups Delete","operationId":"backups_delete_api_security_backups_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/backups/download/{filename}":{"get":{"tags":["security"],"summary":"Backups Download","description":"Return the backup file path for download (frontend will use fetch + blob).","operationId":"backups_download_api_security_backups_download__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/backups/cleanup":{"post":{"tags":["security"],"summary":"Backups Cleanup","description":"Keep only the N most recent backups. Deletes older ones.","operationId":"backups_cleanup_api_security_backups_cleanup_post","parameters":[{"name":"keep","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Keep"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/backups/restore":{"post":{"tags":["security"],"summary":"Backups Restore","description":"Restore a backup. CAUTION: replaces the current DB. Creates a safety snapshot first.","operationId":"backups_restore_api_security_backups_restore_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupRestoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/sessions/recent-logins":{"get":{"tags":["security"],"summary":"Sessions Recent Logins","description":"Return recent login attempts (success + failed) from activity_log.\nDefault: last 7 days.","operationId":"sessions_recent_logins_api_security_sessions_recent_logins_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":168,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/sessions/login-aggregations":{"get":{"tags":["security"],"summary":"Sessions Login Aggregations","description":"Aggregate login data: by user, by IP, failed-by-IP (potential attackers).","operationId":"sessions_login_aggregations_api_security_sessions_login_aggregations_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":168,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/sessions/active-ssh":{"get":{"tags":["security"],"summary":"Sessions Active Ssh","description":"Active SSH sessions parsed from `who` + `last` output.","operationId":"sessions_active_ssh_api_security_sessions_active_ssh_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/sessions/workers":{"get":{"tags":["security"],"summary":"Sessions Workers","description":"List active backend worker processes.","operationId":"sessions_workers_api_security_sessions_workers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/sessions/disable-user":{"post":{"tags":["security"],"summary":"Sessions Disable User","description":"Disable a user — next request with their token will fail (User disabled or not found).","operationId":"sessions_disable_user_api_security_sessions_disable_user_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableUserRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/sessions/rotate-jwt-secret":{"post":{"tags":["security"],"summary":"Sessions Rotate Jwt","description":"REGENERATE the JWT secret. This invalidates ALL existing tokens (forces everyone to re-login).\nRequires backend restart for the new secret to take effect.","operationId":"sessions_rotate_jwt_api_security_sessions_rotate_jwt_secret_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ratelimit/templates":{"get":{"tags":["security"],"summary":"Ratelimit Templates","operationId":"ratelimit_templates_api_security_ratelimit_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ratelimit/status":{"get":{"tags":["security"],"summary":"Ratelimit Status","description":"Check if rate-limit snippet is installed + active.","operationId":"ratelimit_status_api_security_ratelimit_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ratelimit/apply":{"post":{"tags":["security"],"summary":"Ratelimit Apply","description":"Write the rate-limit snippets + include in main site server block. Validate + reload.","operationId":"ratelimit_apply_api_security_ratelimit_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRateLimitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/ratelimit/remove":{"post":{"tags":["security"],"summary":"Ratelimit Remove","description":"Remove rate-limit snippets + include from main site. Reload nginx.","operationId":"ratelimit_remove_api_security_ratelimit_remove_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ratelimit/recent-429":{"get":{"tags":["security"],"summary":"Ratelimit Recent 429","description":"Tail nginx access log looking for 429 responses (rate-limited).","operationId":"ratelimit_recent_429_api_security_ratelimit_recent_429_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/activity":{"get":{"tags":["security"],"summary":"Audit Log Activity","description":"Filtered list of activity_log entries.\nFilters:\n  user: substring match against username\n  action: substring match (e.g. 'login' or 'login.success')\n  success: 'true'|'false' string\n  ip: exact match against ip_address\n  search: substring against details + username + action\n  since/until: ISO datetime strings\n  limit: max rows (capped at 1000)\n  offset: pagination offset","operationId":"audit_log_activity_api_security_audit_log_activity_get","parameters":[{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success"}},{"name":"ip","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/permissions":{"get":{"tags":["security"],"summary":"Audit Log Permissions","description":"Filtered list of permission_audit entries.","operationId":"audit_log_permissions_api_security_audit_log_permissions_get","parameters":[{"name":"actor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor"}},{"name":"target","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/stats":{"get":{"tags":["security"],"summary":"Audit Log Stats","description":"Aggregations: events per day, top users, top actions, success/fail ratio.","operationId":"audit_log_stats_api_security_audit_log_stats_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":168,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/export.csv":{"get":{"tags":["security"],"summary":"Audit Log Export","description":"Export activity_log as CSV (max 10000 rows).","operationId":"audit_log_export_api_security_audit_log_export_csv_get","parameters":[{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/config":{"get":{"tags":["security"],"summary":"Notifications Config","description":"Current notification config (channels + rules) + catalog of available events.","operationId":"notifications_config_api_security_notifications_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["security"],"summary":"Notifications Save","description":"Save the full notification config. Sensitive fields with '***' value are preserved from current config.","operationId":"notifications_save_api_security_notifications_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/test":{"post":{"tags":["security"],"summary":"Notifications Test","description":"Send a test notification through the specified channel.","operationId":"notifications_test_api_security_notifications_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestNotificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/trigger-event":{"post":{"tags":["security"],"summary":"Notifications Trigger Event","description":"Manually trigger an event — sends to all channels bound to this event key via rules.","operationId":"notifications_trigger_event_api_security_notifications_trigger_event_post","parameters":[{"name":"event_key","in":"query","required":true,"schema":{"type":"string","title":"Event Key"}},{"name":"message","in":"query","required":false,"schema":{"type":"string","default":"Test trigger","title":"Message"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/event/{event_id}":{"get":{"tags":["security"],"summary":"Audit Log Event Detail","description":"Full detail of a single activity_log row.","operationId":"audit_log_event_detail_api_security_audit_log_event__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/user-history":{"get":{"tags":["security"],"summary":"Audit Log User History","description":"Compact history for a user: timeline + IPs used + actions count.","operationId":"audit_log_user_history_api_security_audit_log_user_history_get","parameters":[{"name":"username","in":"query","required":true,"schema":{"type":"string","title":"Username"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/suspicious":{"get":{"tags":["security"],"summary":"Audit Log Suspicious","description":"Auto-detect suspicious patterns: brute-force IPs, multi-IP users, off-hours logins, dormant-user activity.","operationId":"audit_log_suspicious_api_security_audit_log_suspicious_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/audit-log/ban-ip":{"post":{"tags":["security"],"summary":"Audit Log Ban Ip","description":"Ban an IP via fail2ban-client. Falls back to UFW if fail2ban not present.","operationId":"audit_log_ban_ip_api_security_audit_log_ban_ip_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BanIpPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/delivery-log":{"get":{"tags":["security"],"summary":"Notifications Delivery Log","description":"Recent notification deliveries (success + failures).","operationId":"notifications_delivery_log_api_security_notifications_delivery_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["security"],"summary":"Notifications Delivery Log Clear","description":"Clear the delivery log.","operationId":"notifications_delivery_log_clear_api_security_notifications_delivery_log_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/notifications/telegram/validate":{"post":{"tags":["security"],"summary":"Notifications Telegram Validate","description":"Validate a Telegram bot_token by calling /getMe.","operationId":"notifications_telegram_validate_api_security_notifications_telegram_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramValidatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/telegram/get-chat-id":{"post":{"tags":["security"],"summary":"Notifications Telegram Get Chat Id","description":"Call /getUpdates to retrieve recent chat IDs that have messaged this bot.","operationId":"notifications_telegram_get_chat_id_api_security_notifications_telegram_get_chat_id_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramValidatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/test-all":{"post":{"tags":["security"],"summary":"Notifications Test All","description":"Send a test message to ALL enabled channels.","operationId":"notifications_test_all_api_security_notifications_test_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/notifications/channels/bulk-enable":{"post":{"tags":["security"],"summary":"Notifications Bulk Enable","description":"Enable or disable multiple channels at once.","operationId":"notifications_bulk_enable_api_security_notifications_channels_bulk_enable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkEnablePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/options":{"get":{"tags":["security"],"summary":"Notifications Options Get","operationId":"notifications_options_get_api_security_notifications_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["security"],"summary":"Notifications Options Save","operationId":"notifications_options_save_api_security_notifications_options_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifOptions"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/notifications/preview":{"post":{"tags":["security"],"summary":"Notifications Preview","description":"Render a template with sample variables.","operationId":"notifications_preview_api_security_notifications_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/hardening/apply-all":{"post":{"tags":["security"],"summary":"Hardening Apply All","description":"Aplica TODOS los fixes auto-resolubles de SSH en cadena, con backup único.","operationId":"hardening_apply_all_api_security_hardening_apply_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/hardening/backups":{"get":{"tags":["security"],"summary":"Hardening List Backups","description":"Lista todos los backups históricos de sshd_config.","operationId":"hardening_list_backups_api_security_hardening_backups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/hardening/restore-backup":{"post":{"tags":["security"],"summary":"Hardening Restore Backup","description":"Restaura un backup concreto de sshd_config (verifica que es válido antes).","operationId":"hardening_restore_backup_api_security_hardening_restore_backup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HardeningRestorePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/hardening/key-status":{"get":{"tags":["security"],"summary":"Hardening Key Status","description":"Lista claves SSH autorizadas en /root/.ssh/authorized_keys para validar antes de deshabilitar password auth.","operationId":"hardening_key_status_api_security_hardening_key_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/firewall/presets":{"get":{"tags":["security"],"summary":"Firewall Presets","operationId":"firewall_presets_api_security_firewall_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/firewall/apply-preset":{"post":{"tags":["security"],"summary":"Firewall Apply Preset","operationId":"firewall_apply_preset_api_security_firewall_apply_preset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirewallPresetApplyPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/firewall/test-port":{"post":{"tags":["security"],"summary":"Firewall Test Port","description":"Verifica si un puerto está escuchando localmente (no testa exterior — eso necesita servicio externo).","operationId":"firewall_test_port_api_security_firewall_test_port_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortTestPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/firewall/rule/{rule_num}":{"delete":{"tags":["security"],"summary":"Firewall Delete Rule","description":"Elimina una regla UFW por número.","operationId":"firewall_delete_rule_api_security_firewall_rule__rule_num__delete","parameters":[{"name":"rule_num","in":"path","required":true,"schema":{"type":"integer","title":"Rule Num"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/firewall/reset":{"post":{"tags":["security"],"summary":"Firewall Reset","description":"RESET completo de UFW. Requiere confirmación en frontend.","operationId":"firewall_reset_api_security_firewall_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/tls/renew":{"post":{"tags":["security"],"summary":"Tls Renew","description":"Renueva certificados Let's Encrypt vía certbot.","operationId":"tls_renew_api_security_tls_renew_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/tls/renew/dry-run":{"post":{"tags":["security"],"summary":"Tls Renew Dry Run","description":"Simula la renovación sin tocar nada.","operationId":"tls_renew_dry_run_api_security_tls_renew_dry_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/tls/nginx-config":{"get":{"tags":["security"],"summary":"Tls Nginx Config","description":"Inspecciona la config nginx en busca de HSTS, force HTTPS, cipher suites, protocolos.","operationId":"tls_nginx_config_api_security_tls_nginx_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/tls/enable-hsts":{"post":{"tags":["security"],"summary":"Tls Enable Hsts","description":"Añade HSTS al server block del default site si no está.","operationId":"tls_enable_hsts_api_security_tls_enable_hsts_post","parameters":[{"name":"max_age","in":"query","required":false,"schema":{"type":"integer","default":31536000,"title":"Max Age"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/backups/retention":{"get":{"tags":["security"],"summary":"Backups Retention","operationId":"backups_retention_api_security_backups_retention_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["security"],"summary":"Backups Retention Set","operationId":"backups_retention_set_api_security_backups_retention_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupRetentionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/backups/stats":{"get":{"tags":["security"],"summary":"Backups Stats","description":"Stats agregados: cantidad, tamaño total, más antiguo, más reciente.","operationId":"backups_stats_api_security_backups_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/sessions/kill-ssh/{pid}":{"post":{"tags":["security"],"summary":"Sessions Kill Ssh","description":"Mata una sesión SSH activa por PID.","operationId":"sessions_kill_ssh_api_security_sessions_kill_ssh__pid__post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/sessions/active-users":{"get":{"tags":["security"],"summary":"Sessions Active Users","description":"Lista usuarios JWT activos basándose en activity_log reciente.","operationId":"sessions_active_users_api_security_sessions_active_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security/ratelimit/test":{"post":{"tags":["security"],"summary":"Ratelimit Test","description":"Hace N peticiones GET a un endpoint para ver cuántas reciben 429.","operationId":"ratelimit_test_api_security_ratelimit_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitTestPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/recover":{"post":{"tags":["auth-recovery"],"summary":"Recover Access","description":"Fallback de emergencia.\n- Si ya hay un System user: opcionalmente reset password (si new_password viene)\n  y emite JWT.\n- Si NO hay System user: crea uno nuevo con username (o \"recovery_<8hex>\")\n  y new_password obligatorio.\nRate-limit: 3 intentos por IP por 10 min.","operationId":"recover_access_api_auth_recover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/promote-to-system":{"post":{"tags":["auth-recovery"],"summary":"Promote To System","description":"Promueve un usuario existente a System usando recovery_key.\nSolo si NO hay ningun System ya. Si lo hay, usar UI normal.","operationId":"promote_to_system_api_auth_promote_to_system_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/PromoteToSystemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/system-status":{"get":{"tags":["auth-recovery"],"summary":"System Status","description":"Devuelve si existe ya un System en BD. Util para mostrar el banner UI.","operationId":"system_status_api_auth_system_status_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/impersonate":{"post":{"tags":["management-extras"],"summary":"Impersonate","description":"Emite JWT efimero (5min) actuando como otro usuario.\nReglas:\n  - target debe estar en la jerarquia del actor (o actor es System)\n  - target.is_system → solo otro System puede impersonar\n  - reason obligatorio (auditado)","operationId":"impersonate_api_management_impersonate_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/ImpersonateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/whoami-acting":{"get":{"tags":["management-extras"],"summary":"Whoami Acting","description":"Devuelve si el JWT actual es impersonacion + info de actor real.","operationId":"whoami_acting_api_management_whoami_acting_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/bulk/execute-extra":{"post":{"tags":["management-extras"],"summary":"Bulk Execute Extra","description":"Acciones masivas anadidas en FASE 33-C. La accion 'bulk_suspend_users' y\nafines siguen pasando por /bulk/execute original.","operationId":"bulk_execute_extra_api_management_bulk_execute_extra_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/BulkExtraRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/security/recovery-key":{"get":{"tags":["management-extras"],"summary":"Get Recovery Key Hint","operationId":"get_recovery_key_hint_api_management_security_recovery_key_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/security/regenerate-recovery-key":{"post":{"tags":["management-extras"],"summary":"Regenerate Recovery Key","operationId":"regenerate_recovery_key_api_management_security_regenerate_recovery_key_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roadmap-status":{"get":{"tags":["management-extras"],"summary":"Roadmap Status","description":"Estado del roadmap FASE 33-C. Todo done tras polish.","operationId":"roadmap_status_api_management_roadmap_status_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/templates":{"get":{"tags":["management-full"],"summary":"List Templates","operationId":"list_templates_api_management_templates_get","parameters":[{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["management-full"],"summary":"Create Template","operationId":"create_template_api_management_templates_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/TemplateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/templates/{tid}":{"get":{"tags":["management-full"],"summary":"Get Template","operationId":"get_template_api_management_templates__tid__get","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["management-full"],"summary":"Update Template","operationId":"update_template_api_management_templates__tid__put","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["management-full"],"summary":"Delete Template","operationId":"delete_template_api_management_templates__tid__delete","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/templates/{tid}/apply":{"post":{"tags":["management-full"],"summary":"Apply Template","operationId":"apply_template_api_management_templates__tid__apply_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateApplyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/license-features":{"get":{"tags":["management-full"],"summary":"List License Features","operationId":"list_license_features_api_management_license_features_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/license-features/{key}":{"put":{"tags":["management-full"],"summary":"Set License Feature","operationId":"set_license_feature_api_management_license_features__key__put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseFeatureBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/support-webhook":{"get":{"tags":["management-full"],"summary":"Get Webhook","operationId":"get_webhook_api_management_support_webhook_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["management-full"],"summary":"Set Webhook","operationId":"set_webhook_api_management_support_webhook_put","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/WebhookBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/users/{user_id}/move-to-parent":{"post":{"tags":["management-full"],"summary":"Move User","operationId":"move_user_api_management_users__user_id__move_to_parent_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User 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/MoveParentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/users/{user_id}/regenerate-password":{"post":{"tags":["management-full"],"summary":"Regenerate Password","operationId":"regenerate_password_api_management_users__user_id__regenerate_password_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/bulk/execute-extra2":{"post":{"tags":["management-full"],"summary":"Bulk Execute Extra2","operationId":"bulk_execute_extra2_api_management_bulk_execute_extra2_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/BulkExtra2Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/packages":{"get":{"tags":["management-full"],"summary":"List Packages","operationId":"list_packages_api_management_packages_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["management-full"],"summary":"Create Package","operationId":"create_package_api_management_packages_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/PackageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/packages/{pkg_id}":{"get":{"tags":["management-full"],"summary":"Get Package","operationId":"get_package_api_management_packages__pkg_id__get","parameters":[{"name":"pkg_id","in":"path","required":true,"schema":{"type":"string","title":"Pkg Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["management-full"],"summary":"Update Package","operationId":"update_package_api_management_packages__pkg_id__put","parameters":[{"name":"pkg_id","in":"path","required":true,"schema":{"type":"string","title":"Pkg 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/PackageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["management-full"],"summary":"Delete Package","operationId":"delete_package_api_management_packages__pkg_id__delete","parameters":[{"name":"pkg_id","in":"path","required":true,"schema":{"type":"string","title":"Pkg Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/panel/login":{"post":{"tags":["management-full"],"summary":"Panel Login","description":"Login for reseller sub-panel. Requires username, password, and panel_slug.","operationId":"panel_login_api_management_panel_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/management/panel/{slug}/info":{"get":{"tags":["management-full"],"summary":"Panel Info","description":"Get public info about a reseller panel (for login page branding).","operationId":"panel_info_api_management_panel__slug__info_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/panel/{slug}/dashboard":{"get":{"tags":["management-full"],"summary":"Panel Dashboard","description":"Get dashboard data for the reseller sub-panel.","operationId":"panel_dashboard_api_management_panel__slug__dashboard_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/force-password-change":{"post":{"tags":["auth-extras"],"summary":"Force Password Change","description":"Endpoint para que un usuario con must_change_password=1 cambie su pwd sin\nproporcionar el current_password. Solo valido si la flag esta activa.","operationId":"force_password_change_api_auth_force_password_change_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/ForcePwdBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles/catalog":{"get":{"tags":["roles-catalog"],"summary":"Get Catalog","description":"Catalogo canonico. Cualquier autenticado puede leerlo.","operationId":"get_catalog_api_management_roles_catalog_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles/{role}/detail":{"get":{"tags":["roles-catalog"],"summary":"Get Role Detail","description":"Devuelve el role template con stats: cuantos users actuales tiene este rol\nen la instancia del actor, distribucion de overrides, etc.","operationId":"get_role_detail_api_management_roles__role__detail_get","parameters":[{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles/{role}":{"put":{"tags":["roles-catalog"],"summary":"Update Role Template","description":"Actualiza el template. System siempre. Admin solo en roles inferiores al suyo.","operationId":"update_role_template_api_management_roles__role__put","parameters":[{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles/{role}/restore":{"post":{"tags":["roles-catalog"],"summary":"Restore Role Factory","description":"Restaura factory defaults. Solo System (cualquier rol). Admin no — para evitar\nque un Admin sobreescriba un template editado por System.","operationId":"restore_role_factory_api_management_roles__role__restore_post","parameters":[{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles/{role}/users":{"get":{"tags":["roles-catalog"],"summary":"List Users With Role","description":"Lista usuarios con ese rol. Admin solo ve su instancia. Reseller+/Manager+\nsolo ven sus descendientes con ese rol.","operationId":"list_users_with_role_api_management_roles__role__users_get","parameters":[{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles/{role}/propagate":{"post":{"tags":["roles-catalog"],"summary":"Propagate Template To Users","description":"Aplica el template actual del rol a todos los usuarios visibles con ese rol.\nPor defecto (overwrite=False) hace merge no destructivo: anade claves que falten\nsin pisar overrides existentes del usuario.\nCon overwrite=True borra todos los overrides custom y deja al usuario igual al\ntemplate factory.","operationId":"propagate_template_to_users_api_management_roles__role__propagate_post","parameters":[{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropagateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/management/roles/comparison":{"get":{"tags":["roles-catalog"],"summary":"Compare Roles","description":"Matriz comparativa. ?roles=admin,manager,reseller para filtrar.","operationId":"compare_roles_api_management_roles_comparison_get","parameters":[{"name":"roles","in":"query","required":false,"schema":{"type":"string","default":"system,admin,manager,submanager,reseller,subreseller,client","title":"Roles"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets":{"get":{"tags":["tickets"],"summary":"List Tickets","description":"Lista tickets — admin ve todos, user/reseller solo los suyos.","operationId":"list_tickets_api_tickets_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tickets"],"summary":"Create Ticket","description":"Crear ticket nuevo (con su primer mensaje).","operationId":"create_ticket_api_tickets_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/TicketCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}":{"get":{"tags":["tickets"],"summary":"Get Ticket","description":"Ticket completo con todas las replies.","operationId":"get_ticket_api_tickets__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tickets"],"summary":"Update Status","operationId":"update_status_api_tickets__ticket_id__patch","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket 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/TicketStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tickets"],"summary":"Delete Ticket","description":"Solo admin puede borrar tickets (auditoría).","operationId":"delete_ticket_api_tickets__ticket_id__delete","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/replies":{"post":{"tags":["tickets"],"summary":"Add Reply","operationId":"add_reply_api_tickets__ticket_id__replies_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket 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/ReplyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/_stats/summary":{"get":{"tags":["tickets"],"summary":"Stats Summary","description":"Resumen para dashboard: cuántos abiertos/in-progress/cerrados, no leidos por rol.","operationId":"stats_summary_api_tickets__stats_summary_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bouquets":{"get":{"tags":["bouquets"],"summary":"List Bouquets","description":"Lista bouquets visibles al user:\n- admin ve todos\n- resellers/users ven los suyos + los is_public=true\nonly_mine=true = solo los del usuario actual","operationId":"list_bouquets_api_bouquets_get","parameters":[{"name":"only_mine","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Mine"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["bouquets"],"summary":"Create Bouquet","operationId":"create_bouquet_api_bouquets_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/BouquetCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bouquets/{bouquet_id}":{"get":{"tags":["bouquets"],"summary":"Get Bouquet","operationId":"get_bouquet_api_bouquets__bouquet_id__get","parameters":[{"name":"bouquet_id","in":"path","required":true,"schema":{"type":"string","title":"Bouquet Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["bouquets"],"summary":"Update Bouquet","operationId":"update_bouquet_api_bouquets__bouquet_id__patch","parameters":[{"name":"bouquet_id","in":"path","required":true,"schema":{"type":"string","title":"Bouquet 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/BouquetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bouquets"],"summary":"Delete Bouquet","operationId":"delete_bouquet_api_bouquets__bouquet_id__delete","parameters":[{"name":"bouquet_id","in":"path","required":true,"schema":{"type":"string","title":"Bouquet Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bouquets/{bouquet_id}/channels":{"put":{"tags":["bouquets"],"summary":"Set Channels","description":"Reemplaza la lista de canales del bouquet (orden por posición en el array).","operationId":"set_channels_api_bouquets__bouquet_id__channels_put","parameters":[{"name":"bouquet_id","in":"path","required":true,"schema":{"type":"string","title":"Bouquet 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/BouquetChannelsAssign"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bouquets/{bouquet_id}/m3u":{"get":{"tags":["bouquets"],"summary":"Export M3U","description":"Exporta el bouquet como playlist M3U (compatible VLC/IPTV apps).","operationId":"export_m3u_api_bouquets__bouquet_id__m3u_get","parameters":[{"name":"bouquet_id","in":"path","required":true,"schema":{"type":"string","title":"Bouquet Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-rules":{"get":{"tags":["access-control"],"summary":"List Rules","operationId":"list_rules_api_access_rules_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["access-control"],"summary":"Create Rule","operationId":"create_rule_api_access_rules_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/AccessRuleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-rules/{rule_id}":{"put":{"tags":["access-control"],"summary":"Update Rule","operationId":"update_rule_api_access_rules__rule_id__put","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule 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/AccessRuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["access-control"],"summary":"Delete Rule","operationId":"delete_rule_api_access_rules__rule_id__delete","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-rules/stats":{"get":{"tags":["access-control"],"summary":"Get Stats","operationId":"get_stats_api_access_rules_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies-v2":{"get":{"tags":["proxies-v2"],"summary":"List Proxies V2","operationId":"list_proxies_v2_api_proxies_v2_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProxyV2Out"},"title":"Response List Proxies V2 Api Proxies V2 Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["proxies-v2"],"summary":"Create Proxy V2","operationId":"create_proxy_v2_api_proxies_v2_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyV2Create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyV2Out"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies-v2/{pid}":{"patch":{"tags":["proxies-v2"],"summary":"Update Proxy V2","operationId":"update_proxy_v2_api_proxies_v2__pid__patch","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyV2Update"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyV2Out"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["proxies-v2"],"summary":"Delete Proxy V2","operationId":"delete_proxy_v2_api_proxies_v2__pid__delete","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies-v2/import":{"post":{"tags":["proxies-v2"],"summary":"Import Proxies Bulk","description":"Mass import format:\nhost:port:user:pass        (optional user:pass)\nscheme://host:port\nscheme://user:pass@host:port\n# name comment lines apply to the next entry","operationId":"import_proxies_bulk_api_proxies_v2_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyImportResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies-v2/{pid}/test":{"post":{"tags":["proxies-v2"],"summary":"Test Proxy V2","operationId":"test_proxy_v2_api_proxies_v2__pid__test_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxies-v2/test-all":{"post":{"tags":["proxies-v2"],"summary":"Test All Proxies","operationId":"test_all_proxies_api_proxies_v2_test_all_post","parameters":[{"name":"only_enabled","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Only Enabled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcode-profiles":{"get":{"tags":["transcode-profiles"],"summary":"List Profiles","operationId":"list_profiles_api_transcode_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TranscodeProfileOut"},"type":"array","title":"Response List Profiles Api Transcode Profiles Get"}}}}}},"post":{"tags":["transcode-profiles"],"summary":"Create Profile","operationId":"create_profile_api_transcode_profiles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscodeProfileCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscodeProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcode-profiles/{pid}":{"patch":{"tags":["transcode-profiles"],"summary":"Update Profile","operationId":"update_profile_api_transcode_profiles__pid__patch","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscodeProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscodeProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["transcode-profiles"],"summary":"Delete Profile","operationId":"delete_profile_api_transcode_profiles__pid__delete","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcode-profiles/{pid}/clone":{"post":{"tags":["transcode-profiles"],"summary":"Clone Profile","operationId":"clone_profile_api_transcode_profiles__pid__clone_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscodeProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcode-profiles/presets":{"get":{"tags":["transcode-profiles"],"summary":"List Transcode Presets","description":"Expert-curated preset library. Frontend uses this to populate the\n'New from preset' picker. Presets are READ-ONLY templates — to use one,\nPOST /from-preset/{id} which clones into a real editable user profile.","operationId":"list_transcode_presets_api_transcode_profiles_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/transcode-profiles/from-preset/{preset_key}":{"post":{"tags":["transcode-profiles"],"summary":"Create From Preset","description":"Clone a preset as a new user profile (editable). Adds (preset) suffix to name\nto make it clear it's based on a template.","operationId":"create_from_preset_api_transcode_profiles_from_preset__preset_key__post","parameters":[{"name":"preset_key","in":"path","required":true,"schema":{"type":"string","title":"Preset Key"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscodeProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcode-profiles/ffmpeg-preview":{"post":{"tags":["transcode-profiles"],"summary":"Ffmpeg Preview","description":"Compute the ffmpeg command-line string from a profile config payload.\nUsed by the editor for live preview. Does NOT execute anything.","operationId":"ffmpeg_preview_api_transcode_profiles_ffmpeg_preview_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcode-profiles/{pid}/usage":{"get":{"tags":["transcode-profiles"],"summary":"Profile Usage","description":"Return channels that currently use this transcode profile.","operationId":"profile_usage_api_transcode_profiles__pid__usage_get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcode-profiles/{pid}/apply-to-channels":{"post":{"tags":["transcode-profiles"],"summary":"Apply Profile To Channels","description":"Bulk-assign this transcode profile to the given channels.","operationId":"apply_profile_to_channels_api_transcode_profiles__pid__apply_to_channels_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ApplyToChannelsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stream-imports":{"post":{"tags":["stream-imports"],"summary":"Start Stream Import","operationId":"start_stream_import_api_stream_imports_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamImportRunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["stream-imports"],"summary":"List Stream Imports","operationId":"list_stream_imports_api_stream_imports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreamImportRunOut"},"title":"Response List Stream Imports Api Stream Imports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stream-imports/{rid}":{"get":{"tags":["stream-imports"],"summary":"Get Stream Import","operationId":"get_stream_import_api_stream_imports__rid__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamImportRunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/streams/mass-edit":{"post":{"tags":["streams-extra"],"summary":"Mass Edit Channels","operationId":"mass_edit_channels_api_streams_mass_edit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MassEditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MassEditResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/streams/transfer":{"post":{"tags":["streams-extra"],"summary":"Transfer Streams","operationId":"transfer_streams_api_streams_transfer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamTransferRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs":{"get":{"tags":["rtmp-inputs"],"summary":"List Rtmp Inputs","operationId":"list_rtmp_inputs_api_rtmp_inputs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RTMPInputOut"},"type":"array","title":"Response List Rtmp Inputs Api Rtmp Inputs Get"}}}}}},"post":{"tags":["rtmp-inputs"],"summary":"Create Rtmp Input","operationId":"create_rtmp_input_api_rtmp_inputs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RTMPInputCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RTMPInputOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs/{rid}":{"patch":{"tags":["rtmp-inputs"],"summary":"Update Rtmp Input","operationId":"update_rtmp_input_api_rtmp_inputs__rid__patch","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RTMPInputUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RTMPInputOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["rtmp-inputs"],"summary":"Delete Rtmp Input","operationId":"delete_rtmp_input_api_rtmp_inputs__rid__delete","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs/services-catalog":{"get":{"tags":["rtmp-inputs"],"summary":"Rtmp Services Catalog","description":"OBS-derived catalog of major streaming services with their ingest URLs\nand recommended encoder settings. Used to pre-fill new inputs intelligently.","operationId":"rtmp_services_catalog_api_rtmp_inputs_services_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/rtmp-inputs/server-info":{"get":{"tags":["rtmp-inputs"],"summary":"Rtmp Server Info","description":"Return THIS server's RTMP ingestion details so OBS knows where to push.","operationId":"rtmp_server_info_api_rtmp_inputs_server_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/rtmp-inputs/{rid}/regenerate-key":{"post":{"tags":["rtmp-inputs"],"summary":"Regenerate Stream Key","description":"Regenerate the stream key (invalidates any active push using the old key).\nUseful if the key was leaked.","operationId":"regenerate_stream_key_api_rtmp_inputs__rid__regenerate_key_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RTMPInputOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs/{rid}/obs-snippet":{"get":{"tags":["rtmp-inputs"],"summary":"Rtmp Obs Snippet","description":"Ready-to-paste OBS configuration block + step-by-step setup guide.","operationId":"rtmp_obs_snippet_api_rtmp_inputs__rid__obs_snippet_get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs/{rid}/test-connect":{"post":{"tags":["rtmp-inputs"],"summary":"Rtmp Test Connect","description":"Return a one-liner ffmpeg command the user can run locally to verify the\ninput works. We don't execute it — we just return the command.","operationId":"rtmp_test_connect_api_rtmp_inputs__rid__test_connect_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs/{rid}/output-targets":{"post":{"tags":["rtmp-inputs"],"summary":"Add Output Target","description":"Add a multi-RTMP fan-out destination. The server will re-broadcast incoming\nstreams to all enabled output targets (inspired by sorayuki/obs-multi-rtmp).","operationId":"add_output_target_api_rtmp_inputs__rid__output_targets_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputTargetCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs/{rid}/output-targets/{idx}":{"delete":{"tags":["rtmp-inputs"],"summary":"Remove Output Target","operationId":"remove_output_target_api_rtmp_inputs__rid__output_targets__idx__delete","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rtmp-inputs/{rid}/stats":{"get":{"tags":["rtmp-inputs"],"summary":"Rtmp Input Stats","description":"Live stats for this RTMP input. If actively connected, returns current\nbitrate/fps/resolution/dropped frames. Otherwise returns last-known values.","operationId":"rtmp_input_stats_api_rtmp_inputs__rid__stats_get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stream-monitor/{channel_id}":{"get":{"tags":["stream-monitor"],"summary":"Get Monitor History","operationId":"get_monitor_history_api_stream_monitor__channel_id__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":1,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreamMonitorOut"},"title":"Response Get Monitor History Api Stream Monitor  Channel Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stream-monitor/_summary/active":{"get":{"tags":["stream-monitor"],"summary":"Monitor Summary Active","description":"One-row-per-channel, latest stream_monitor sample. Used by dashboard.\n\nFASE 22 — fix N+1 / full table scan (was 2.6M rows + N+1 lookup).\nUses single GROUP BY MAX(ts) to get latest sample per channel.","operationId":"monitor_summary_active_api_stream_monitor__summary_active_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal-proxies":{"get":{"tags":["internal-proxies"],"summary":"List Pools","operationId":"list_pools_api_internal_proxies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["internal-proxies"],"summary":"Create Pool","operationId":"create_pool_api_internal_proxies_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal-proxies/{pool_id}":{"patch":{"tags":["internal-proxies"],"summary":"Update Pool","operationId":"update_pool_api_internal_proxies__pool_id__patch","parameters":[{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["internal-proxies"],"summary":"Delete Pool","operationId":"delete_pool_api_internal_proxies__pool_id__delete","parameters":[{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal-proxies/{pool_id}/select":{"post":{"tags":["internal-proxies"],"summary":"Select Proxy","description":"Pick a proxy from the pool according to its strategy. Used by the streaming layer.","operationId":"select_proxy_api_internal_proxies__pool_id__select_post","parameters":[{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal-proxies/_assignments":{"get":{"tags":["internal-proxies"],"summary":"List Assignments","operationId":"list_assignments_api_internal_proxies__assignments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["internal-proxies"],"summary":"Create Assignment","operationId":"create_assignment_api_internal_proxies__assignments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal-proxies/_assignments/{aid}":{"delete":{"tags":["internal-proxies"],"summary":"Delete Assignment","operationId":"delete_assignment_api_internal_proxies__assignments__aid__delete","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/performance/snapshot":{"get":{"tags":["performance"],"summary":"Perf Snapshot","operationId":"perf_snapshot_api_performance_snapshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/performance/history":{"get":{"tags":["performance"],"summary":"Perf History","operationId":"perf_history_api_performance_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/performance/streams":{"get":{"tags":["performance"],"summary":"Perf Streams Top","description":"Top channels by recent stream_monitor activity. Aggregates last 5 min.","operationId":"perf_streams_top_api_performance_streams_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/performance/alerts":{"get":{"tags":["performance"],"summary":"Perf Alerts","operationId":"perf_alerts_api_performance_alerts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/performance/alerts/{aid}/dismiss":{"post":{"tags":["performance"],"summary":"Perf Alert Dismiss","operationId":"perf_alert_dismiss_api_performance_alerts__aid__dismiss_post","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/performance/alerts/reset-dismissed":{"post":{"tags":["performance"],"summary":"Perf Alert Reset","operationId":"perf_alert_reset_api_performance_alerts_reset_dismissed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/media-channels":{"get":{"tags":["media-channels"],"summary":"List Media Channels","description":"All channels with at least one media-kind source.","operationId":"list_media_channels_api_media_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MediaChannelOut"},"type":"array","title":"Response List Media Channels Api Media Channels Get"}}}}}},"post":{"tags":["media-channels"],"summary":"Create Media Channel","operationId":"create_media_channel_api_media_channels_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaChannelCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-channels/upload-image":{"post":{"tags":["media-channels"],"summary":"Upload Image","description":"Upload still image for radio-with-image. Returns relative path.","operationId":"upload_image_api_media_channels_upload_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_image_api_media_channels_upload_image_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-channels/validate-playlist":{"post":{"tags":["media-channels"],"summary":"Validate Playlist","description":"Parse the playlist text and check entries (URL reachable / file exists).","operationId":"validate_playlist_api_media_channels_validate_playlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaylistValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/{channel_id}/metrics":{"get":{"summary":"Channel Runtime Metrics","description":"FASE 24 — runtime metrics for a single channel (in-memory).","operationId":"channel_runtime_metrics_api_channels__channel_id__metrics_get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/_metrics/runtime":{"get":{"summary":"Channels Runtime Stats","description":"Latest stream_monitor snapshot per channel (speed, cpu, ram).","operationId":"channels_runtime_stats_api_channels__metrics_runtime_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/channels/_metrics/summary":{"get":{"summary":"Channels Metrics Summary","description":"FASE 24 — top 200 channels by in-memory bandwidth use.","operationId":"channels_metrics_summary_api_channels__metrics_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/channels/{channel_id}/metrics/history":{"get":{"summary":"Channel Metrics History","description":"FASE 29 — historical bandwidth deltas (5min snapshots, default last 24h).","operationId":"channel_metrics_history_api_channels__channel_id__metrics_history_get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels/{channel_id}/probe":{"get":{"summary":"Channel Probe","description":"FASE 26.3 — run ffprobe on upstream source URL, return real video/audio metadata.\nCached 10 min per channel.","operationId":"channel_probe_api_channels__channel_id__probe_get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/probe-url":{"post":{"summary":"Probe Arbitrary Url","description":"Esegui ffprobe su una URL arbitraria. Supporta proxy_id opzionale.\nCache 10 minuti per (url, proxy_id).","operationId":"probe_arbitrary_url_api_probe_url_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stream/{channel_id}.{ext}":{"get":{"summary":"Stream Format Router","description":"FASE 25 — proxy-in-place. URL stable forever, source resolved fresh on each request.","operationId":"stream_format_router_api_stream__channel_id___ext__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"ext","in":"path","required":true,"schema":{"type":"string","title":"Ext"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stream/{channel_id}":{"get":{"summary":"Stream Proxy","description":"Get the active stream URL for a channel.\nImplements LLOD V4 failover with YouTube re-extraction.\nFor YouTube sources, re-extracts the HLS URL on every request\nbecause Google URLs expire within minutes.\nFor DRM sources, returns the MPD URL with decryption metadata.\nFor standard HLS/DASH, returns the direct URL.","operationId":"stream_proxy_api_stream__channel_id__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tivify/license/{channel_code}":{"options":{"summary":"Tivify License Options","description":"Handle CORS preflight for Tivify license proxy.","operationId":"tivify_license_options_api_tivify_license__channel_code__options","parameters":[{"name":"channel_code","in":"path","required":true,"schema":{"type":"string","title":"Channel Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Tivify License Proxy","description":"Widevine license proxy for Tivify DRM channels.\n\nForwards the browser's Widevine challenge to Tivify's license server\nvia the Spanish VPN, adding the required authentication headers.\n\nThe browser's built-in Widevine CDM generates the challenge,\nthis proxy forwards it, and the CDM decrypts the response.\n\nURL format: /api/tivify/license/{channelCode}\nchannelCode is the Tivify internal code (e.g., GNA02 for La 2)","operationId":"tivify_license_proxy_api_tivify_license__channel_code__post","parameters":[{"name":"channel_code","in":"path","required":true,"schema":{"type":"string","title":"Channel Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/proxy":{"options":{"summary":"Cors Proxy Options","description":"Handle CORS preflight for proxy endpoint.","operationId":"cors_proxy_options_api_proxy_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Cors Proxy","description":"CORS proxy for MPD manifests and DASH segments.\n\nModes:\n- `strip` (default): Strips ContentProtection from MPD, sinf/tenc from init segments.\n  Used for HTTP playback where EME is not available.\n- `raw`: Pure CORS proxy, no content modification.\n  Used for HTTPS playback where EME/ClearKey handles DRM natively.\n- `decrypt`: Server-side decryption. Strips DRM from MPD/init, decrypts media segments\n  using mp4decrypt with stored keys. Browser gets clear content - no EME needed.\n  Requires `keys` parameter with comma-separated KID:KEY pairs.\n\nFor MPD manifests (strip mode):\n- Strips ALL ContentProtection elements (removes DRM requirement)\n- Strips sinf/pssh/tenc boxes from init segments (removes encryption metadata)\n- Rewrites relative URLs to go through this proxy\n\nFor MPD manifests (raw mode):\n- Keeps ContentProtection elements intact (for EME/ClearKey)\n- Rewrites relative URLs to go through this proxy\n\nBoth modes:\n- Rewrites segment URLs to go through this proxy for CORS\n- Adds proper CORS headers","operationId":"cors_proxy_api_proxy_head","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"ch","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ch"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"strip","title":"Mode"}},{"name":"keys","in":"query","required":false,"schema":{"type":"string","default":"","title":"Keys"}},{"name":"quality","in":"query","required":false,"schema":{"type":"string","default":"","title":"Quality"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Cors Proxy","description":"CORS proxy for MPD manifests and DASH segments.\n\nModes:\n- `strip` (default): Strips ContentProtection from MPD, sinf/tenc from init segments.\n  Used for HTTP playback where EME is not available.\n- `raw`: Pure CORS proxy, no content modification.\n  Used for HTTPS playback where EME/ClearKey handles DRM natively.\n- `decrypt`: Server-side decryption. Strips DRM from MPD/init, decrypts media segments\n  using mp4decrypt with stored keys. Browser gets clear content - no EME needed.\n  Requires `keys` parameter with comma-separated KID:KEY pairs.\n\nFor MPD manifests (strip mode):\n- Strips ALL ContentProtection elements (removes DRM requirement)\n- Strips sinf/pssh/tenc boxes from init segments (removes encryption metadata)\n- Rewrites relative URLs to go through this proxy\n\nFor MPD manifests (raw mode):\n- Keeps ContentProtection elements intact (for EME/ClearKey)\n- Rewrites relative URLs to go through this proxy\n\nBoth modes:\n- Rewrites segment URLs to go through this proxy for CORS\n- Adds proper CORS headers","operationId":"cors_proxy_api_proxy_head","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"ch","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ch"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"strip","title":"Mode"}},{"name":"keys","in":"query","required":false,"schema":{"type":"string","default":"","title":"Keys"}},{"name":"quality","in":"query","required":false,"schema":{"type":"string","default":"","title":"Quality"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Cors Proxy","description":"CORS proxy for MPD manifests and DASH segments.\n\nModes:\n- `strip` (default): Strips ContentProtection from MPD, sinf/tenc from init segments.\n  Used for HTTP playback where EME is not available.\n- `raw`: Pure CORS proxy, no content modification.\n  Used for HTTPS playback where EME/ClearKey handles DRM natively.\n- `decrypt`: Server-side decryption. Strips DRM from MPD/init, decrypts media segments\n  using mp4decrypt with stored keys. Browser gets clear content - no EME needed.\n  Requires `keys` parameter with comma-separated KID:KEY pairs.\n\nFor MPD manifests (strip mode):\n- Strips ALL ContentProtection elements (removes DRM requirement)\n- Strips sinf/pssh/tenc boxes from init segments (removes encryption metadata)\n- Rewrites relative URLs to go through this proxy\n\nFor MPD manifests (raw mode):\n- Keeps ContentProtection elements intact (for EME/ClearKey)\n- Rewrites relative URLs to go through this proxy\n\nBoth modes:\n- Rewrites segment URLs to go through this proxy for CORS\n- Adds proper CORS headers","operationId":"cors_proxy_api_proxy_head","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"ch","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ch"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"strip","title":"Mode"}},{"name":"keys","in":"query","required":false,"schema":{"type":"string","default":"","title":"Keys"}},{"name":"quality","in":"query","required":false,"schema":{"type":"string","default":"","title":"Quality"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/install/node.sh":{"get":{"summary":"Install Node Script","description":"FASE 7.4 — sirve el script bash que el admin pega en el nodo nuevo.\nUso (one-liner que devuelve el panel al crear un slot):\n   curl -fsSL http://master:8888/install/node.sh | bash -s -- \\\n        --master http://master:8888 --token <install_token>","operationId":"install_node_script_install_node_sh_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api":{"get":{"summary":"Api Root","operationId":"api_root_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/flush_metrics":{"post":{"summary":"Admin Flush Metrics","description":"FASE 29 — manually trigger flush_bandwidth_metrics in-process (bypass cron).","operationId":"admin_flush_metrics_api_admin_flush_metrics_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/logs/stream/clear":{"post":{"summary":"Clear Stream Log","description":"Svuota il log stream access.","operationId":"clear_stream_log_api_logs_stream_clear_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/logs/stream":{"get":{"summary":"Get Stream Log","description":"Ultime N righe del log stream access (/tmp/stream_access.log).","operationId":"get_stream_log_api_logs_stream_get","parameters":[{"name":"lines","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Lines"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channel-groups":{"get":{"tags":["channels"],"summary":"List Channel Groups","description":"Return distinct channel.group values with usage counts.\nUsed by the Edit Channel modal to populate a searchable dropdown.","operationId":"list_channel_groups_api_channel_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/media/logos":{"get":{"tags":["media"],"summary":"List Local Logos","description":"List logo files available in /data/media/images/ for the local picker.","operationId":"list_local_logos_api_media_logos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["media"],"summary":"Upload Logo","description":"Upload a logo image to /data/media/images/.\nReturns the relative URL where it can be referenced.","operationId":"upload_logo_api_media_logos_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_logo_api_media_logos_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/logos/{filename}":{"delete":{"tags":["media"],"summary":"Delete Logo","description":"Delete a local logo. Validates filename to prevent path traversal.","operationId":"delete_logo_api_media_logos__filename__delete","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vite.svg":{"get":{"summary":"Serve Vite Svg","operationId":"serve_vite_svg_vite_svg_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/playlist.m3u":{"get":{"summary":"Playlist M3U Alias","operationId":"playlist_m3u_alias_playlist_m3u_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/playlist.m3u8":{"get":{"summary":"Playlist M3U8 Alias","operationId":"playlist_m3u8_alias_playlist_m3u8_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/accounts":{"get":{"summary":"Accounts Page","operationId":"accounts_page_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/automations":{"get":{"summary":"Serve Automations","operationId":"serve_automations_automations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/automations/knowledge-base":{"get":{"summary":"Get Knowledge Base","operationId":"get_knowledge_base_api_automations_knowledge_base_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/automations/repair-history":{"get":{"summary":"Get Repair History","operationId":"get_repair_history_api_automations_repair_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/automations/repair/{source_id}":{"post":{"summary":"Repair Source Endpoint","operationId":"repair_source_endpoint_api_automations_repair__source_id__post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/automations/repair-all/{provider}":{"post":{"summary":"Repair All Provider","operationId":"repair_all_provider_api_automations_repair_all__provider__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/automations/diagnose":{"get":{"summary":"Diagnose Source Error","operationId":"diagnose_source_error_api_automations_diagnose_get","parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Url"}},{"name":"http_code","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Http Code"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/install_client.sh":{"get":{"summary":"Download Install Client","description":"Script di installazione client — scaricabile pubblicamente.","operationId":"download_install_client_install_client_sh_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/install_admin.sh":{"get":{"summary":"Block Install Admin","description":"Script admin — non accessibile dall'esterno.","operationId":"block_install_admin_install_admin_sh_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/p/{slug}":{"get":{"summary":"Serve Reseller Panel","description":"Serve the reseller sub-panel page for a given panel_url slug.","operationId":"serve_reseller_panel_p__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{full_path}":{"get":{"summary":"Serve Frontend","operationId":"serve_frontend__full_path__get","parameters":[{"name":"full_path","in":"path","required":true,"schema":{"type":"string","title":"Full Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teditv/license/{channel_id}":{"options":{"summary":"Teditv License Options","description":"Handle CORS preflight for TEDI TV license proxy.","operationId":"teditv_license_options_api_teditv_license__channel_id__options","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Teditv License Proxy","description":"Widevine license proxy for TEDI TV channels.\nGets fresh license URL from TEDI TV API and forwards the browser's challenge.","operationId":"teditv_license_proxy_api_teditv_license__channel_id__post","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccessRuleIn":{"properties":{"rule_type":{"type":"string","pattern":"^(ip|useragent)$","title":"Rule Type"},"list_type":{"type":"string","pattern":"^(whitelist|blacklist)$","title":"List Type"},"value":{"type":"string","maxLength":512,"minLength":1,"title":"Value"},"enabled":{"type":"boolean","title":"Enabled","default":true},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["rule_type","list_type","value"],"title":"AccessRuleIn"},"AccessRuleUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},"type":"object","title":"AccessRuleUpdate"},"AccountCreate":{"properties":{"service":{"type":"string","title":"Service"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"auto_renew":{"type":"boolean","title":"Auto Renew","default":true},"notes":{"type":"string","title":"Notes","default":""},"extra_data":{"type":"object","title":"Extra Data","default":{}}},"type":"object","required":["service","username"],"title":"AccountCreate"},"AccountOut":{"properties":{"id":{"type":"string","title":"Id"},"service":{"type":"string","title":"Service"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"status":{"type":"string","title":"Status"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"token_expires":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Token Expires"},"extra_data":{"title":"Extra Data","default":{}},"last_check":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check"},"auto_renew":{"type":"boolean","title":"Auto Renew","default":true},"notes":{"type":"string","title":"Notes","default":""},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","service","username","password","status"],"title":"AccountOut"},"AccountUpdate":{"properties":{"service":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"auto_renew":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Renew"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"extra_data":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Extra Data"}},"type":"object","title":"AccountUpdate"},"AddYouTubeRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"youtube_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Url"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"AddYouTubeRequest"},"ApplyHeadersRequest":{"properties":{"template":{"type":"string","title":"Template","default":"basic"},"auto_include":{"type":"boolean","title":"Auto Include","default":true}},"type":"object","title":"ApplyHeadersRequest"},"ApplyRateLimitRequest":{"properties":{"template":{"type":"string","title":"Template","default":"basic"}},"type":"object","title":"ApplyRateLimitRequest"},"AssignmentCreate":{"properties":{"pool_id":{"type":"string","title":"Pool Id"},"target_type":{"type":"string","title":"Target Type"},"target_id":{"type":"string","title":"Target Id"},"priority":{"type":"integer","title":"Priority","default":1}},"type":"object","required":["pool_id","target_type","target_id"],"title":"AssignmentCreate"},"AutomationSummary":{"properties":{"total_providers":{"type":"integer","title":"Total Providers","default":0},"total_cron_jobs":{"type":"integer","title":"Total Cron Jobs","default":0},"active_cron_jobs":{"type":"integer","title":"Active Cron Jobs","default":0},"total_channels":{"type":"integer","title":"Total Channels","default":0},"online_channels":{"type":"integer","title":"Online Channels","default":0},"overall_health_pct":{"type":"number","title":"Overall Health Pct","default":0.0},"providers":{"items":{"$ref":"#/components/schemas/ProviderStatus"},"type":"array","title":"Providers","default":[]}},"type":"object","title":"AutomationSummary"},"BackupDeleteRequest":{"properties":{"filename":{"type":"string","title":"Filename"}},"type":"object","required":["filename"],"title":"BackupDeleteRequest"},"BackupRestoreRequest":{"properties":{"filename":{"type":"string","title":"Filename"}},"type":"object","required":["filename"],"title":"BackupRestoreRequest"},"BackupRetentionPayload":{"properties":{"keep_days":{"type":"integer","title":"Keep Days","default":30},"keep_count":{"type":"integer","title":"Keep Count","default":10},"auto_cleanup":{"type":"boolean","title":"Auto Cleanup","default":true}},"type":"object","title":"BackupRetentionPayload"},"BanIpPayload":{"properties":{"ip":{"type":"string","title":"Ip"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","default":"Banned from audit log viewer"},"jail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jail","default":"playerproar-auth"}},"type":"object","required":["ip"],"title":"BanIpPayload"},"BanRequest":{"properties":{"jail":{"type":"string","title":"Jail"},"ip":{"type":"string","title":"Ip"}},"type":"object","required":["jail","ip"],"title":"BanRequest"},"Body_bulk_add_proxies_api_proxies_bulk_add_post":{"properties":{"proxies_data":{"items":{},"type":"array","title":"Proxies Data"}},"type":"object","required":["proxies_data"],"title":"Body_bulk_add_proxies_api_proxies_bulk_add_post"},"Body_import_file_api_import_export_import_file_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_file_api_import_export_import_file_post"},"Body_upload_image_api_media_channels_upload_image_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["image"],"title":"Body_upload_image_api_media_channels_upload_image_post"},"Body_upload_logo_api_media_logos_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_logo_api_media_logos_post"},"BouquetChannelsAssign":{"properties":{"channel_ids":{"items":{"type":"string"},"type":"array","title":"Channel Ids"}},"type":"object","required":["channel_ids"],"title":"BouquetChannelsAssign"},"BouquetCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"is_public":{"type":"boolean","title":"Is Public","default":false},"color":{"type":"string","title":"Color","default":"#3B82F6"},"icon":{"type":"string","title":"Icon","default":"package"}},"type":"object","required":["name"],"title":"BouquetCreate"},"BouquetUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"}},"type":"object","title":"BouquetUpdate"},"BulkAction":{"properties":{"channel_ids":{"items":{"type":"string"},"type":"array","title":"Channel Ids"},"action":{"type":"string","title":"Action"},"params":{"type":"object","title":"Params","default":{}}},"type":"object","required":["channel_ids","action"],"title":"BulkAction"},"BulkActionRequest":{"properties":{"action":{"type":"string","title":"Action"},"target_ids":{"items":{"type":"string"},"type":"array","title":"Target Ids"},"scope":{"type":"string","title":"Scope","default":"descendants"},"params":{"type":"object","title":"Params","default":{}}},"type":"object","required":["action","target_ids"],"title":"BulkActionRequest"},"BulkEnablePayload":{"properties":{"channel_ids":{"items":{"type":"string"},"type":"array","title":"Channel Ids"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["channel_ids","enabled"],"title":"BulkEnablePayload"},"BulkExtra2Request":{"properties":{"action":{"type":"string","title":"Action"},"target_ids":{"items":{"type":"string"},"type":"array","title":"Target Ids"},"params":{"type":"object","title":"Params","default":{}},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["action","target_ids"],"title":"BulkExtra2Request"},"BulkExtraRequest":{"properties":{"action":{"type":"string","title":"Action"},"target_ids":{"items":{"type":"string"},"type":"array","title":"Target Ids"},"scope":{"type":"string","title":"Scope","default":"descendants"},"params":{"type":"object","title":"Params","default":{}},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["action","target_ids"],"title":"BulkExtraRequest"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ChannelCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"resolution":{"type":"string","title":"Resolution","default":"unknown"},"format":{"type":"string","title":"Format","default":"unknown"},"vpn_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Id"},"vpn_failover_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Failover Id"},"namespace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"},"proxy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proxy Id"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","default":{}},"logo_url":{"type":"string","title":"Logo Url","default":""},"epg_id":{"type":"string","title":"Epg Id","default":""},"group":{"type":"string","title":"Group","default":""},"order":{"type":"integer","title":"Order","default":0},"enabled":{"type":"boolean","title":"Enabled","default":true},"notes":{"type":"string","title":"Notes","default":""},"tag_ids":{"items":{"type":"string"},"type":"array","title":"Tag Ids","default":[]},"sources":{"items":{"$ref":"#/components/schemas/SourceCreate"},"type":"array","title":"Sources","default":[]}},"type":"object","required":["name"],"title":"ChannelCreate"},"ChannelOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"active"},"health_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health Score","default":0},"resolution":{"type":"string","title":"Resolution"},"format":{"type":"string","title":"Format"},"vpn_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Id"},"vpn_failover_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Failover Id"},"namespace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"},"proxy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proxy Id"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","default":{}},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","default":""},"epg_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Epg Id","default":""},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","default":""},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order","default":0},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":true},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","default":""},"last_online":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Online"},"last_offline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Offline"},"online_time_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Online Time Seconds","default":0},"offline_time_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offline Time Seconds","default":0},"sleep_schedule":{"type":"string","title":"Sleep Schedule","default":""},"restart_schedule":{"type":"string","title":"Restart Schedule","default":""},"memory_limit_mb":{"type":"integer","title":"Memory Limit Mb","default":0},"speed_min":{"type":"number","title":"Speed Min","default":0.5},"speed_max":{"type":"number","title":"Speed Max","default":1.5},"max_backup_urls":{"type":"integer","title":"Max Backup Urls","default":20},"last_restart":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Restart"},"sleeping":{"type":"boolean","title":"Sleeping","default":false},"video_encoding":{"type":"object","title":"Video Encoding","default":{}},"audio_encoding":{"type":"object","title":"Audio Encoding","default":{}},"subtitle_encoding":{"type":"object","title":"Subtitle Encoding","default":{}},"overlay_image":{"type":"object","title":"Overlay Image","default":{}},"overlay_text":{"type":"object","title":"Overlay Text","default":{}},"delogo_static":{"items":{"type":"object"},"type":"array","title":"Delogo Static","default":[]},"delogo_dynamic":{"type":"boolean","title":"Delogo Dynamic","default":false},"stream_mapping":{"type":"object","title":"Stream Mapping","default":{}},"pid_mapping":{"type":"object","title":"Pid Mapping","default":{}},"service_info":{"type":"object","title":"Service Info","default":{}},"timeshift_seconds":{"type":"integer","title":"Timeshift Seconds","default":0},"output_config":{"type":"object","title":"Output Config","default":{}},"low_latency":{"type":"boolean","title":"Low Latency","default":false},"av_sync":{"type":"object","title":"Av Sync","default":{}},"transcode_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcode Profile Id"},"scheduled_restart_global":{"type":"boolean","title":"Scheduled Restart Global","default":true},"on_demand":{"type":"boolean","title":"On Demand","default":false},"play_mode":{"type":"string","title":"Play Mode","default":"live"},"autostart":{"type":"boolean","title":"Autostart","default":false},"speed_up":{"type":"boolean","title":"Speed Up","default":false},"session_manifest":{"type":"boolean","title":"Session Manifest","default":false},"use_cdm":{"type":"boolean","title":"Use Cdm","default":false},"cdm":{"type":"string","title":"Cdm","default":""},"cdm_type":{"type":"string","title":"Cdm Type","default":"widevine"},"cdm_mode":{"type":"string","title":"Cdm Mode","default":"internal"},"pr_la_version":{"type":"string","title":"Pr La Version","default":""},"pr_client_version":{"type":"string","title":"Pr Client Version","default":""},"pr_custom_data":{"type":"string","title":"Pr Custom Data","default":""},"network_override":{"type":"boolean","title":"Network Override","default":false},"mode_override":{"type":"boolean","title":"Mode Override","default":false},"ignore_update":{"type":"boolean","title":"Ignore Update","default":false},"fix_iv_size":{"type":"boolean","title":"Fix Iv Size","default":false},"time_range":{"type":"boolean","title":"Time Range","default":false},"is_event":{"type":"boolean","title":"Is Event","default":false},"record_event":{"type":"boolean","title":"Record Event","default":false},"event_start":{"type":"integer","title":"Event Start","default":0},"event_end":{"type":"integer","title":"Event End","default":0},"manifest_script":{"type":"string","title":"Manifest Script","default":""},"manifest_type":{"type":"string","title":"Manifest Type","default":""},"manifest_info":{"type":"string","title":"Manifest Info","default":""},"pipe_output_params":{"type":"string","title":"Pipe Output Params","default":""},"proto_output_params":{"type":"string","title":"Proto Output Params","default":""},"ch_proxy":{"type":"string","title":"Ch Proxy","default":""},"ch_bind":{"type":"string","title":"Ch Bind","default":""},"ch_doh":{"type":"string","title":"Ch Doh","default":""},"ch_network_scope":{"type":"string","title":"Ch Network Scope","default":""},"ch_running_mode":{"type":"string","title":"Ch Running Mode","default":""},"ch_output_mode":{"type":"string","title":"Ch Output Mode","default":""},"country_code":{"type":"string","title":"Country Code","default":""},"probe_data":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Probe Data"},"probe_ts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Probe Ts"},"sources":{"items":{"$ref":"#/components/schemas/SourceOut"},"type":"array","title":"Sources","default":[]},"tags":{"items":{"$ref":"#/components/schemas/TagOut"},"type":"array","title":"Tags","default":[]},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","folder_id","resolution","format","vpn_id","vpn_failover_id","namespace_id","proxy_id","last_online","last_offline","created_at","updated_at"],"title":"ChannelOut"},"ChannelUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"vpn_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Id"},"vpn_failover_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Failover Id"},"namespace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"},"proxy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proxy Id"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"epg_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Epg Id"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"tag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tag Ids"},"sleep_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sleep Schedule"},"restart_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restart Schedule"},"memory_limit_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Limit Mb"},"speed_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed Min"},"speed_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed Max"},"max_backup_urls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Backup Urls"},"video_encoding":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Video Encoding"},"audio_encoding":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Audio Encoding"},"subtitle_encoding":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Subtitle Encoding"},"overlay_image":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Overlay Image"},"overlay_text":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Overlay Text"},"delogo_static":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Delogo Static"},"delogo_dynamic":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delogo Dynamic"},"stream_mapping":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Stream Mapping"},"pid_mapping":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Pid Mapping"},"service_info":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Service Info"},"timeshift_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timeshift Seconds"},"output_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Output Config"},"low_latency":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Low Latency"},"av_sync":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Av Sync"},"transcode_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcode Profile Id"},"scheduled_restart_global":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Scheduled Restart Global"},"on_demand":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On Demand"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"play_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Play Mode"},"autostart":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Autostart"},"speed_up":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Speed Up"},"session_manifest":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Session Manifest"},"use_cdm":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Cdm"},"cdm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cdm"},"cdm_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cdm Type"},"cdm_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cdm Mode"},"pr_la_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pr La Version"},"pr_client_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pr Client Version"},"pr_custom_data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pr Custom Data"},"network_override":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Network Override"},"mode_override":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mode Override"},"ignore_update":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ignore Update"},"fix_iv_size":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fix Iv Size"},"time_range":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Time Range"},"is_event":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Event"},"record_event":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Record Event"},"event_start":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Start"},"event_end":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event End"},"manifest_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Script"},"manifest_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Type"},"manifest_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Info"},"pipe_output_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipe Output Params"},"proto_output_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proto Output Params"},"ch_proxy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ch Proxy"},"ch_bind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ch Bind"},"ch_doh":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ch Doh"},"ch_network_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ch Network Scope"},"ch_running_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ch Running Mode"},"ch_output_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ch Output Mode"},"probe_data":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Probe Data"},"probe_ts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Probe Ts"}},"type":"object","title":"ChannelUpdate"},"ConfigOut":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["key","value","updated_at"],"title":"ConfigOut"},"ConfigUpdate":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"}},"type":"object","required":["key","value"],"title":"ConfigUpdate"},"ConfigWriteRequest":{"properties":{"content":{"type":"string","maxLength":200000,"title":"Content"}},"type":"object","required":["content"],"title":"ConfigWriteRequest"},"CountryCreate":{"properties":{"code":{"type":"string","maxLength":2,"minLength":2,"title":"Code","description":"ISO 3166-1 alpha-2 (ej: ES, IT, FR)"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"flag_emoji":{"type":"string","title":"Flag Emoji","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["code","name"],"title":"CountryCreate"},"CountryOut":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"flag_emoji":{"type":"string","title":"Flag Emoji","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["code","name"],"title":"CountryOut"},"CronJobCreate":{"properties":{"name":{"type":"string","title":"Name"},"cron_expression":{"type":"string","title":"Cron Expression"},"extractor":{"type":"string","title":"Extractor","default":""},"params":{"type":"object","title":"Params","default":{}},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name","cron_expression"],"title":"CronJobCreate"},"CronJobOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"cron_expression":{"type":"string","title":"Cron Expression"},"extractor":{"type":"string","title":"Extractor","default":""},"params":{"type":"object","title":"Params","default":{}},"enabled":{"type":"boolean","title":"Enabled","default":true},"last_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run"},"last_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Result","default":""},"last_duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Duration Ms","default":0},"next_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run"},"run_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Count","default":0},"fail_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fail Count","default":0},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","cron_expression"],"title":"CronJobOut"},"CronJobUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"cron_expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Expression"},"extractor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extractor"},"params":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Params"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"CronJobUpdate"},"DashboardStats":{"properties":{"total_channels":{"type":"integer","title":"Total Channels","default":0},"online_channels":{"type":"integer","title":"Online Channels","default":0},"offline_channels":{"type":"integer","title":"Offline Channels","default":0},"degraded_channels":{"type":"integer","title":"Degraded Channels","default":0},"on_demand_channels":{"type":"integer","title":"On Demand Channels","default":0},"requires_vpn_channels":{"type":"integer","title":"Requires Vpn Channels","default":0},"total_sources":{"type":"integer","title":"Total Sources","default":0},"active_vpns":{"type":"integer","title":"Active Vpns","default":0},"active_namespaces":{"type":"integer","title":"Active Namespaces","default":0},"active_proxies":{"type":"integer","title":"Active Proxies","default":0},"total_folders":{"type":"integer","title":"Total Folders","default":0},"total_tags":{"type":"integer","title":"Total Tags","default":0},"active_cron_jobs":{"type":"integer","title":"Active Cron Jobs","default":0},"avg_health_score":{"type":"number","title":"Avg Health Score","default":0.0},"format_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Format Distribution","default":{}},"resolution_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Resolution Distribution","default":{}},"status_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Status Distribution","default":{}},"platform_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Platform Distribution","default":{}},"country_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Country Distribution","default":{}},"youtube":{"type":"integer","title":"Youtube","default":0}},"type":"object","title":"DashboardStats"},"DisableUserRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"DisableUserRequest"},"ExportRequest":{"properties":{"format":{"type":"string","title":"Format","default":"m3u"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"tag_ids":{"items":{"type":"string"},"type":"array","title":"Tag Ids","default":[]},"statuses":{"items":{"type":"string"},"type":"array","title":"Statuses","default":[]},"include_headers":{"type":"boolean","title":"Include Headers","default":true},"vlc_compatible":{"type":"boolean","title":"Vlc Compatible","default":true},"xtream_mode":{"type":"boolean","title":"Xtream Mode","default":true}},"type":"object","title":"ExportRequest"},"FirewallPresetApplyPayload":{"properties":{"preset_id":{"type":"string","title":"Preset Id"},"allowed_ssh_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ssh Ips","default":[]},"enable_ufw":{"type":"boolean","title":"Enable Ufw","default":true}},"type":"object","required":["preset_id"],"title":"FirewallPresetApplyPayload"},"FolderCreate":{"properties":{"name":{"type":"string","title":"Name"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"icon":{"type":"string","title":"Icon","default":"folder"},"color":{"type":"string","title":"Color","default":"#3B82F6"},"order":{"type":"integer","title":"Order","default":0},"vpn_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Id"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","default":{}},"country_code":{"type":"string","title":"Country Code","default":"ES"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""}},"type":"object","required":["name"],"title":"FolderCreate"},"FolderOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"icon":{"type":"string","title":"Icon"},"color":{"type":"string","title":"Color"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order","default":0},"vpn_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Id"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","default":{}},"country_code":{"type":"string","title":"Country Code","default":"ES"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""},"channel_count":{"type":"integer","title":"Channel Count","default":0},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","default":""},"provider_external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider External Id","default":""},"is_provider":{"type":"boolean","title":"Is Provider","default":true},"running_mode":{"type":"string","title":"Running Mode","default":"internalremuxer"},"output_mode":{"type":"string","title":"Output Mode","default":"directhls"},"network_scope":{"type":"string","title":"Network Scope","default":"script,manifest,media"},"user_agent":{"type":"string","title":"User Agent","default":""},"x_forwarded_for":{"type":"string","title":"X Forwarded For","default":""},"proxy":{"type":"string","title":"Proxy","default":""},"bind":{"type":"string","title":"Bind","default":""},"doh":{"type":"string","title":"Doh","default":""},"additional_headers":{"type":"string","title":"Additional Headers","default":""},"max_concurrent_streams":{"type":"integer","title":"Max Concurrent Streams","default":0},"restart_delay":{"type":"integer","title":"Restart Delay","default":30},"stall_detect_timeout":{"type":"integer","title":"Stall Detect Timeout","default":60},"autorestart_period":{"type":"integer","title":"Autorestart Period","default":0},"random_autostart_period":{"type":"integer","title":"Random Autostart Period","default":0},"sequencial_autostart_period":{"type":"integer","title":"Sequencial Autostart Period","default":0},"playback_delay":{"type":"integer","title":"Playback Delay","default":0},"events_refresh_period":{"type":"integer","title":"Events Refresh Period","default":3600},"http_get_retries":{"type":"integer","title":"Http Get Retries","default":2},"pipe_output_cmd":{"type":"string","title":"Pipe Output Cmd","default":""},"hls_playlist_duration":{"type":"integer","title":"Hls Playlist Duration","default":15},"hls_fragments_count":{"type":"integer","title":"Hls Fragments Count","default":0},"hls_fragments_duration":{"type":"integer","title":"Hls Fragments Duration","default":0},"always_reset_session":{"type":"boolean","title":"Always Reset Session","default":false},"no_restart_on_error":{"type":"boolean","title":"No Restart On Error","default":false},"restart_finished":{"type":"boolean","title":"Restart Finished","default":false},"no_restart_on_track_change":{"type":"boolean","title":"No Restart On Track Change","default":false},"no_wait_full_playlist":{"type":"boolean","title":"No Wait Full Playlist","default":false},"continuous_playback":{"type":"boolean","title":"Continuous Playback","default":false},"ignore_static_dash":{"type":"boolean","title":"Ignore Static Dash","default":false},"use_dash_delay":{"type":"boolean","title":"Use Dash Delay","default":false},"reuse_event_index":{"type":"boolean","title":"Reuse Event Index","default":false},"events_autorefresh":{"type":"boolean","title":"Events Autorefresh","default":false},"events_autoremove":{"type":"boolean","title":"Events Autoremove","default":false},"channels_autoremove":{"type":"boolean","title":"Channels Autoremove","default":false},"epg_timezone":{"type":"string","title":"Epg Timezone","default":""},"vmx_unique_id":{"type":"string","title":"Vmx Unique Id","default":""}},"type":"object","required":["id","name","parent_id","icon","color","vpn_id","created_at"],"title":"FolderOut"},"FolderReorderItem":{"properties":{"id":{"type":"string","title":"Id"},"order":{"type":"integer","title":"Order"}},"type":"object","required":["id","order"],"title":"FolderReorderItem"},"FolderUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"},"vpn_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Id"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"provider_external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider External Id"},"is_provider":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Provider"},"running_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Running Mode"},"output_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Mode"},"network_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network Scope"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"x_forwarded_for":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X Forwarded For"},"proxy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proxy"},"bind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bind"},"doh":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doh"},"additional_headers":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Headers"},"max_concurrent_streams":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Concurrent Streams"},"restart_delay":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Restart Delay"},"stall_detect_timeout":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Stall Detect Timeout"},"autorestart_period":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Autorestart Period"},"random_autostart_period":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Random Autostart Period"},"sequencial_autostart_period":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sequencial Autostart Period"},"playback_delay":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Playback Delay"},"events_refresh_period":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Events Refresh Period"},"http_get_retries":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Http Get Retries"},"pipe_output_cmd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipe Output Cmd"},"hls_playlist_duration":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Hls Playlist Duration"},"hls_fragments_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Hls Fragments Count"},"hls_fragments_duration":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Hls Fragments Duration"},"always_reset_session":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Always Reset Session"},"no_restart_on_error":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"No Restart On Error"},"restart_finished":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Restart Finished"},"no_restart_on_track_change":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"No Restart On Track Change"},"no_wait_full_playlist":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"No Wait Full Playlist"},"continuous_playback":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Continuous Playback"},"ignore_static_dash":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ignore Static Dash"},"use_dash_delay":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Dash Delay"},"reuse_event_index":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reuse Event Index"},"events_autorefresh":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Events Autorefresh"},"events_autoremove":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Events Autoremove"},"channels_autoremove":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Channels Autoremove"},"epg_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Epg Timezone"},"vmx_unique_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vmx Unique Id"}},"type":"object","title":"FolderUpdate"},"ForcePwdBody":{"properties":{"new_password":{"type":"string","minLength":8,"title":"New Password"}},"type":"object","required":["new_password"],"title":"ForcePwdBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HardeningRestorePayload":{"properties":{"backup_path":{"type":"string","title":"Backup Path"}},"type":"object","required":["backup_path"],"title":"HardeningRestorePayload"},"HealthCheckOut":{"properties":{"id":{"type":"integer","title":"Id"},"source_id":{"type":"string","title":"Source Id"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"layer":{"type":"string","title":"Layer"},"status_code":{"type":"integer","title":"Status Code"},"latency_ms":{"type":"integer","title":"Latency Ms"},"score":{"type":"integer","title":"Score"},"details":{"type":"object","title":"Details"},"error":{"type":"string","title":"Error"}},"type":"object","required":["id","source_id","timestamp","layer","status_code","latency_ms","score","details","error"],"title":"HealthCheckOut"},"HealthCheckRequest":{"properties":{"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids","default":[]},"channel_ids":{"items":{"type":"string"},"type":"array","title":"Channel Ids","default":[]},"layers":{"items":{"type":"string"},"type":"array","title":"Layers","default":["http"]}},"type":"object","title":"HealthCheckRequest"},"ImpersonateRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"reason":{"type":"string","maxLength":500,"minLength":4,"title":"Reason"}},"type":"object","required":["user_id","reason"],"title":"ImpersonateRequest"},"ImportExportHistoryOut":{"properties":{"id":{"type":"string","title":"Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","default":""},"format":{"type":"string","title":"Format"},"filename":{"type":"string","title":"Filename"},"channels_count":{"type":"integer","title":"Channels Count"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"active"},"error":{"type":"string","title":"Error"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","format","filename","channels_count","error","created_at"],"title":"ImportExportHistoryOut"},"ImportRequest":{"properties":{"format":{"type":"string","title":"Format","default":"m3u"},"content":{"type":"string","title":"Content","default":""},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"auto_detect_format":{"type":"boolean","title":"Auto Detect Format","default":true},"auto_detect_resolution":{"type":"boolean","title":"Auto Detect Resolution","default":true}},"type":"object","title":"ImportRequest"},"ImportUrlRequest":{"properties":{"url":{"type":"string","title":"Url"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","required":["url"],"title":"ImportUrlRequest"},"LicenseFeatureBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["enabled"],"title":"LicenseFeatureBody"},"LoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"otp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Otp Code"},"captcha_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Token"}},"type":"object","required":["username","password"],"title":"LoginRequest"},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"user":{"type":"object","title":"User"}},"type":"object","required":["access_token","expires_in","user"],"title":"LoginResponse"},"MassEditRequest":{"properties":{"channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channel Ids"},"filter_folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Folder Id"},"filter_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Status"},"filter_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Format"},"filter_search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Search"},"update":{"type":"object","title":"Update"}},"type":"object","required":["update"],"title":"MassEditRequest","description":"Apply a partial update to many channels at once. Supports search filter."},"MassEditResult":{"properties":{"matched":{"type":"integer","title":"Matched"},"updated":{"type":"integer","title":"Updated"},"failed":{"type":"integer","title":"Failed"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["matched","updated","failed"],"title":"MassEditResult"},"MediaChannelCreate":{"properties":{"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","default":""},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","default":""},"playlist_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Playlist Text"},"rate_emu":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rate Emu","default":true},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"still_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Still Image Url"},"still_image_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Still Image Path"}},"type":"object","required":["name","kind"],"title":"MediaChannelCreate"},"MediaChannelOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"sources_count":{"type":"integer","title":"Sources Count","default":0},"playlist_path":{"type":"string","title":"Playlist Path","default":""},"still_image_path":{"type":"string","title":"Still Image Path","default":""},"audio_url":{"type":"string","title":"Audio Url","default":""},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","kind"],"title":"MediaChannelOut"},"MoveParentBody":{"properties":{"new_parent_id":{"type":"string","title":"New Parent Id"}},"type":"object","required":["new_parent_id"],"title":"MoveParentBody"},"NamespaceCreate":{"properties":{"name":{"type":"string","title":"Name"},"vpn_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Account Id"},"country":{"type":"string","title":"Country","default":""},"protocol":{"type":"string","title":"Protocol","default":"openvpn"},"socks_port":{"type":"integer","title":"Socks Port"}},"type":"object","required":["name","socks_port"],"title":"NamespaceCreate"},"NamespaceOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"vpn_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpn Account Id"},"country":{"type":"string","title":"Country"},"protocol":{"type":"string","title":"Protocol"},"ip":{"type":"string","title":"Ip"},"socks_port":{"type":"integer","title":"Socks Port"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"active"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms","default":0},"speed_mbps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speed Mbps","default":0.0},"last_check":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check"}},"type":"object","required":["id","name","vpn_account_id","country","protocol","ip","socks_port"],"title":"NamespaceOut"},"NodeCreate":{"properties":{"name":{"type":"string","title":"Name"},"host":{"type":"string","title":"Host","default":""},"port":{"type":"integer","title":"Port","default":8888},"role":{"type":"string","title":"Role","default":"worker"},"weight":{"type":"integer","title":"Weight","default":100},"region":{"type":"string","title":"Region","default":""},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["name"],"title":"NodeCreate","description":"Lo que el admin envia para crear un slot de nodo nuevo (genera install_token)."},"NodeOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port"},"role":{"type":"string","title":"Role"},"weight":{"type":"integer","title":"Weight"},"region":{"type":"string","title":"Region","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true},"status":{"type":"string","title":"Status","default":"unknown"},"last_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen"},"fail_count":{"type":"integer","title":"Fail Count","default":0},"cpu_percent":{"type":"number","title":"Cpu Percent","default":0},"mem_percent":{"type":"number","title":"Mem Percent","default":0},"active_streams":{"type":"integer","title":"Active Streams","default":0},"bandwidth_mbps":{"type":"number","title":"Bandwidth Mbps","default":0},"has_gpu":{"type":"boolean","title":"Has Gpu","default":false},"gpu_model":{"type":"string","title":"Gpu Model","default":""},"cpu_cores":{"type":"integer","title":"Cpu Cores","default":0},"mem_gb_total":{"type":"number","title":"Mem Gb Total","default":0},"max_streams":{"type":"integer","title":"Max Streams","default":0},"notes":{"type":"string","title":"Notes","default":""},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","host","port","role","weight"],"title":"NodeOut"},"NodeRegister":{"properties":{"install_token":{"type":"string","title":"Install Token"},"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port","default":8888},"cpu_cores":{"type":"integer","title":"Cpu Cores","default":0},"mem_gb_total":{"type":"number","title":"Mem Gb Total","default":0},"has_gpu":{"type":"boolean","title":"Has Gpu","default":false},"gpu_model":{"type":"string","title":"Gpu Model","default":""},"max_streams":{"type":"integer","title":"Max Streams","default":0}},"type":"object","required":["install_token","host"],"title":"NodeRegister","description":"Lo que el INSTALADOR envia desde el nodo nuevo para auto-registrarse."},"NodeUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"},"weight":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weight"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"max_streams":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Streams"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"NodeUpdate"},"NotifConfigUpdate":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/NotificationChannel"},"type":"array","title":"Channels"},"rules":{"items":{"$ref":"#/components/schemas/NotificationRule"},"type":"array","title":"Rules"}},"type":"object","required":["channels","rules"],"title":"NotifConfigUpdate"},"NotifOptions":{"properties":{"cooldown_seconds_per_event":{"type":"integer","title":"Cooldown Seconds Per Event","default":60},"quiet_hours_enabled":{"type":"boolean","title":"Quiet Hours Enabled","default":false},"quiet_hours_start":{"type":"string","title":"Quiet Hours Start","default":"23:00"},"quiet_hours_end":{"type":"string","title":"Quiet Hours End","default":"07:00"},"min_severity":{"type":"string","title":"Min Severity","default":"low"},"templates":{"additionalProperties":{"type":"string"},"type":"object","title":"Templates","default":{}}},"type":"object","title":"NotifOptions"},"NotificationChannel":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"name":{"type":"string","title":"Name"},"enabled":{"type":"boolean","title":"Enabled","default":true},"bot_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Token","default":""},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id","default":""},"smtp_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Host","default":""},"smtp_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Smtp Port","default":587},"smtp_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp User","default":""},"smtp_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Pass","default":""},"from_addr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Addr","default":""},"to_addr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Addr","default":""},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","default":""}},"type":"object","required":["id","type","name"],"title":"NotificationChannel"},"NotificationRule":{"properties":{"event":{"type":"string","title":"Event"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Threshold","default":1},"window_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Min","default":5},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["event","channels"],"title":"NotificationRule"},"OtpDisable":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"OtpDisable"},"OtpVerify":{"properties":{"code":{"type":"string","maxLength":6,"minLength":6,"title":"Code"}},"type":"object","required":["code"],"title":"OtpVerify"},"OutputTargetCreate":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"key":{"type":"string","title":"Key","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name","url"],"title":"OutputTargetCreate"},"PackageBody":{"properties":{"name":{"type":"string","title":"Name"},"duration":{"type":"integer","title":"Duration","default":30},"duration_unit":{"type":"string","title":"Duration Unit","default":"days"},"max_connections":{"type":"integer","title":"Max Connections","default":1},"cost_credits":{"type":"number","title":"Cost Credits","default":10.0},"is_restreamer":{"type":"boolean","title":"Is Restreamer","default":false},"is_trial":{"type":"boolean","title":"Is Trial","default":false},"bouquets":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bouquets"},"allowed_roles":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Allowed Roles"}},"type":"object","required":["name"],"title":"PackageBody"},"PlaylistValidateRequest":{"properties":{"playlist_text":{"type":"string","title":"Playlist Text"}},"type":"object","required":["playlist_text"],"title":"PlaylistValidateRequest"},"PoolCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"strategy":{"type":"string","title":"Strategy","default":"round_robin"},"proxy_ids":{"items":{"type":"string"},"type":"array","title":"Proxy Ids","default":[]},"country_filter":{"type":"string","title":"Country Filter","default":""},"type_filter":{"type":"string","title":"Type Filter","default":""},"cdn_mode":{"type":"boolean","title":"Cdn Mode","default":false},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name"],"title":"PoolCreate"},"PoolOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"strategy":{"type":"string","title":"Strategy"},"proxy_ids":{"items":{"type":"string"},"type":"array","title":"Proxy Ids"},"country_filter":{"type":"string","title":"Country Filter"},"type_filter":{"type":"string","title":"Type Filter"},"cdn_mode":{"type":"boolean","title":"Cdn Mode"},"enabled":{"type":"boolean","title":"Enabled"},"request_count":{"type":"integer","title":"Request Count"},"bytes_count":{"type":"integer","title":"Bytes Count"}},"type":"object","required":["id","name","description","strategy","proxy_ids","country_filter","type_filter","cdn_mode","enabled","request_count","bytes_count"],"title":"PoolOut"},"PoolUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy"},"proxy_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Proxy Ids"},"country_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Filter"},"type_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Filter"},"cdn_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cdn Mode"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"PoolUpdate"},"PortTestPayload":{"properties":{"port":{"type":"integer","title":"Port"},"target":{"type":"string","title":"Target","default":"localhost"}},"type":"object","required":["port"],"title":"PortTestPayload"},"PreviewPayload":{"properties":{"template":{"type":"string","title":"Template"},"event_key":{"type":"string","title":"Event Key","default":"test.preview"},"message":{"type":"string","title":"Message","default":"Mensaje de ejemplo"}},"type":"object","required":["template"],"title":"PreviewPayload"},"PromoteToSystemRequest":{"properties":{"recovery_key":{"type":"string","title":"Recovery Key"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["recovery_key"],"title":"PromoteToSystemRequest"},"PropagateBody":{"properties":{"overwrite":{"type":"boolean","title":"Overwrite","default":false}},"type":"object","title":"PropagateBody"},"ProviderStatus":{"properties":{"provider":{"type":"string","title":"Provider"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"total_channels":{"type":"integer","title":"Total Channels","default":0},"online_channels":{"type":"integer","title":"Online Channels","default":0},"offline_channels":{"type":"integer","title":"Offline Channels","default":0},"degraded_channels":{"type":"integer","title":"Degraded Channels","default":0},"unknown_channels":{"type":"integer","title":"Unknown Channels","default":0},"health_pct":{"type":"number","title":"Health Pct","default":0.0},"cron_jobs":{"items":{"type":"object"},"type":"array","title":"Cron Jobs","default":[]},"last_health_check":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Health Check"},"next_health_check":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Health Check"},"countdown_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Countdown Seconds"}},"type":"object","required":["provider"],"title":"ProviderStatus"},"ProxyCreate":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type","default":"socks5"},"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port"},"username":{"type":"string","title":"Username","default":""},"password":{"type":"string","title":"Password","default":""},"country":{"type":"string","title":"Country","default":""}},"type":"object","required":["name","host","port"],"title":"ProxyCreate"},"ProxyImportRequest":{"properties":{"text":{"type":"string","title":"Text"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","default":"http"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","default":""},"test_after_import":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Test After Import","default":true}},"type":"object","required":["text"],"title":"ProxyImportRequest"},"ProxyImportResult":{"properties":{"total_lines":{"type":"integer","title":"Total Lines"},"imported":{"type":"integer","title":"Imported"},"skipped":{"type":"integer","title":"Skipped"},"error_lines":{"items":{"type":"string"},"type":"array","title":"Error Lines","default":[]},"proxy_ids":{"items":{"type":"string"},"type":"array","title":"Proxy Ids","default":[]}},"type":"object","required":["total_lines","imported","skipped"],"title":"ProxyImportResult"},"ProxyOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","default":""},"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port"},"username":{"type":"string","title":"Username"},"country":{"type":"string","title":"Country"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"active"},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms","default":0},"last_check":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check"}},"type":"object","required":["id","name","host","port","username","country"],"title":"ProxyOut"},"ProxyUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","title":"ProxyUpdate"},"ProxyV2Create":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":""},"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","default":""},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","default":""},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","default":"http"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","default":""},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","default":""},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","default":""},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":true},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","default":[]}},"type":"object","required":["host","port"],"title":"ProxyV2Create"},"ProxyV2Out":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","default":""},"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port"},"username":{"type":"string","title":"Username","default":""},"password":{"type":"string","title":"Password","default":""},"type":{"type":"string","title":"Type","default":"http"},"status":{"type":"string","title":"Status","default":"unknown"},"country_code":{"type":"string","title":"Country Code","default":""},"city":{"type":"string","title":"City","default":""},"response_ms":{"type":"integer","title":"Response Ms","default":0},"fail_count":{"type":"integer","title":"Fail Count","default":0},"success_count":{"type":"integer","title":"Success Count","default":0},"last_check":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check"},"last_error":{"type":"string","title":"Last Error","default":""},"notes":{"type":"string","title":"Notes","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","host","port"],"title":"ProxyV2Out"},"ProxyV2Update":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"ProxyV2Update"},"RTMPInputCreate":{"properties":{"name":{"type":"string","title":"Name"},"stream_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stream Key"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ips","default":[]},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":true},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""},"service_preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Preset","default":"custom"},"recommended_video_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recommended Video Bitrate","default":0},"max_audio_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Audio Bitrate","default":0},"supported_codecs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Supported Codecs","default":[]},"auth_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auth Required","default":false},"auto_record":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Record","default":false},"record_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Path","default":""},"record_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Format","default":"mp4"},"transcode_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcode Profile Id","default":""},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","default":""},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","default":[]}},"type":"object","required":["name"],"title":"RTMPInputCreate"},"RTMPInputOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"stream_key":{"type":"string","title":"Stream Key"},"allowed_ips":{"items":{"type":"string"},"type":"array","title":"Allowed Ips","default":[]},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"enabled":{"type":"boolean","title":"Enabled","default":true},"last_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen"},"connected":{"type":"boolean","title":"Connected","default":false},"client_ip":{"type":"string","title":"Client Ip","default":""},"bytes_received":{"type":"integer","title":"Bytes Received","default":0},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"description":{"type":"string","title":"Description","default":""},"service_preset":{"type":"string","title":"Service Preset","default":"custom"},"recommended_video_bitrate":{"type":"integer","title":"Recommended Video Bitrate","default":0},"max_audio_bitrate":{"type":"integer","title":"Max Audio Bitrate","default":0},"supported_codecs":{"title":"Supported Codecs","default":"[]"},"auth_required":{"type":"boolean","title":"Auth Required","default":false},"auto_record":{"type":"boolean","title":"Auto Record","default":false},"record_path":{"type":"string","title":"Record Path","default":""},"record_format":{"type":"string","title":"Record Format","default":"mp4"},"output_targets":{"title":"Output Targets","default":"[]"},"transcode_profile_id":{"type":"string","title":"Transcode Profile Id","default":""},"notes":{"type":"string","title":"Notes","default":""},"tags":{"title":"Tags","default":"[]"},"current_bitrate_kbps":{"type":"integer","title":"Current Bitrate Kbps","default":0},"current_fps":{"type":"number","title":"Current Fps","default":0},"current_resolution":{"type":"string","title":"Current Resolution","default":""},"dropped_frames":{"type":"integer","title":"Dropped Frames","default":0},"total_uptime_seconds":{"type":"integer","title":"Total Uptime Seconds","default":0}},"type":"object","required":["id","name","stream_key"],"title":"RTMPInputOut"},"RTMPInputUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"stream_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stream Key"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ips"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"service_preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Preset"},"recommended_video_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recommended Video Bitrate"},"max_audio_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Audio Bitrate"},"supported_codecs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Supported Codecs"},"auth_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auth Required"},"auto_record":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Record"},"record_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Path"},"record_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Format"},"transcode_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcode Profile Id"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"RTMPInputUpdate"},"RateLimitTestPayload":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"requests":{"type":"integer","title":"Requests","default":20}},"type":"object","required":["endpoint"],"title":"RateLimitTestPayload"},"RecoverRequest":{"properties":{"recovery_key":{"type":"string","title":"Recovery Key"},"new_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Password"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"}},"type":"object","required":["recovery_key"],"title":"RecoverRequest"},"ReplyCreate":{"properties":{"message":{"type":"string","minLength":1,"title":"Message"}},"type":"object","required":["message"],"title":"ReplyCreate"},"RoleTemplateOut":{"properties":{"role":{"type":"string","title":"Role"},"level":{"type":"integer","title":"Level"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"default_permissions":{"type":"object","title":"Default Permissions","default":{}},"default_visibility":{"type":"object","title":"Default Visibility","default":{}},"default_limits":{"type":"object","title":"Default Limits","default":{}},"is_protected":{"type":"boolean","title":"Is Protected","default":true}},"type":"object","required":["role","level","label","description"],"title":"RoleTemplateOut"},"RoleTemplateUpdate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"default_permissions":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Default Permissions"},"default_visibility":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Default Visibility"},"default_limits":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Default Limits"}},"type":"object","title":"RoleTemplateUpdate"},"SSLSetupRequest":{"properties":{"domain":{"type":"string","title":"Domain"},"email":{"type":"string","title":"Email"},"app_port":{"type":"integer","title":"App Port","default":8888}},"type":"object","required":["domain","email"],"title":"SSLSetupRequest"},"SecuritySettingsRequest":{"properties":{"brute_force_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Brute Force Enabled"},"max_login_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Login Attempts"},"lockout_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lockout Minutes"},"captcha_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Provider"},"captcha_site_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Site Key"},"captcha_secret_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Secret Key"}},"type":"object","title":"SecuritySettingsRequest"},"SourceCreate":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","default":""},"priority":{"type":"integer","title":"Priority","default":1},"type":{"type":"string","title":"Type","default":"unknown"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","default":{}},"user_agent":{"type":"string","title":"User Agent","default":""},"referer":{"type":"string","title":"Referer","default":""},"cookies":{"additionalProperties":{"type":"string"},"type":"object","title":"Cookies","default":{}},"extractor":{"type":"string","title":"Extractor","default":""},"ttl":{"type":"integer","title":"Ttl","default":0},"drm_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Type","default":""},"drm_license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm License Url","default":""},"drm_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Key Id","default":""},"drm_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Key","default":""},"drm_extra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Extra","default":""},"hw_accel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hw Accel","default":"auto"},"hw_decode_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hw Decode Only","default":false},"custom_user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom User Agent","default":""},"backup_priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Priority","default":1},"format_flags":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Format Flags","default":{}},"http_options":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Http Options","default":{}},"restream_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Restream Mode","default":false},"advanced_url_options":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Advanced Url Options","default":{}},"ignore_subtitles":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ignore Subtitles","default":false},"segment_with_manifest_params":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Segment With Manifest Params","default":false},"segment_with_proxy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Segment With Proxy","default":false},"http_proxy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Http Proxy","default":""},"stream_loop":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stream Loop","default":0},"http_persistent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Http Persistent","default":false},"decryption_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decryption Key","default":""}},"type":"object","title":"SourceCreate"},"SourceOut":{"properties":{"id":{"type":"string","title":"Id"},"channel_id":{"type":"string","title":"Channel Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","default":""},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority","default":1},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","default":""},"health_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Health Score","default":0},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"active"},"extractor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extractor","default":""},"ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl","default":0},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","default":{}},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent","default":""},"referer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referer","default":""},"drm_type":{"type":"string","title":"Drm Type","default":""},"drm_license_url":{"type":"string","title":"Drm License Url","default":""},"drm_key_id":{"type":"string","title":"Drm Key Id","default":""},"drm_key":{"type":"string","title":"Drm Key","default":""},"drm_extra":{"type":"string","title":"Drm Extra","default":""},"hw_accel":{"type":"string","title":"Hw Accel","default":"auto"},"hw_decode_only":{"type":"boolean","title":"Hw Decode Only","default":false},"custom_user_agent":{"type":"string","title":"Custom User Agent","default":""},"backup_priority":{"type":"integer","title":"Backup Priority","default":1},"failover_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Failover At"},"format_flags":{"type":"object","title":"Format Flags","default":{}},"http_options":{"type":"object","title":"Http Options","default":{}},"restream_mode":{"type":"boolean","title":"Restream Mode","default":false},"advanced_url_options":{"type":"object","title":"Advanced Url Options","default":{}},"ignore_subtitles":{"type":"boolean","title":"Ignore Subtitles","default":false},"segment_with_manifest_params":{"type":"boolean","title":"Segment With Manifest Params","default":false},"segment_with_proxy":{"type":"boolean","title":"Segment With Proxy","default":false},"http_proxy":{"type":"string","title":"Http Proxy","default":""},"stream_loop":{"type":"integer","title":"Stream Loop","default":0},"http_persistent":{"type":"boolean","title":"Http Persistent","default":false},"decryption_key":{"type":"string","title":"Decryption Key","default":""},"last_check":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error","default":""},"fail_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fail Count","default":0},"success_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Success Count","default":0}},"type":"object","required":["id","channel_id","last_check"],"title":"SourceOut"},"SourceUpdate":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"referer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referer"},"cookies":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Cookies"},"extractor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extractor"},"ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl"},"drm_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Type"},"drm_license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm License Url"},"drm_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Key Id"},"drm_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Key"},"drm_extra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drm Extra"},"hw_accel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hw Accel"},"hw_decode_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hw Decode Only"},"custom_user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom User Agent"},"backup_priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Priority"},"format_flags":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Format Flags"},"http_options":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Http Options"},"restream_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Restream Mode"},"advanced_url_options":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Advanced Url Options"},"ignore_subtitles":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ignore Subtitles"},"segment_with_manifest_params":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Segment With Manifest Params"},"segment_with_proxy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Segment With Proxy"},"http_proxy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Http Proxy"},"stream_loop":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stream Loop"},"http_persistent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Http Persistent"},"decryption_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decryption Key"}},"type":"object","title":"SourceUpdate"},"SshSettingRequest":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"}},"type":"object","required":["key","value"],"title":"SshSettingRequest"},"StreamImportRequest":{"properties":{"source_type":{"type":"string","title":"Source Type"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name","default":""},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","default":""},"raw_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Content","default":""},"target_folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Folder Id"},"auto_country":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Country","default":true},"overwrite_existing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Overwrite Existing","default":false},"xtream_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Xtream Username"},"xtream_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Xtream Password"},"xtream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Xtream Url"}},"type":"object","required":["source_type"],"title":"StreamImportRequest"},"StreamImportRunOut":{"properties":{"id":{"type":"string","title":"Id"},"source_type":{"type":"string","title":"Source Type"},"source_name":{"type":"string","title":"Source Name","default":""},"source_url":{"type":"string","title":"Source Url","default":""},"target_folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Folder Id"},"count_total":{"type":"integer","title":"Count Total","default":0},"count_imported":{"type":"integer","title":"Count Imported","default":0},"count_skipped":{"type":"integer","title":"Count Skipped","default":0},"count_error":{"type":"integer","title":"Count Error","default":0},"status":{"type":"string","title":"Status","default":"pending"},"error":{"type":"string","title":"Error","default":""},"log":{"type":"string","title":"Log","default":""},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["id","source_type"],"title":"StreamImportRunOut"},"StreamMonitorOut":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"ts":{"type":"string","format":"date-time","title":"Ts"},"speed":{"type":"number","title":"Speed","default":0},"bitrate_kbps":{"type":"integer","title":"Bitrate Kbps","default":0},"memory_mb":{"type":"integer","title":"Memory Mb","default":0},"cpu_percent":{"type":"number","title":"Cpu Percent","default":0},"uptime_sec":{"type":"integer","title":"Uptime Sec","default":0},"triggered_action":{"type":"string","title":"Triggered Action","default":""}},"type":"object","required":["channel_id","ts"],"title":"StreamMonitorOut"},"StreamTransferRequest":{"properties":{"channel_ids":{"items":{"type":"string"},"type":"array","title":"Channel Ids"},"target_url":{"type":"string","title":"Target Url"},"target_token":{"type":"string","title":"Target Token"},"target_folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Folder Id"},"overwrite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Overwrite","default":false}},"type":"object","required":["channel_ids","target_url","target_token"],"title":"StreamTransferRequest","description":"Transfer one or many channels to a remote PlayerPROAR panel via API token."},"TagCreate":{"properties":{"name":{"type":"string","title":"Name"},"color":{"type":"string","title":"Color","default":"#3B82F6"},"icon":{"type":"string","title":"Icon","default":"tag"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"}},"type":"object","required":["name"],"title":"TagCreate"},"TagOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"type":"string","title":"Color"},"icon":{"type":"string","title":"Icon"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"auto":{"type":"boolean","title":"Auto"}},"type":"object","required":["id","name","color","icon","parent_id","auto"],"title":"TagOut"},"TelegramValidatePayload":{"properties":{"bot_token":{"type":"string","title":"Bot Token"}},"type":"object","required":["bot_token"],"title":"TelegramValidatePayload"},"TemplateApplyBody":{"properties":{"template_id":{"type":"string","title":"Template Id"},"target_ids":{"items":{"type":"string"},"type":"array","title":"Target Ids"},"overwrite":{"type":"boolean","title":"Overwrite","default":true}},"type":"object","required":["template_id","target_ids"],"title":"TemplateApplyBody"},"TemplateBody":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""},"role":{"type":"string","title":"Role"},"permissions":{"type":"object","title":"Permissions","default":{}},"visibility":{"type":"object","title":"Visibility","default":{}},"limits":{"type":"object","title":"Limits","default":{}}},"type":"object","required":["name","role"],"title":"TemplateBody"},"TestNotificationRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","default":"Test notification from PlayerPROAR"}},"type":"object","required":["channel_id"],"title":"TestNotificationRequest"},"TicketCreate":{"properties":{"title":{"type":"string","maxLength":255,"minLength":3,"title":"Title"},"message":{"type":"string","minLength":1,"title":"Message"},"priority":{"type":"string","title":"Priority","default":"normal"},"category":{"type":"string","title":"Category","default":"general"}},"type":"object","required":["title","message"],"title":"TicketCreate"},"TicketStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"}},"type":"object","required":["status"],"title":"TicketStatusUpdate"},"TranscodeProfileCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""},"video_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Video Config","default":{}},"audio_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Audio Config","default":{}},"subtitle_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Subtitle Config","default":{}},"output_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Output Config","default":{}},"hw_accel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hw Accel","default":"auto"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default","default":false}},"type":"object","required":["name"],"title":"TranscodeProfileCreate"},"TranscodeProfileOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""},"video_config":{"type":"object","title":"Video Config","default":{}},"audio_config":{"type":"object","title":"Audio Config","default":{}},"subtitle_config":{"type":"object","title":"Subtitle Config","default":{}},"output_config":{"type":"object","title":"Output Config","default":{}},"hw_accel":{"type":"string","title":"Hw Accel","default":"auto"},"is_default":{"type":"boolean","title":"Is Default","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name"],"title":"TranscodeProfileOut"},"TranscodeProfileUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"video_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Video Config"},"audio_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Audio Config"},"subtitle_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Subtitle Config"},"output_config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Output Config"},"hw_accel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hw Accel"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"}},"type":"object","title":"TranscodeProfileUpdate"},"UfwActionRequest":{"properties":{"action":{"type":"string","title":"Action"}},"type":"object","required":["action"],"title":"UfwActionRequest"},"UfwRuleRequest":{"properties":{"rule":{"type":"string","title":"Rule"},"delete":{"type":"boolean","title":"Delete","default":false}},"type":"object","required":["rule"],"title":"UfwRuleRequest"},"UnbanRequest":{"properties":{"ip":{"type":"string","title":"Ip"},"jail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jail"}},"type":"object","required":["ip"],"title":"UnbanRequest"},"UserCreate":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"role":{"type":"string","title":"Role"},"email":{"type":"string","title":"Email","default":""},"full_name":{"type":"string","title":"Full Name","default":""},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"limits":{"type":"object","title":"Limits","default":{}},"credits":{"type":"number","title":"Credits","default":0},"max_users":{"type":"integer","title":"Max Users","default":0},"max_connections":{"type":"integer","title":"Max Connections","default":1},"expires_at":{"anyOf":[{},{"type":"null"}],"title":"Expires At"},"notes":{"type":"string","title":"Notes","default":""},"allowed_bouquets":{"type":"string","title":"Allowed Bouquets","default":"[]"}},"type":"object","required":["username","password","role"],"title":"UserCreate"},"UserOut":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"type":"string","title":"Email","default":""},"role":{"type":"string","title":"Role"},"full_name":{"type":"string","title":"Full Name","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"credits":{"type":"number","title":"Credits","default":0},"max_users":{"type":"integer","title":"Max Users","default":0},"max_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Connections"},"expires_at":{"anyOf":[{},{"type":"null"}],"title":"Expires At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"instance_id":{"type":"string","title":"Instance Id","default":"default"},"is_system":{"type":"boolean","title":"Is System","default":false},"suspended":{"type":"boolean","title":"Suspended","default":false},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","username","role"],"title":"UserOut"},"UserUpdate":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"suspended":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Suspended"},"suspended_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspended Reason"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"custom_permissions":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Custom Permissions"},"visibility_overrides":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Visibility Overrides"},"limits":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Limits"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"credits":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits"},"max_users":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Users"},"max_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Connections"},"expires_at":{"anyOf":[{},{"type":"null"}],"title":"Expires At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"allowed_bouquets":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Allowed Bouquets"}},"type":"object","title":"UserUpdate"},"VPNAccountCreate":{"properties":{"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider","default":"custom"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"max_connections":{"type":"integer","title":"Max Connections","default":5},"countries":{"items":{"type":"string"},"type":"array","title":"Countries","default":[]},"config_data":{"title":"Config Data","default":""},"protocol":{"type":"string","title":"Protocol","default":"openvpn"}},"type":"object","required":["name","username","password"],"title":"VPNAccountCreate"},"VPNAccountOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider"},"username":{"type":"string","title":"Username"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"active"},"max_connections":{"type":"integer","title":"Max Connections"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"protocol":{"type":"string","title":"Protocol"},"config_data":{"anyOf":[{},{"type":"null"}],"title":"Config Data","default":{}},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"namespace_count":{"type":"integer","title":"Namespace Count","default":0},"channels_using":{"type":"integer","title":"Channels Using","default":0},"channels_failover":{"type":"integer","title":"Channels Failover","default":0}},"type":"object","required":["id","name","provider","username","max_connections","countries","protocol","created_at"],"title":"VPNAccountOut"},"VPNAccountUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"max_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Connections"},"countries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries"},"config_data":{"anyOf":[{},{"type":"null"}],"title":"Config Data"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"}},"type":"object","title":"VPNAccountUpdate"},"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"},"WebhookBody":{"properties":{"url":{"type":"string","title":"Url"},"secret":{"type":"string","title":"Secret","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["url"],"title":"WebhookBody"},"_ApplyToChannelsRequest":{"properties":{"channel_ids":{"items":{"type":"string"},"type":"array","title":"Channel Ids"}},"type":"object","required":["channel_ids"],"title":"_ApplyToChannelsRequest"},"_BulkDeleteIEHistoryReq":{"properties":{"ids":{"items":{"type":"string"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"_BulkDeleteIEHistoryReq"},"_IEPreviewReq":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"_IEPreviewReq"}}},"tags":[{"name":"channels","description":"Gestion de canales (CRUD, bulk actions, refresh URLs, on-demand)."},{"name":"folders","description":"Carpetas con asignacion de pais (multi-country)."},{"name":"countries","description":"Paises ISO. Habilitar/deshabilitar/anadir nuevos."},{"name":"nodes","description":"Cluster multi-server. Auto-registro, healthcheck, routing inteligente."},{"name":"vpn","description":"Cuentas VPN, namespaces Linux, cascade automatica."},{"name":"accounts","description":"Cuentas de servicios (Atresplayer, Tivify, Orange, etc)."},{"name":"automations","description":"Reglas de auto-reparacion + knowledge base."},{"name":"system","description":"Dashboard, configuracion del sistema, info."},{"name":"tags","description":"Tags / etiquetas para categorizar canales."},{"name":"health","description":"Health checks (manual y batch)."},{"name":"cron","description":"Cron jobs (programados via APScheduler)."},{"name":"logs","description":"Logs en tiempo real (WebSocket + buffer)."},{"name":"extractors","description":"Plugins de extraccion (YouTube, Pluto, etc)."},{"name":"import_export","description":"Import/export de canales (M3U, JSON, Xtream)."},{"name":"xtream","description":"Compatibilidad Xtream Codes API (login, get_live_streams, etc)."}]}