{"openapi":"3.1.0","info":{"title":"YouTube Research","description":"Research database for YouTube videos, playlists and knowledge extraction.","version":"1.6.39829"},"paths":{"/auth/google":{"get":{"summary":"Auth Google","description":"Startet den Google OAuth 2.0 Flow.\nIm Browser aufrufen: http://localhost:8000/auth/google\nBenötigt: client_secrets.json im App-Verzeichnis.","operationId":"auth_google_auth_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/callback":{"get":{"summary":"Auth Google Callback","description":"OAuth-Callback: Speichert Token + lädt Playlists sofort.\nWird automatisch von Google nach Zustimmung aufgerufen.","operationId":"auth_google_callback_auth_google_callback_get","parameters":[{"name":"code","in":"query","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"}}}}}}},"/watchlist":{"get":{"summary":"Get Pool","description":"Gibt alle Videos mit pool=1 als JSON-Liste zurück (kuratierte Sammlung).\nWird vom Pool-Tab im Frontend via fetch('/pool') aufgerufen.","operationId":"get_pool_watchlist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/watchlist/add/{video_id}":{"post":{"summary":"Pool Add","description":"Setzt pool=1 für das angegebene Video (zum Pool hinzufügen).\nWird durch expliziten Nutzer-Klick auf ⭐ ausgelöst.","operationId":"pool_add_watchlist_add__video_id__post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watchlist/remove/{video_id}":{"post":{"summary":"Pool Remove","description":"Setzt pool=0 für das angegebene Video (aus Pool entfernen).\nWird durch expliziten Nutzer-Klick auf ❌ ausgelöst.","operationId":"pool_remove_watchlist_remove__video_id__post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watchlist/clear":{"post":{"summary":"Watchlist Clear","description":"Entfernt alle Videos aus der Watchlist (setzt watchlist=0 für alle).","operationId":"watchlist_clear_watchlist_clear_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/watchlist/to-library/{video_id}":{"post":{"summary":"Pool To Library","description":"Übernimmt ein Watchlist-Video in die Bibliothek.\nSetzt pool_only=0 und watchlist=0 (entfernt aus Watchlist).","operationId":"pool_to_library_watchlist_to_library__video_id__post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/video/{video_id}":{"delete":{"summary":"Delete Video","description":"Löscht ein Video dauerhaft aus der lokalen Wissensdatenbank.\n\nBetrifft ausschließlich die lokale DB – keine Auswirkung auf YouTube.\nEntfernt alle abhängigen Einträge (Transkript, Kapitel, Links, Tags, Notizen, FTS).\n\nReturns 404 wenn das Video nicht existiert.","operationId":"delete_video_video__video_id__delete","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"View Video","description":"Display complete video details: summary, chapters, and transcript.","operationId":"view_video_video__video_id__get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/youtube/watchlater/{video_id}":{"delete":{"summary":"Remove From Watchlater","description":"Entfernt ein Video aus der YouTube Watch-Later-Playlist via playlistItems.delete.\nBetrifft NUR YouTube – das lokale Video in der Bibliothek bleibt erhalten.\nBenötigt gültiges OAuth-Token mit youtube.force-ssl Scope.\nGibt 404 zurück wenn keine playlist_item_id gespeichert ist (Video vor Feature-Einführung importiert).","operationId":"remove_from_watchlater_youtube_watchlater__video_id__delete","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sync/watchlater":{"get":{"summary":"Sync Watchlater Get","description":"Manueller Trigger für Watch-Later-Sync via GET (z. B. aus Browser oder Skript).\nGibt JSON mit Anzahl neuer Videos zurück.","operationId":"sync_watchlater_get_sync_watchlater_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Index","description":"Startseite mit Videobibliothek und Filter-Optionen.","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sync":{"post":{"summary":"Sync","description":"Synchronisiert die Watch Later Playlist (WL) via OAuth.\nLäuft synchron (blocking) – lokale Einzelnutzer-Anwendung.","operationId":"sync_sync_post","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/search":{"get":{"summary":"Search","description":"Kombinierte Suche: FTS5-Volltext + optionale Filter + Sortierung.\n\nWenn nur Filter gesetzt sind (kein Suchbegriff), werden alle passenden\nVideos sortiert zurückgegeben.  Mindestens ein Parameter muss gesetzt sein.","operationId":"search_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Volltext-Suchbegriff","default":"","title":"Q"},"description":"Volltext-Suchbegriff"},{"name":"language","in":"query","required":false,"schema":{"type":"string","description":"Sprachfilter: 'de' oder 'en'","title":"Language"},"description":"Sprachfilter: 'de' oder 'en'"},{"name":"domain_id","in":"query","required":false,"schema":{"type":"integer","description":"Domain-ID-Filter","title":"Domain Id"},"description":"Domain-ID-Filter"},{"name":"channel","in":"query","required":false,"schema":{"type":"string","description":"Kanal-Filter","title":"Channel"},"description":"Kanal-Filter"},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","description":"Von-Datum ISO 'YYYY-MM-DD'","title":"Date From"},"description":"Von-Datum ISO 'YYYY-MM-DD'"},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","description":"Bis-Datum ISO 'YYYY-MM-DD'","title":"Date To"},"description":"Bis-Datum ISO 'YYYY-MM-DD'"},{"name":"is_high_value","in":"query","required":false,"schema":{"type":"boolean","description":"Nur High-Value Videos","title":"Is High Value"},"description":"Nur High-Value Videos"},{"name":"strict_language","in":"query","required":false,"schema":{"type":"boolean","description":"Strict=True: exakt; False: inkl. NULL/unknown","default":true,"title":"Strict Language"},"description":"Strict=True: exakt; False: inkl. NULL/unknown"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"relevance|newest|oldest|channel_az|title_az","default":"relevance","title":"Sort"},"description":"relevance|newest|oldest|channel_az|title_az"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Max. Treffer","default":2000,"title":"Limit"},"description":"Max. Treffer"},{"name":"watched","in":"query","required":false,"schema":{"type":"string","description":"Gesehen-Filter: 'watched' | 'not-watched' | None","title":"Watched"},"description":"Gesehen-Filter: 'watched' | 'not-watched' | None"},{"name":"library_id","in":"query","required":false,"schema":{"type":"string","description":"Bibliotheks-Filter (ID oder 'none' für Videos ohne Bibliothek)","title":"Library Id"},"description":"Bibliotheks-Filter (ID oder 'none' für Videos ohne Bibliothek)"},{"name":"efficiency_only","in":"query","required":false,"schema":{"type":"boolean","description":"Nur Effizienz-Videos (duration <= 90s, Effizienz-Creator)","default":false,"title":"Efficiency Only"},"description":"Nur Effizienz-Videos (duration <= 90s, Effizienz-Creator)"},{"name":"transcript_filter","in":"query","required":false,"schema":{"type":"string","description":"Transkript-Filter: 'yes' | 'no' | None","title":"Transcript Filter"},"description":"Transkript-Filter: 'yes' | 'no' | None"},{"name":"skill_filter","in":"query","required":false,"schema":{"type":"string","description":"Skill-Filter: 'yes' | 'no' | None","title":"Skill Filter"},"description":"Skill-Filter: 'yes' | 'no' | None"},{"name":"topics","in":"query","required":false,"schema":{"type":"array","items":{},"description":"Topic-Filter: Liste von topic_keys","title":"Topics"},"description":"Topic-Filter: Liste von topic_keys"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/autocomplete":{"get":{"summary":"Autocomplete","description":"Gibt bis zu 8 Titelvorschläge für die Autovervollständigung zurück.","operationId":"autocomplete_api_autocomplete_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Suchbegriff (min. 2 Zeichen)","default":"","title":"Q"},"description":"Suchbegriff (min. 2 Zeichen)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transcript/{youtube_id}":{"get":{"summary":"View Transcript","description":"Display the complete transcript of a video with summary.","operationId":"view_transcript_transcript__youtube_id__get","parameters":[{"name":"youtube_id","in":"path","required":true,"schema":{"type":"string","title":"Youtube Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/youtube-channel-search":{"get":{"summary":"Youtube Channel Search","description":"Sucht eine YouTube-Kanal-ID anhand des Kanalnamens.","operationId":"youtube_channel_search_youtube_channel_search_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Kanal-Name","title":"Name"},"description":"Kanal-Name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/youtube-search":{"get":{"summary":"Youtube Search Live","description":"Live-Suche via YouTube Data API v3.\nKein automatisches Speichern – nur Anzeige.\nBerechnet Engagement-Score pro Video.\nFormel: ((views*0.5) + (engagement*3) + (views_per_day*0.2)) / (age_days**0.8)","operationId":"youtube_search_live_youtube_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Suchbegriff (optional wenn channel_id gesetzt)","title":"Q"},"description":"Suchbegriff (optional wenn channel_id gesetzt)"},{"name":"channel_id","in":"query","required":false,"schema":{"type":"string","description":"YouTube Kanal-ID fuer Kanal-Suche","title":"Channel Id"},"description":"YouTube Kanal-ID fuer Kanal-Suche"},{"name":"language","in":"query","required":false,"schema":{"type":"string","description":"Sprachfilter ISO 639-1, z. B. 'de'","title":"Language"},"description":"Sprachfilter ISO 639-1, z. B. 'de'"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"score | relevance | newest | views","default":"score","title":"Sort"},"description":"score | relevance | newest | views"},{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","description":"Max. Ergebnisse (1–50)","default":50,"title":"Max Results"},"description":"Max. Ergebnisse (1–50)"},{"name":"strict","in":"query","required":false,"schema":{"type":"boolean","description":"Strikter Sprachfilter via snippet-Metadaten","default":false,"title":"Strict"},"description":"Strikter Sprachfilter via snippet-Metadaten"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","description":"Zeitfilter: Letzte N Tage (z.B. 1, 7, 30, 365)","title":"Days"},"description":"Zeitfilter: Letzte N Tage (z.B. 1, 7, 30, 365)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/add-to-watchlist":{"post":{"summary":"Add To Pool","description":"Speichert ein YouTube-Video manuell im Pool.\nWird ausschließlich durch expliziten Nutzer-Klick ausgelöst.\nKein automatisches Speichern.","operationId":"add_to_pool_api_add_to_watchlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_AddToPoolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watchlist/add-bulk":{"post":{"summary":"Watchlist Add Bulk","description":"Fuegt mehrere Videos gleichzeitig zur Watchlist hinzu.\nNur Videos die bereits in der DB vorhanden sind werden bearbeitet.\nBody: { \"youtube_ids\": [\"abc123\", \"def456\", ...] }\nReturns: { \"added\": N, \"skipped\": M }","operationId":"watchlist_add_bulk_api_watchlist_add_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_BulkWatchlistRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/libraries/{library_id}/import-and-add":{"post":{"summary":"Import And Add To Library","description":"Importiert mehrere Videos (Basisdaten aus Live-Suche) direkt in die DB\nund weist sie sofort der Bibliothek zu.\nBody: { \"videos\": [{ \"youtube_id\", \"title\", \"channel\", \"published_at\", \"description\" }, ...] }","operationId":"import_and_add_to_library_api_libraries__library_id__import_and_add_post","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"integer","title":"Library Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels":{"get":{"summary":"Api Channels","description":"Gibt alle bekannten Kanalnamen aus der Bibliothek zurueck (fuer Dropdown).","operationId":"api_channels_api_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sync-watchlist-to-youtube":{"post":{"summary":"Api Sync Watchlist To Youtube","description":"Bidirektionale Synchronisation zwischen App-Watchlist und YouTube 'Watchlist' Playlist.\nRichtung 1: YouTube → App (neue Videos herunterladen)\nRichtung 2: App → YouTube (fehlende Videos hochladen)","operationId":"api_sync_watchlist_to_youtube_api_sync_watchlist_to_youtube_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/videos":{"get":{"summary":"Api Videos","description":"Return all videos as JSON (for external tools / scripts).","operationId":"api_videos_api_videos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stats":{"get":{"summary":"Api Stats","description":"Return dashboard statistics as JSON.","operationId":"api_stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/efficiency-creators":{"get":{"summary":"Api Efficiency Creators","description":"Gibt alle Effizienz-Creator zurück.\n\nEin Creator gilt als Effizienz-Creator wenn:\n- Durchschnittliche Video-Länge <= 90 Sekunden\n- Mindestens 3 Videos in der Datenbank\n\nReturns\n-------\nJSON-Array mit: channel, video_count, avg_duration_seconds,\n                avg_transcript_segments, is_efficiency_creator","operationId":"api_efficiency_creators_api_efficiency_creators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/efficiency-creators/refresh":{"post":{"summary":"Api Efficiency Creators Refresh","description":"Aktualisiert die is_efficiency_video-Flags für alle Videos.\nGibt die Anzahl der markierten Videos zurück.","operationId":"api_efficiency_creators_refresh_api_efficiency_creators_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/saved-searches":{"get":{"summary":"Api Get Saved Searches","description":"Gibt alle gespeicherten Suchen eines Typs zurück.","operationId":"api_get_saved_searches_api_saved_searches_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"library","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Api Save Search","description":"Speichert eine Suche in der Datenbank.","operationId":"api_save_search_api_saved_searches_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedSearchPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saved-searches/{search_type}/{name}":{"delete":{"summary":"Api Delete Saved Search","description":"Löscht eine gespeicherte Suche.","operationId":"api_delete_saved_search_api_saved_searches__search_type___name__delete","parameters":[{"name":"search_type","in":"path","required":true,"schema":{"type":"string","title":"Search Type"}},{"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"}}}}}}},"/fundus":{"get":{"summary":"Fundus Overview","operationId":"fundus_overview_fundus_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/fundus/{slug}":{"get":{"summary":"Fundus Detail","operationId":"fundus_detail_fundus__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"Statusfilter","default":"","title":"Status"},"description":"Statusfilter"},{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"Kategoriefilter","default":"","title":"Category"},"description":"Kategoriefilter"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sortierung","default":"imitation_score","title":"Sort"},"description":"Sortierung"}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fundus/collections":{"get":{"summary":"Api Get Fundus Collections","operationId":"api_get_fundus_collections_api_fundus_collections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Api Create Fundus Collection","operationId":"api_create_fundus_collection_api_fundus_collections_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundusCollectionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fundus/{collection_id}/items":{"post":{"summary":"Api Add Fundus Item","operationId":"api_add_fundus_item_api_fundus__collection_id__items_post","parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundusItemPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fundus/items/{item_id}":{"patch":{"summary":"Api Update Fundus Item","operationId":"api_update_fundus_item_api_fundus_items__item_id__patch","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundusItemUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Api Delete Fundus Item","operationId":"api_delete_fundus_item_api_fundus_items__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/add-to-watch-later/{video_id}":{"post":{"summary":"Api Add To Watch Later","description":"Fuegt ein Video zur Watchlist hinzu:\n1. Intern: watchlist=1 in der Datenbank\n2. YouTube: Video zur privaten Playlist 'Watchlist' hinzufuegen (falls OAuth aktiv)","operationId":"api_add_to_watch_later_api_add_to_watch_later__video_id__post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/generate-summaries":{"post":{"summary":"Api Generate Summaries","description":"Batch-Generierung von Summaries fuer Videos ohne/kurze Summary.","operationId":"api_generate_summaries_api_generate_summaries_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/generate-skills":{"post":{"summary":"Api Generate Skills","description":"Batch-Skill-Generierung via Claude API für KI-Bibliothek Videos ohne Skill.","operationId":"api_generate_skills_api_generate_skills_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skill-status":{"get":{"summary":"Api Skill Status","description":"Zeigt Skill-Generierungsstatus der KI-Bibliothek.","operationId":"api_skill_status_api_skill_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/summary-status":{"get":{"summary":"Api Summary Status","description":"Zeigt an wie viele Videos noch keine Summary haben.","operationId":"api_summary_status_api_summary_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/config/check":{"get":{"summary":"Config Check","operationId":"config_check_config_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/config/api-key":{"post":{"summary":"Config Set","operationId":"config_set_config_api_key_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"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/spateransehen":{"get":{"summary":"Get Spateransehen","description":"Gibt alle Videos in \"Später ansehen\" zurück (watchlist=1 AND library_id IS NULL).\nDiese Videos warten auf Bewertung.","operationId":"get_spateransehen_api_spateransehen_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/video/{video_id}/add-to-spateransehen":{"post":{"summary":"Add To Spateransehen","description":"Fügt ein Video zu \"Später ansehen\" hinzu (direkt, keine Library-Auswahl).","operationId":"add_to_spateransehen_api_video__video_id__add_to_spateransehen_post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/video/{video_id}/remove-from-spateransehen":{"delete":{"summary":"Remove From Spateransehen Api","description":"Entfernt ein Video aus \"Später ansehen\".","operationId":"remove_from_spateransehen_api_api_video__video_id__remove_from_spateransehen_delete","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/video/{video_id}/toggle-watched":{"post":{"summary":"Toggle Watched","description":"Wechselt den Gesehen-Status eines Videos.","operationId":"toggle_watched_api_video__video_id__toggle_watched_post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/video/{video_id}/watched":{"get":{"summary":"Get Watched","description":"Gibt den Gesehen-Status eines Videos zurück.","operationId":"get_watched_api_video__video_id__watched_get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/libraries":{"get":{"summary":"Get Libraries","description":"Gibt alle benutzerdefinierten Bibliotheken zurück.","operationId":"get_libraries_api_libraries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Library","description":"Erstellt eine neue Bibliothek.\nBody: {\"name\": \"...\", \"description\": \"...\", \"icon\": \"...\"}","operationId":"create_library_api_libraries_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Req"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/libraries/{library_id}":{"put":{"summary":"Update Library","description":"Aktualisiert Name und Icon einer Bibliothek.\nBody: {\"name\": \"...\", \"icon\": \"...\"}","operationId":"update_library_api_libraries__library_id__put","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"integer","title":"Library Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Library","description":"Löscht eine Bibliothek (Videos werden auf library_id=NULL gesetzt).","operationId":"delete_library_api_libraries__library_id__delete","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"integer","title":"Library Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/libraries/{library_id}/assign-all-unassigned":{"post":{"summary":"Assign All Unassigned","description":"Alle Videos ohne Bibliothek (library_id=NULL) dieser Bibliothek zuordnen.","operationId":"assign_all_unassigned_api_libraries__library_id__assign_all_unassigned_post","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"integer","title":"Library Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/libraries/{library_id}/add-videos":{"post":{"summary":"Add Videos To Library","description":"Mehrere Videos auf einmal einer Bibliothek zuordnen.\nBody: { \"video_ids\": [1, 2, 3, ...] }","operationId":"add_videos_to_library_api_libraries__library_id__add_videos_post","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"integer","title":"Library Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/libraries/{library_id}/add-by-youtube-ids":{"post":{"summary":"Add By Youtube Ids","description":"Videos anhand ihrer YouTube-IDs einer Bibliothek zuordnen.\nBody: { \"youtube_ids\": [\"abc123\", \"xyz456\", ...] }","operationId":"add_by_youtube_ids_api_libraries__library_id__add_by_youtube_ids_post","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"integer","title":"Library Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/libraries/unassign-videos":{"post":{"summary":"Unassign Videos","description":"ÄNDERUNG 3: Entfernt Videos aus allen Bibliotheken (setzt library_id auf NULL).\nBody: { \"video_ids\": [1, 2, 3, ...] }","operationId":"unassign_videos_api_libraries_unassign_videos_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Req"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos/{video_id}":{"patch":{"summary":"Patch Video","description":"Aktualisiert Felder eines Videos (z.B. library_id).\nBody: { \"library_id\": 1 }  oder  { \"library_id\": null }","operationId":"patch_video_api_videos__video_id__patch","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/video/{video_id}/move-to-library":{"post":{"summary":"Move To Library","description":"Verschiebt ein Video aus \"Später ansehen\" in eine Bibliothek.\nBody: {\"library_id\": <int>}","operationId":"move_to_library_api_video__video_id__move_to_library_post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/video/{video_id}/set-library":{"post":{"summary":"Api Set Video Library","description":"Weist ein Video einer Bibliothek zu (oder entfernt die Zuweisung).\nBody: {\"library_id\": <int> | null}","operationId":"api_set_video_library_api_video__video_id__set_library_post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/run":{"post":{"summary":"Pipeline Run","operationId":"pipeline_run_api_pipeline_run_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/run":{"post":{"summary":"Skills Run","operationId":"skills_run_api_skills_run_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/run_all":{"post":{"summary":"Pipeline Run All","operationId":"pipeline_run_all_api_pipeline_run_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/briefing-status":{"post":{"summary":"Set Briefing Status","description":"Setzt den Briefing-Status für ein oder mehrere Videos.\nBody: {\"updates\": [{\"youtube_id\": \"...\", \"status\": \"relevant|skip|later\"}]}","operationId":"set_briefing_status_api_briefing_status_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/restart":{"post":{"summary":"Restart Server","operationId":"restart_server_api_restart_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/shutdown":{"post":{"summary":"Shutdown Server","operationId":"shutdown_server_api_shutdown_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/new-features/topics":{"get":{"summary":"Api Feature Topics","description":"Gibt alle Topics mit Video-Anzahl zurück.","operationId":"api_feature_topics_api_new_features_topics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/new-features":{"get":{"summary":"Api New Features","operationId":"api_new_features_api_new_features_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":2000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/new-features/discover":{"get":{"summary":"Api Discover Features","description":"Sucht YouTube nach KI/Claude/Automation-Videos der letzten N Tage.\nGibt nur Videos zurück die noch NICHT in der DB sind.\nBei Quota-Fehler wird automatisch auf den nächsten API-Key gewechselt.","operationId":"api_discover_features_api_new_features_discover_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":14,"title":"Days"}},{"name":"channels_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Channels Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/followed-channels":{"get":{"summary":"Api Get Followed Channels","description":"Liste der abonnierten Kanäle (für Neue-Features-Discovery).","operationId":"api_get_followed_channels_api_followed_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Api Add Followed Channel","description":"Fügt einen Kanal hinzu. Body: {channel_id, channel_name} ODER {name} (wird aufgelöst).","operationId":"api_add_followed_channel_api_followed_channels_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/followed-channels/{channel_id}":{"delete":{"summary":"Api Remove Followed Channel","description":"Entfernt einen Kanal aus der Abo-Liste.","operationId":"api_remove_followed_channel_api_followed_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/video/{video_id}/set-feature-type":{"post":{"summary":"Api Set Feature Type","description":"Setzt oder entfernt feature_type für ein Video.\n\nBody (JSON):\n    {\n        \"feature_type\": \"new_feature\" | \"breaking_change\" | \"improvement\" | \"bugfix\" | null\n    }\n\nReturns:\n    {\"status\": \"ok\", \"video_id\": int, \"feature_type\": str | null}","operationId":"api_set_feature_type_api_video__video_id__set_feature_type_post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/new-features/refresh":{"post":{"summary":"Api New Features Refresh","description":"Klassifiziert alle Videos ohne feature_type neu (Keyword-Logik, kein KI-Aufruf).","operationId":"api_new_features_refresh_api_new_features_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/new-features/stats":{"get":{"summary":"Api New Features Stats","description":"Gibt eine Übersicht über Feature-Typen zurück.\n\nReturns:\n    {\n        \"total\": int,\n        \"new_feature\": int,\n        \"breaking_change\": int,\n        \"improvement\": int,\n        \"bugfix\": int\n    }","operationId":"api_new_features_stats_api_new_features_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/features/import-to-watchlist":{"post":{"summary":"Api Features Import To Watchlist","description":"Importiert YouTube-Videos (aus Discover) in die DB und fügt sie zur Watchlist hinzu.\nBody: { \"videos\": [{ \"youtube_id\", \"title\", \"channel\", \"published_at\" }, ...] }","operationId":"api_features_import_to_watchlist_api_features_import_to_watchlist_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/topics/compute":{"post":{"summary":"Api Compute Topics","description":"Berechnet topic_key fuer alle Videos ohne Topic (gleiche Logik wie JS computeTopicKey).","operationId":"api_compute_topics_api_topics_compute_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"FundusCollectionPayload":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["slug","title"],"title":"FundusCollectionPayload"},"FundusItemPayload":{"properties":{"video_id":{"type":"integer","title":"Video Id"},"source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"imitation_score":{"type":"integer","title":"Imitation Score","default":3},"feasibility":{"type":"string","title":"Feasibility","default":"mittel"},"effort":{"type":"string","title":"Effort","default":"mittel"},"transferability":{"type":"string","title":"Transferability","default":"mittel"},"repeatability":{"type":"string","title":"Repeatability","default":"mittel"},"expected_value":{"type":"string","title":"Expected Value","default":"mittel"},"rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rationale"},"review_status":{"type":"string","title":"Review Status","default":"offen"},"obsidian_artifact_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Obsidian Artifact Path"},"youtube_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Url"}},"type":"object","required":["video_id"],"title":"FundusItemPayload"},"FundusItemUpdatePayload":{"properties":{"collection_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Collection Id"},"video_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Id"},"source_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"imitation_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Imitation Score"},"feasibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feasibility"},"effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effort"},"transferability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transferability"},"repeatability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repeatability"},"expected_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Value"},"rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rationale"},"review_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Status"},"obsidian_artifact_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Obsidian Artifact Path"},"youtube_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Url"}},"type":"object","title":"FundusItemUpdatePayload"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SavedSearchPayload":{"properties":{"name":{"type":"string","title":"Name"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"type":{"type":"string","title":"Type","default":"library"}},"type":"object","required":["name","params"],"title":"SavedSearchPayload"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"_AddToPoolRequest":{"properties":{"youtube_id":{"type":"string","title":"Youtube Id"}},"type":"object","required":["youtube_id"],"title":"_AddToPoolRequest"},"_BulkWatchlistRequest":{"properties":{"youtube_ids":{"items":{"type":"string"},"type":"array","title":"Youtube Ids"}},"type":"object","required":["youtube_ids"],"title":"_BulkWatchlistRequest"}}}}