{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T21:41:24.523Z","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp","markdownUrl":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp.md","server":{"slug":"com-pandavideo-mcp","name":"Panda Video","registryName":"com.pandavideo/mcp","description":"Video hosting: upload, organize and configure videos, analytics, AI subtitles and Shorts.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"mcp","type":"remote","identifier":"https://mcp.pandavideo.com/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp","version":"2.1.0","transport":null,"scoredAt":"2026-11-05T08:24:51.429Z"},"score":{"total":92,"tier":"high trust","status":"scored","weekDelta":3,"history":[{"date":"2026-11-05","total":92},{"date":"2026-11-04","total":91},{"date":"2026-11-03","total":91},{"date":"2026-11-02","total":90},{"date":"2026-11-01","total":90},{"date":"2026-10-31","total":90},{"date":"2026-10-30","total":89},{"date":"2026-10-29","total":89},{"date":"2026-10-28","total":88},{"date":"2026-10-27","total":88},{"date":"2026-10-26","total":88},{"date":"2026-10-25","total":87},{"date":"2026-10-24","total":87},{"date":"2026-10-23","total":86},{"date":"2026-10-22","total":85},{"date":"2026-10-21","total":85},{"date":"2026-10-20","total":84},{"date":"2026-10-19","total":84},{"date":"2026-10-18","total":83},{"date":"2026-10-17","total":83},{"date":"2026-10-16","total":82},{"date":"2026-10-15","total":82},{"date":"2026-10-14","total":81},{"date":"2026-10-13","total":81},{"date":"2026-10-12","total":80},{"date":"2026-10-10","total":79},{"date":"2026-10-07","total":78}]},"categories":[{"name":"Endpoint Security","score":89,"verdict":"fail","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.","HTTPS is enforced; there's no plaintext access path.","HSTS check failed: the Strict-Transport-Security header is absent.","DNSSEC check failed: this domain isn't protected by DNSSEC.","The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.rfc9728_invoke","args":{}},{"code":"https.enforced","args":{}},{"code":"headers.hsts_absent","args":{}},{"code":"dnssec.absent","args":{}},{"code":"auth.registration_dcr_only","args":{}}]},{"name":"Transport & Reachability","score":100,"verdict":"pass","reasons":["Verified streamable-http transport via a live MCP handshake."],"codes":[{"code":"transport.verified","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":80,"verdict":"fail","reasons":["100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).","AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 27581 tokens (~126/item across 218 items; 216 tools + 2 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.descriptions","args":{"pct":"100"}},{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"126","items":"218","tools":"216","tokens":"27581","resources":"2"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":99,"verdict":"fail","reasons":["Stability check failed: schema churn in the 30 days we've observed: 0 tool removals, 2 breaking changes, 0 auth/transport breaks, 39 additions."],"codes":[{"code":"stability.churn","args":{"days":"30","added":"39","breaks":"2","removed":"0","auth_transport":"0"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 29 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 217 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_declared","args":{"pct":"100","annotated":"29","destructive":"29"}},{"code":"toolsafety.manipulation_clean","args":{"units":"217","judged":"217"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28."],"codes":[{"code":"protocol.supported","args":{"latest":"2026-07-28","version":"2025-11-25"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"mcp","type":"remote","identifier":"https://mcp.pandavideo.com/mcp","withdrawn":false,"score":92,"current":true,"url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp","markdownUrl":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp.md"}],"facts":[{"label":"Endpoint","value":"https://mcp.pandavideo.com/mcp"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"required"},{"label":"Version","value":"2.1.0"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"panda_list_videos","title":"List Videos","description":"List videos. Each video has: id, video_external_id, title, status, created_at, length (seconds), folder_id, config. `id` is what most tools take as video_id; video_external_id is what panda_get_best_times_by_videos / panda_get_viewers_by_videos take. Results are returned newest first by default. There is NO server-side date filter or sorting — to find videos created on a specific date, fetch videos and check created_at in the response.","inputs":[{"name":"folder_id","type":"string","required":false,"description":"Filter by folder ID"},{"name":"limit","type":"integer","required":false,"description":"Results per page (default: 25, max: 100)"},{"name":"page","type":"integer","required":false,"description":"Page number (default: 1)"},{"name":"status","type":"string","required":false,"description":"Filter by status (e.g. 'CONVERTED')"},{"name":"title","type":"string","required":false,"description":"Search by video title (partial match, case-insensitive)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":192},{"name":"panda_get_video","title":"Get Video","description":"Get full properties of a video by its ID, including video_external_id, config (config.ctas holds the pause/end thumbnail CTAs), profile, status, duration, folder, subtitles, etc.","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":59},{"name":"panda_update_video","title":"Update Video","description":"Update basic metadata of a video: title, description text, or move to a different folder. Do NOT use this for player settings, chapters, subtitles, thumbnails, or any playback configuration — use the specific tools for those.","inputs":[{"name":"description","type":"string","required":false,"description":"New video description"},{"name":"folder_id","type":"string","required":false,"description":"Folder ID to move the video into"},{"name":"title","type":"string","required":false,"description":"New video title"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":99},{"name":"panda_delete_videos","title":"Delete Videos","description":"Delete one or more videos by ID. Sends to trash for 30 days.","inputs":[{"name":"video_ids","type":"array","required":true,"description":"List of video IDs to delete (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":44},{"name":"panda_get_videos_status","title":"Get Videos Status (batch)","description":"Processing status of up to 100 videos in one call. Each item: {id, status, available_resolutions, pending_resolutions, encoding_resolutions, playable, conversion_percentage, estimated_time, ...}. No titles (use panda_get_video or panda_list_videos). IDs that don't exist or aren't yours come back in not_found. Returns {videos, not_found}.","inputs":[{"name":"video_ids","type":"array","required":true,"description":"Video IDs (1–100, no repeats)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":103},{"name":"panda_get_videos_ai_resources","title":"Get Videos AI Resources (batch)","description":"Which AI Package resources (e.g. eBook, quiz, mind map; one entry per type and language) up to 100 videos already have, in one call. Subtitles and dubbing are not included. Each item: {id, ai_resources: [{type, srclang}]} (type: abstract = eBook, mindmap, questions = quiz). A video that only has resources from the old AI package (legacy) comes back with an empty list here; panda_get_ai_resource_content shows them. No titles (use panda_get_video or panda_list_videos). IDs that don't exist or aren't yours come back in not_found. Returns {videos, not_found}.","inputs":[{"name":"video_ids","type":"array","required":true,"description":"Video IDs (1–100, no repeats)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":167},{"name":"panda_move_videos","title":"Move Videos","description":"Move one or more videos to a folder","inputs":[{"name":"folder_id","type":"string","required":true,"description":"Target folder ID, or \"root\" to move to the root (no folder)"},{"name":"video_ids","type":"array","required":true,"description":"List of video IDs to move (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":61},{"name":"panda_duplicate_video","title":"Duplicate Video","description":"Create a copy of a video. Only works for CONVERTED, non-external, non-funnel videos.","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID to duplicate"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":44},{"name":"panda_reencode_video","title":"Reencode Video","description":"Re-encode a video with a compression mode (no credit cost). The video is processed again from its original file (backup): without the backup the API refuses. Its current qualities are replaced by the re-encoded ones and it stays in processing until done. Encryption (HLS) is kept. To encrypt videos use panda_encrypt_videos.","inputs":[{"name":"compression_mode","type":"string","required":true,"description":"size = 'Econômica' (smaller files), balanced = 'Equilibrada', quality = 'Maior qualidade' (dashboard names)"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":127},{"name":"panda_upload_video_from_url","title":"Upload Video from URL","description":"Import a video from an external URL (YouTube, Vimeo, S3, generic HTTPS)","inputs":[{"name":"access_key","type":"string","required":false,"description":"S3 access key (for S3 imports only)"},{"name":"folder_id","type":"string","required":false,"description":"Folder to place the video in"},{"name":"secret_key","type":"string","required":false,"description":"S3 secret key (for S3 imports only)"},{"name":"source","type":"string","required":false,"description":"Source type (e.g. 'youtube', 'vimeo', 's3', or domain)"},{"name":"title","type":"string","required":false,"description":"Title for the imported video"},{"name":"url","type":"string","required":true,"description":"URL of the video to import"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":131},{"name":"panda_list_folders","title":"List Folders","description":"List all folders. Returns array of {id, name, parent_folder_id, status, created_at, videos_count}.","inputs":[{"name":"all_status","type":"number","required":false,"description":"1 to include deleted folders, 0 for active only"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":54},{"name":"panda_create_folder","title":"Create Folder","description":"Create a new folder. Returns the created {id, name, parent_folder_id}.","inputs":[{"name":"name","type":"string","required":true,"description":"Folder name"},{"name":"parent_folder_id","type":"string","required":false,"description":"Parent folder ID for nesting"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"panda_get_folder","title":"Get Folder","description":"Get a folder's details and one page of its videos. Returns {id, name, parent_folder_id, status, videos: [...], pagination: {page, limit, total_count, total_pages, has_next, has_prev}}. Only videos directly in this folder; subfolders are not included (use panda_list_folders). To list every video of a large folder, keep calling with page+1 while pagination.has_next is true. Default 20 videos per page, max 20.","inputs":[{"name":"folder_id","type":"string","required":true,"description":"Folder ID"},{"name":"limit","type":"integer","required":false,"description":"Videos per page (default: 20, max: 20)"},{"name":"page","type":"integer","required":false,"description":"Page of videos (default: 1)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":154},{"name":"panda_update_folder","title":"Update Folder","description":"Update folder properties (name, parent). Also used to recover deleted folders with status=true.","inputs":[{"name":"folder_id","type":"string","required":true,"description":"Folder ID"},{"name":"name","type":"string","required":false,"description":"New folder name"},{"name":"parent_folder_id","type":"string","required":false,"description":"New parent folder ID"},{"name":"status","type":"boolean","required":false,"description":"Set true to recover a deleted folder"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"panda_delete_folder","title":"Delete Folder","description":"Delete a folder by ID. WARNING: All videos and subfolders inside are also deleted (cascade). Goes to trash for 30 days.","inputs":[{"name":"folder_id","type":"string","required":true,"description":"Folder ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":47},{"name":"panda_list_playlists","title":"List Playlists","description":"List all playlists. Returns array of {id, name, videos_quantity, duration, access_type, updated_at}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":33},{"name":"panda_create_playlist","title":"Create Playlist","description":"Create a new playlist. Videos are REFERENCES — removing from playlist does NOT delete the video. Returns the created {id, name, description, access_type}.","inputs":[{"name":"access_type","type":"string","required":false,"description":"Access type — REQUIRED by the Panda API; defaults to anyone_with_link"},{"name":"creator_name","type":"string","required":false,"description":"Creator name displayed in player — REQUIRED by the API; defaults to the playlist name"},{"name":"description","type":"string","required":false,"description":"Playlist description"},{"name":"name","type":"string","required":true,"description":"Playlist name"},{"name":"password","type":"string","required":false,"description":"Password (for password-protected playlists)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":118},{"name":"panda_get_playlist","title":"Get Playlist","description":"Get details of a specific playlist. Returns {id, name, description, videos_quantity, access_type, creator_name, duration, updated_at}.","inputs":[{"name":"playlist_id","type":"string","required":true,"description":"Playlist ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":48},{"name":"panda_update_playlist","title":"Update Playlist","description":"Update a playlist's properties","inputs":[{"name":"access_type","type":"string","required":false,"description":"Access type"},{"name":"creator_name","type":"string","required":false,"description":"Creator name"},{"name":"description","type":"string","required":false,"description":"New description"},{"name":"image_id","type":"string","required":false,"description":"Logo image ID"},{"name":"name","type":"string","required":false,"description":"New name"},{"name":"password","type":"string","required":false,"description":"Password"},{"name":"playlist_id","type":"string","required":true,"description":"Playlist ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":82},{"name":"panda_delete_playlist","title":"Delete Playlist","description":"Delete a playlist. Videos are NOT deleted — only the collection is removed.","inputs":[{"name":"playlist_id","type":"string","required":true,"description":"Playlist ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":34},{"name":"panda_get_playlist_videos","title":"Get Playlist Videos","description":"List all videos in a playlist. Returns array of {id, video_id, order, video: {id, title, duration}}.","inputs":[{"name":"playlist_id","type":"string","required":true,"description":"Playlist ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"panda_add_videos_to_playlist","title":"Add Videos to Playlist","description":"Add videos to a playlist with order. Returns the updated playlist video entries [{video_id, playlist_id, order}].","inputs":[{"name":"playlist_id","type":"string","required":true,"description":"Playlist ID"},{"name":"videos","type":"array","required":true,"description":"Videos to add with order"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":58},{"name":"panda_remove_video_from_playlist","title":"Remove Video from Playlist","description":"Remove a video from a playlist. Does NOT delete the video.","inputs":[{"name":"playlist_id","type":"string","required":true,"description":"Playlist ID"},{"name":"video_id","type":"string","required":true,"description":"Video ID to remove"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"panda_list_profiles","title":"List Profiles","description":"List the account's player profiles (GET /profile). 'Profiles' are player UI configs, not user accounts. Returns an array of {id, name, pullzone_name, is_default, updated_at, videos_count, feature_tags, colors, availableQualities}. The default profile ('Padrão') has is_default=true. Exclusive profiles (a single video's own customized player) are NOT listed. Use panda_get_profile for a profile's full settings. No pagination.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":104},{"name":"panda_create_profile","title":"Create Profile","description":"Create a player profile (POST /profile) already configured — colors, controls, caption appearance (colors.captionsColor / captionsBackgroundColor + captionsSize), VSL, save progress, general (speed, theme, gear menu, offline) and availableQualities, all in one call. Send only what you want to set; the rest uses the player defaults. `name` is any label (3–100 chars). The new profile has no videos: link them with panda_apply_profile_to_videos. To make it the account default use panda_set_default_profile. Returns {id, name, isDefault}.","inputs":[{"name":"availableQualities","type":"array","required":false,"description":"Qualities the viewer can pick, e.g. [\"480p\",\"720p\",\"1080p\"]. Empty list = all qualities."},{"name":"captionsSize","type":"string","required":false,"description":"Caption font size by the dashboard name: extra_small (10px), small (12px), normal (14px, default), large (16px), extra_large (18px). Use the user's word ('legenda grande' / 'large captions' → large)."},{"name":"colors","type":"object","required":false,"description":"Player colors, including caption text/background. Only the colors you send change — the others are kept."},{"name":"controls","type":"array","required":false,"description":"Array of enabled player controls (incl. \"play-large\" = Botão de Play Grande). Values: \"play-large\", \"rewind\", \"play\", \"fast-forward\", \"progress\", \"current-time\", \"volume\", \"captions\", \"settings\", \"pi…"},{"name":"exclusive","type":"boolean","required":false,"description":"True = a single video's own profile (hidden from panda_list_profiles). Leave unset for a shared profile."},{"name":"general","type":"object","required":false,"description":"General player settings (speed, search-in-video, theme, gear menu, offline). Merged into the current values — keys you omit are kept."},{"name":"hideControlsOnStart","type":"boolean","required":false,"description":"Hide controls until user interacts"},{"name":"name","type":"string","required":true,"description":"Profile name shown in the dashboard (3–100 chars)"},{"name":"saveProgress","type":"object","required":false,"description":"Save progress / resume settings"},{"name":"vsl","type":"object","required":false,"description":"VSL (Video Sales Letter) settings — controls autoplay, smart autoplay, fake progress bar, muted indicator"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":465},{"name":"panda_get_profile","title":"Get Profile","description":"Get one player profile with all its settings: controls, colors (incl. caption colors and captionsFontSize), vsl, saveProgress, hideControlsOnStart, general (speed, theme, gear menu, offline, caption size), availableQualities, is_default and feature_tags.","inputs":[{"name":"profile_id","type":"string","required":true,"description":"Profile ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":76},{"name":"panda_update_profile","title":"Update Profile","description":"Update a player profile's settings. Changes EVERY video linked to the profile. Covers: player colors (colors.primaryColor / controlsColor), enabled controls list, smart autoplay (vsl.smartAutoplay), VSL mode (vsl.disablePause / disableForward / alternativeProgress), playback speed (general.default_speed), save progress, theme and gear menu (general.theme / general.settingsControls), offline (general.video_offline_enabled…), availableQualities, and CAPTION APPEARANCE: text/background colors (colors.captionsColor / captionsBackgroundColor, hex with #, alpha allowed) and size by name (captionsSize: extra_small | small | normal | large | extra_large — use the user's word). Colors are merged with the current ones (only the colors you send change); general is merged too. controls, vsl, saveProgress and availableQualities REPLACE the current value — send the complete object/list. Do NOT use this tool for: chapters (use panda_update_video_config), subtitle generation (use panda_generate_ai_subtitles), thumbnails, or title/description (use panda_update_video).","inputs":[{"name":"availableQualities","type":"array","required":false,"description":"Qualities the viewer can pick, e.g. [\"480p\",\"720p\",\"1080p\"]. Empty list = all qualities."},{"name":"captionsSize","type":"string","required":false,"description":"Caption font size by the dashboard name: extra_small (10px), small (12px), normal (14px, default), large (16px), extra_large (18px). Use the user's word ('legenda grande' / 'large captions' → large)."},{"name":"colors","type":"object","required":false,"description":"Player colors, including caption text/background. Only the colors you send change — the others are kept."},{"name":"controls","type":"array","required":false,"description":"Array of enabled player controls (incl. \"play-large\" = Botão de Play Grande). Values: \"play-large\", \"rewind\", \"play\", \"fast-forward\", \"progress\", \"current-time\", \"volume\", \"captions\", \"settings\", \"pi…"},{"name":"exclusive","type":"boolean","required":false,"description":"Dedicate/restrict the profile to a single video"},{"name":"general","type":"object","required":false,"description":"General player settings (speed, search-in-video, theme, gear menu, offline). Merged into the current values — keys you omit are kept."},{"name":"hideControlsOnStart","type":"boolean","required":false,"description":"Hide controls until user interacts"},{"name":"name","type":"string","required":false,"description":"Rename the profile (3–100 chars)"},{"name":"profile_id","type":"string","required":true,"description":"Profile ID"},{"name":"saveProgress","type":"object","required":false,"description":"Save progress / resume settings"},{"name":"vsl","type":"object","required":false,"description":"VSL (Video Sales Letter) settings — controls autoplay, smart autoplay, fake progress bar, muted indicator"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":562},{"name":"panda_delete_profile","title":"Delete Profile","description":"Delete a player profile. The default profile ('Padrão') cannot be deleted. A profile with no videos is deleted directly. A profile WITH videos needs `strategy` — ask the user which one: 'keep' = each video keeps its current look (gets its own copy of the profile's settings); 'migrate' = the videos move to `target_profile_id`. Up to 5 videos are processed immediately; more are queued (status 'pending') and the profile disappears once all videos are moved. If any video fails, the profile is NOT deleted.","inputs":[{"name":"profile_id","type":"string","required":true,"description":"Profile ID"},{"name":"strategy","type":"string","required":false,"description":"Required when the profile has videos: 'keep' (videos keep their look) or 'migrate' (videos move to target_profile_id)"},{"name":"target_profile_id","type":"string","required":false,"description":"Profile that receives the videos — required with strategy 'migrate'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":189},{"name":"panda_apply_profile_to_videos","title":"Apply Profile to Videos","description":"Link a player profile to videos — pass video_ids OR folder_id (every video in that folder, any status; subfolders are not included). A video that had its own customized player (exclusive profile) loses that customization. Up to 5 video_ids are applied immediately; more videos, or any folder_id, are queued and return status 'pending' — confirm later with panda_get_profile (videos_count). Returns {status, message}.","inputs":[{"name":"folder_id","type":"string","required":false,"description":"Folder ID — applies to all its videos (instead of video_ids)"},{"name":"profile_id","type":"string","required":true,"description":"Profile ID to apply"},{"name":"video_ids","type":"array","required":false,"description":"List of video IDs to apply the profile to (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":154},{"name":"panda_duplicate_profile","title":"Duplicate Profile","description":"Copy a player profile's settings into a new profile named '<name> (2)', '(3)'… The copy has no videos and is never the default. Exclusive profiles (a single video's own player) cannot be duplicated. Returns {id, name}.","inputs":[{"name":"profile_id","type":"string","required":true,"description":"Profile ID to copy"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":72},{"name":"panda_restore_profile","title":"Restore Profile","description":"Reset a player profile to the account's global player settings (panda_get_player_config): controls, colors, VSL, general, save progress, hideControlsOnStart and availableQualities are all replaced — this also drops the profile's theme, gear menu, caption size and offline settings unless the global has them. Changes every video linked to the profile. Returns the restored profile.","inputs":[{"name":"profile_id","type":"string","required":true,"description":"Profile ID to restore"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":98},{"name":"panda_set_default_profile","title":"Set Default Profile","description":"Make a profile the account's default player profile ('Padrão'). Exclusive profiles cannot be default. If the current default profile has videos, ASK the user what happens to them and pass unlinked_videos_strategy: 'apply-new' = they follow the new default; 'keep-current' = they stay with the current profile. Without it only the default flag changes and no video is touched. Video changes run in the background (videoMigrationQueued). Returns {message, id, videoMigrationQueued}.","inputs":[{"name":"profile_id","type":"string","required":true,"description":"Profile ID that becomes the default"},{"name":"unlinked_videos_strategy","type":"string","required":false,"description":"What happens to the videos of the current default: 'apply-new' (follow the new default) or 'keep-current' (stay as they are)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":165},{"name":"panda_list_lives","title":"List Lives","description":"List all live streams. Returns array of {id, title, status, scheduled_at, region, quality_package, save_vod, stream_key_id, stream_key, rtmp, live_player, created_at}. Status: provisioning (channel starting), offline (waiting for signal or scheduled), online, finishing, finished, finished_imported (recording became a video), expired (no signal in time; can be regenerated). stream_key is a secret credential: show it only when the user asks for it (e.g. to set up OBS).","inputs":[{"name":"page","type":"number","required":false,"description":"Page number (default 1, 100 per page)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":138},{"name":"panda_create_live","title":"Create Live","description":"Create a new live stream event. Trial accounts cannot create lives. A quality_package above the plan's maximum is silently lowered to the plan's maximum. Without stream_key_id the account's default stream key is used; a key held by another live (online, provisioning, expired, waiting to start or scheduled within 24h) returns 400. Omitted fields use the API defaults (region us, save_vod true).","inputs":[{"name":"folder_id","type":"string","required":false,"description":"Folder ID for recording"},{"name":"quality_package","type":"string","required":false,"description":"Quality package: sd, hd, fhd (Full HD) or 4k"},{"name":"region","type":"string","required":false,"description":"Broadcast region: us (USA) or br (Brazil, lower delay for viewers in Brazil)"},{"name":"save_vod","type":"boolean","required":false,"description":"Save the recording as a video when the live ends (default true)"},{"name":"scheduled_at","type":"string","required":false,"description":"Scheduled start: YYYY-MM-DDTHH:MM[:SS]. Without a zone it is Brasília time (UTC-3); add Z or ±HH:MM when the user is elsewhere."},{"name":"stream_key_id","type":"string","required":false,"description":"Stream key ID (panda_list_stream_keys); default key when omitted"},{"name":"title","type":"string","required":true,"description":"Live title (min 3 characters)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":261},{"name":"panda_get_live","title":"Get Live","description":"Get details of a specific live stream. Returns {id, title, status, scheduled_at, stream_key, rtmp, live_hls, created_at}. Status: provisioning (channel starting), offline (waiting for signal or scheduled), online, finishing, finished, finished_imported (recording became a video), expired (no signal in time; can be regenerated). stream_key is a secret credential: show it only when the user asks for it (e.g. to set up OBS).","inputs":[{"name":"live_id","type":"string","required":true,"description":"Live ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":118},{"name":"panda_regenerate_live","title":"Regenerate Live","description":"Regenerate an expired live so it can be broadcast again. Only works when status is expired (otherwise 400 with the current status). Keeps the same stream key, but the RTMP server may change: update it in OBS. Start broadcasting within 15 minutes or the live expires again. Returns {id, status: provisioning, stream_key, stream_key_id, rtmp, region, started_at}. stream_key is a secret credential: show it only when the user asks for it (e.g. to set up OBS).","inputs":[{"name":"live_id","type":"string","required":true,"description":"Live ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":126},{"name":"panda_finish_live","title":"Finish Live","description":"End a live broadcast","inputs":[{"name":"live_id","type":"string","required":true,"description":"Live ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":24},{"name":"panda_delete_lives","title":"Delete Lives","description":"Delete one or more live streams","inputs":[{"name":"live_ids","type":"array","required":true,"description":"List of live IDs to delete (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":35},{"name":"panda_list_stream_keys","title":"List Stream Keys","description":"List all stream keys for live broadcasting. Returns array of {id, title, region, default, stream_key, in_use, in_use_by: {live_id, title, status}, created_at}. A key is held (in_use) by a live that is online, provisioning, expired, waiting to start or scheduled within 24h; an expired live holds it until regenerated or deleted. stream_key is a secret credential: show it only when the user asks for it (e.g. to set up OBS).","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"panda_create_stream_key","title":"Create Stream Key","description":"Create a new stream key for OBS or other streaming software. The account's first key becomes the default.","inputs":[{"name":"region","type":"string","required":false,"description":"Region: us (default) or br"},{"name":"set_default","type":"boolean","required":false,"description":"Make it the default key for new lives"},{"name":"title","type":"string","required":true,"description":"Stream key title (min 3 characters)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":77},{"name":"panda_get_live_viewers","title":"Get Live Viewers","description":"Get viewer history for a live stream. Returns time-series array of viewer counts.","inputs":[{"name":"live_id","type":"string","required":true,"description":"Live ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":37},{"name":"panda_get_account_analytics","title":"Get Account Analytics","description":"Get general analytics metrics for the whole account. Returns {views, unique_viewers, watch_time_seconds, avg_watch_percentage, plays}.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD)"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":64},{"name":"panda_get_video_analytics","title":"Get Video Analytics","description":"Get analytics metrics for a specific video. Returns {views, unique_viewers, watch_time_seconds, avg_watch_percentage, plays}.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD)"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD)"},{"name":"video_id","type":"string","required":true,"description":"Video ID — the `id` field from panda_list_videos, NOT video_external_id"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":89},{"name":"panda_get_retention_analytics","title":"Get Retention Analytics","description":"Get audience retention analytics (account-wide or per video). Returns array of {percentage, viewers} showing drop-off at each point.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD)"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD)"},{"name":"video_id","type":"string","required":false,"description":"Video ID — the `id` field from panda_list_videos, NOT video_external_id (omit for account-wide)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":95},{"name":"panda_get_ranking_analytics","title":"Get Ranking Analytics","description":"Get ranking analytics for the account. Returns {most_watched: [{video_id, title, watch_time}], most_played: [{video_id, title, plays}]}.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD)"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"panda_get_realtime_analytics","title":"Get Realtime Analytics","description":"Get the real-time snapshot of the account: how many viewers are watching now and on which devices. Returns {total_users, devices: {mobile, desktop, others}, geojson} — geojson (the dashboard map clusters) comes empty in this account-wide snapshot; no per-viewer data (IP, browser) is returned.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":79},{"name":"panda_get_bandwidth_analytics","title":"Get Bandwidth Analytics","description":"Get bandwidth/traffic usage by folder, by video, or DRM by video. Returns array of {name, bandwidth_bytes, video_id?} entries.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD)"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD)"},{"name":"type","type":"string","required":false,"description":"Traffic type — 'all' (regular, required by the API) or 'drm'"},{"name":"video_id","type":"string","required":false,"description":"Video ID (omit for folder-level)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":109},{"name":"panda_get_unwatched_videos","title":"Get Unwatched Videos","description":"List the account's videos that had NO access at all in a period (the inverse of the ranking). Whole account only. Only videos that already existed on start_date are considered. Returns {start_date, end_date, data: [{id, video_external_id, title, created_at}], pagination: {limit, offset, total_unwatched, has_more}, coverage: {partial_coverage, missing_days}} — when partial_coverage is true, a listed video may have had access on the missing days.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD). Default: today."},{"name":"limit","type":"integer","required":false,"description":"Videos per page (default 50, max 500)"},{"name":"offset","type":"integer","required":false,"description":"Pagination offset (default 0)"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":196},{"name":"panda_get_best_times","title":"Get Best Times (Account)","description":"Which weekday and 2-hour slot the audience of the WHOLE account plays the most (or sees the player the most) in a period — \"best time to publish\". Weekday × 2-hour slot grid, summed over the period — the same grid as the dashboard heatmap (Analytics → Best times), with the hours exactly as Panda analytics stores them. Returns {start_date, end_date, metric, best_slots: [{weekday, hours, total}] (top 10), by_weekday, by_hours}. For specific videos or a folder use panda_get_best_times_by_videos.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD). Default: today."},{"name":"metric","type":"string","required":false,"description":"'plays' = unique plays (dashboard default) or 'impressions' = unique player views"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":205},{"name":"panda_get_best_times_by_videos","title":"Get Best Times by Videos","description":"Which weekday and 2-hour slot the audience of specific videos (or of every video in a folder) plays the most in a period. Weekday × 2-hour slot grid, summed over the period — the same grid as the dashboard heatmap (Analytics → Best times), with the hours exactly as Panda analytics stores them. An end_date of today counts only up to yesterday (the API clamps it). Returns {scope, start_date, end_date, metric, videos_count, best_slots: [{weekday, hours, total}] (top 10), by_weekday, by_hours, warnings}.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD). Default: today."},{"name":"folder_id","type":"string","required":false,"description":"Folder ID: uses every video in the folder (up to 5000). Use this OR video_external_ids."},{"name":"metric","type":"string","required":false,"description":"'plays' = unique plays (dashboard default) or 'impressions' = unique player views"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."},{"name":"video_external_ids","type":"array","required":false,"description":"video_external_id of each video (field `video_external_id` from panda_list_videos / panda_get_video — NOT the `id`). Max 2000. Use this OR folder_id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":286},{"name":"panda_get_viewers_by_videos","title":"Get Viewers by Videos","description":"Who watched specific videos (or any video of a folder) in a period: distinct viewers, identified by IP. The IP is returned MASKED (a.b.x.x) — the full list is in the dashboard (Analytics → Users). The selection only chooses WHICH viewers appear: each viewer's metrics (play, view, watch_time) cover the whole account, not only these videos. Returns {scope, start_date, end_date, total_viewers, viewers: [{viewer_ip, play, view, unique_play, unique_view, watch_time_seconds, videos_watched}] (most plays first), warnings}.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD). Default: today."},{"name":"folder_id","type":"string","required":false,"description":"Folder ID: uses every video in the folder (up to 5000). Use this OR video_external_ids."},{"name":"limit","type":"integer","required":false,"description":"How many viewers to list (default 50, max 500); total_viewers counts all"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."},{"name":"video_external_ids","type":"array","required":false,"description":"video_external_id of each video (field `video_external_id` from panda_list_videos / panda_get_video — NOT the `id`). Max 2000. Use this OR folder_id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":288},{"name":"panda_list_funnels","title":"List Funnels","description":"List all funnels. Returns {data: [{id, name, videos_count, created_at}]}. A funnel with videos_count=0 has no videos. Funnels are NOT folders.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"panda_create_funnel","title":"Create Funnel","description":"Create a new video funnel","inputs":[{"name":"description","type":"string","required":false,"description":"Funnel description"},{"name":"name","type":"string","required":true,"description":"Funnel name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":34},{"name":"panda_get_funnel","title":"Get Funnel","description":"Get a funnel's details and its videos. Returns {data: {id, name, videos: [{id, title, status, is_first}]}}. Funnels are NOT folders.","inputs":[{"name":"funnel_id","type":"string","required":true,"description":"Funnel ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":57},{"name":"panda_update_funnel","title":"Update Funnel","description":"Update a funnel's properties (rename)","inputs":[{"name":"description","type":"string","required":false,"description":"New description"},{"name":"funnel_id","type":"string","required":true,"description":"Funnel ID"},{"name":"id","type":"string","required":true,"description":"Funnel ID (required in body too)"},{"name":"name","type":"string","required":false,"description":"New name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":60},{"name":"panda_delete_funnel","title":"Delete Funnel","description":"Delete a funnel by ID. WARNING: this is destructive. The funnel is removed and the videos inside it go to the trash for 30 days (restoring the funnel's folder brings them back; the funnel does not come back).","inputs":[{"name":"funnel_id","type":"string","required":true,"description":"Funnel ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":67},{"name":"panda_add_videos_to_funnel","title":"Add Videos to Funnel","description":"Add one or more videos to a funnel with optional coordinates. Every call must mark exactly one video with is_first: true — it becomes the entry video. To add a video without changing the entry, also send the current entry video (from panda_get_funnel) with is_first: true.","inputs":[{"name":"id","type":"string","required":true,"description":"Funnel ID"},{"name":"videos","type":"array","required":true,"description":"Videos to add with optional positions"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":94},{"name":"panda_remove_videos_from_funnel","title":"Remove Videos from Funnel","description":"Remove one or more videos from a funnel. The videos leave the funnel and go to the library root — they are not deleted (the dashboard deletes them in a second call; this tool does not).","inputs":[{"name":"id","type":"string","required":true,"description":"Funnel ID"},{"name":"video_ids","type":"array","required":true,"description":"Video IDs to remove (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":78},{"name":"panda_get_watermark_status","title":"Get Watermark Status","description":"Check whether watermark/DRM is currently active on the account. Returns {active: boolean}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":30},{"name":"panda_enable_watermark","title":"Enable Watermark","description":"Enable watermark protection for the account","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":17},{"name":"panda_disable_watermark","title":"Disable Watermark","description":"Disable watermark protection for the account","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":17},{"name":"panda_list_watermark_groups","title":"List Watermark Groups","description":"List all watermark groups. Returns array of {id, name, active, video_ids: [], folder_ids: [], created_at}.","inputs":[{"name":"limit","type":"integer","required":false,"description":"Results per page (default: 25, max: 100)"},{"name":"page","type":"integer","required":false,"description":"Page number (default: 1)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":71},{"name":"panda_create_watermark_group","title":"Create Watermark Group","description":"Create a new watermark group","inputs":[{"name":"name","type":"string","required":true,"description":"Group name"},{"name":"video_ids","type":"array","required":false,"description":"Videos to include in this group (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":44},{"name":"panda_get_watermark_group","title":"Get Watermark Group","description":"Get a watermark group's details. Returns {id, name, video_ids: [], folder_ids: [], created_at}.","inputs":[{"name":"drm_group_id","type":"string","required":true,"description":"Watermark group ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":47},{"name":"panda_update_watermark_group","title":"Update Watermark Group","description":"Update a watermark group","inputs":[{"name":"drm_group_id","type":"string","required":true,"description":"Watermark group ID"},{"name":"name","type":"string","required":false,"description":"New group name"},{"name":"video_ids","type":"array","required":false,"description":"Updated video list (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":54},{"name":"panda_delete_watermark_group","title":"Delete Watermark Group","description":"Delete a watermark group","inputs":[{"name":"drm_group_id","type":"string","required":true,"description":"Watermark group ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":29},{"name":"panda_manage_drm_group_items","title":"Manage DRM Group Items","description":"Add or remove videos and/or folders from a DRM watermark group. Returns the updated group with current video_ids and folder_ids.","inputs":[{"name":"action","type":"string","required":true,"description":"Whether to add or remove items"},{"name":"drm_group_id","type":"string","required":true,"description":"Watermark group ID"},{"name":"folder_ids","type":"array","required":false,"description":"Folder IDs"},{"name":"video_ids","type":"array","required":false,"description":"Video IDs"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":83},{"name":"panda_get_thumbnails","title":"Get Thumbnails","description":"Get the cover (start thumbnail) of a video. Returns {response: {active, default}}: active = the uploaded cover in use (absent when none was uploaded), default = the automatic thumbnails generated from the video. Pause and end thumbnails are NOT listed here — they are CTAs in the video's player config (panda_get_video_player_config → ctas with type 'pause' / 'end').","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":103},{"name":"panda_add_thumbnail","title":"Add Start Thumbnail (Cover)","description":"Upload the video cover (start thumbnail) — the image shown before the user presses play. Provide `image_url` pointing to a publicly reachable image (PNG/JPG/GIF); the tool downloads it and uploads as multipart to the Panda API. Replaces any existing start thumbnail. After this returns, the cover is active immediately for the player.","inputs":[{"name":"image_url","type":"string","required":true,"description":"Public URL of the image to use as the cover"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":106},{"name":"panda_add_pause_thumbnail","title":"Add Pause Thumbnail","description":"Upload a pause thumbnail — an image shown when the viewer pauses the video. Provide `image_url` pointing to a publicly reachable JPG, PNG or GIF up to 5 MB. The upload also creates the pause CTA, so the image shows in the player right away, for the whole video. A video can have several pause thumbnails. Returns {response: {pauseThumbnail: [<thumb_name>]}} — keep that name: panda_delete_thumbnail needs it to remove this image. Time window and button overlay are edited in the dashboard pause-thumbnail editor.","inputs":[{"name":"image_url","type":"string","required":true,"description":"Public URL of the image to upload"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":145},{"name":"panda_add_end_thumbnail","title":"Add End Thumbnail","description":"Upload an end thumbnail — an image shown after the video finishes. Provide `image_url` pointing to a publicly reachable JPG, PNG or GIF up to 5 MB. The upload also creates the end CTA, so the image shows in the player right away. A video has one end thumbnail: a new upload replaces the previous one. Returns {response: {endThumbnail: <name>}}.","inputs":[{"name":"image_url","type":"string","required":true,"description":"Public URL of the image to upload"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"panda_delete_thumbnail","title":"Delete Thumbnail","description":"Delete a thumbnail from a video (image and its player CTA). Type: 'start' (default, the cover), 'pause', 'end'. For 'pause', thumb_name is required and must be the exact file name — returned by panda_add_pause_thumbnail, or metadata.thumbId of the 'pause' CTA in panda_get_video_player_config. The tool checks the name against the video's pause thumbnails first and refuses (listing the existing names) when it does not match exactly.","inputs":[{"name":"thumb_name","type":"string","required":false,"description":"Exact pause thumbnail file name (required for type 'pause')"},{"name":"type","type":"string","required":false,"description":"Thumbnail type to delete"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":145},{"name":"panda_get_subtitles","title":"Get Subtitles","description":"Get all subtitle information for a video","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":28},{"name":"panda_get_subtitle_by_language","title":"Get Subtitle by Language","description":"Get a subtitle file for a specific language","inputs":[{"name":"srclang","type":"string","required":true,"description":"Language code (e.g. pt-BR, en, es)"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":52},{"name":"panda_delete_subtitle","title":"Delete Subtitle","description":"Remove a subtitle from a video by language","inputs":[{"name":"srclang","type":"string","required":true,"description":"Language code to delete (e.g. pt-BR, en, es)"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":52},{"name":"panda_generate_ai_subtitles","title":"Generate AI Subtitles","description":"Generate subtitles for a video using Panda AI. Creates a transcription in the specified language. Costs credits based on video duration and tier.","inputs":[{"name":"additional_langs","type":"array","required":false,"description":"Additional languages to translate into (e.g. ['en', 'es'])"},{"name":"from_lang","type":"string","required":true,"description":"Source language code (e.g. 'pt-BR', 'en', 'es')"},{"name":"tier","type":"string","required":false,"description":"Quality tier: 'essential' (clean audio, 3 langs, 1 credit/30min), 'advanced' (multi-speaker, 34 langs, 1 credit/5min), 'pro' (complex, 34 langs, 1 credit/min)"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":156},{"name":"panda_update_subtitle_visibility","title":"Update Subtitle Visibility","description":"Show or hide a subtitle language (hidden subtitles are not visible but still indexable for search)","inputs":[{"name":"hidden","type":"boolean","required":true,"description":"true = hide subtitle, false = show"},{"name":"srclang","type":"string","required":true,"description":"Language code (e.g. 'pt-BR', 'en')"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":76},{"name":"panda_download_subtitle","title":"Download Subtitle","description":"Download a subtitle file for a specific language","inputs":[{"name":"srclang","type":"string","required":true,"description":"Language code (e.g. 'pt-BR', 'en')"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":50},{"name":"panda_get_videos_count","title":"Get Videos Count","description":"Get total video count by status (CONVERTED, CONVERTING, DRAFT, etc.)","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":31},{"name":"panda_get_custom_fields","title":"Get Custom Fields","description":"Get all custom fields for a video. Returns array of {id, key, value} metadata pairs.","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":41},{"name":"panda_create_custom_field","title":"Create Custom Field","description":"Create a custom metadata key-value field for a video (for tagging/categorization). Do NOT use this for chapters, subtitles, CTAs, or player settings — use the specific tools for those. Max 50 fields per video.","inputs":[{"name":"key","type":"string","required":true,"description":"Field key/name"},{"name":"value","type":"string","required":true,"description":"Field value"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":86},{"name":"panda_list_users","title":"List Users","description":"List all users in the organization. Returns array of {id, name, email, role_id, role_name, created_at}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":35},{"name":"panda_create_user","title":"Create User","description":"Create a new user in the organization. Returns the created {id, name, email, role_id}.","inputs":[{"name":"email","type":"string","required":true,"description":"User email"},{"name":"name","type":"string","required":true,"description":"User full name"},{"name":"role_id","type":"string","required":false,"description":"Role ID to assign"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":61},{"name":"panda_update_user","title":"Update User","description":"Update a user's information or role","inputs":[{"name":"name","type":"string","required":false,"description":"New name"},{"name":"role_id","type":"string","required":false,"description":"New role ID"},{"name":"user_id","type":"string","required":true,"description":"User ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"panda_delete_user","title":"Delete User","description":"Remove a user from the organization","inputs":[{"name":"user_id","type":"string","required":true,"description":"User ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":26},{"name":"panda_request_download","title":"Request Download","description":"Request an async download for a video. Only works for CONVERTED, non-external, non-Hotmart videos. Returns {status, url?}: when status is 'ready' the response already has `url` (a temporary signed link); otherwise poll panda_check_download_status with the same format/quality/language. Lipsync dubbing is a separate video: to download it, pass the video_external_id of that language's entry in config.lipsync_info[] (panda_get_video) and language = that language.","inputs":[{"name":"format","type":"string","required":true,"description":"Download format"},{"name":"language","type":"string","required":true,"description":"Audio language: 'default' for the original audio, or the code of a dubbed audio of the video (e.g. 'en', 'es' — see audios[] in panda_get_video). 'original' is read as 'default'."},{"name":"quality","type":"string","required":true,"description":"Quality: one of 240p, 360p, 480p, 720p, 1080p, 1440p, 2160p, original ('1080' is read as '1080p'). 'original' is the uploaded file; the others must be in the video's available_resolutions."},{"name":"video_external_id","type":"string","required":true,"description":"Video external ID"},{"name":"video_title","type":"string","required":true,"description":"Video title (for the download file name)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":283},{"name":"panda_check_download_status","title":"Check Download Status","description":"Check the status of an async download request (same format/quality/language used in panda_request_download). Returns {status, url?} — `url` (a temporary signed link) is present when status is 'ready'.","inputs":[{"name":"format","type":"string","required":true,"description":"Requested format"},{"name":"language","type":"string","required":true,"description":"Audio language: 'default' for the original audio, or the code of a dubbed audio of the video (e.g. 'en', 'es' — see audios[] in panda_get_video). 'original' is read as 'default'."},{"name":"quality","type":"string","required":true,"description":"Quality: one of 240p, 360p, 480p, 720p, 1080p, 1440p, 2160p, original ('1080' is read as '1080p'). 'original' is the uploaded file; the others must be in the video's available_resolutions."},{"name":"video_external_id","type":"string","required":true,"description":"Video external ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":206},{"name":"panda_list_shorts","title":"List Shorts","description":"List all Shorts jobs. Projects expire after ~30 days. Returns array of {job_id, status, user_context: {video_title, source_type}, completed_segments, created_at}.","inputs":[{"name":"page","type":"number","required":false,"description":"Page number (default 1)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":60},{"name":"panda_import_video_for_shorts","title":"Import Video for Shorts","description":"Import a video for AI shorts generation. Sources: library (video_id), youtube (source_url). Default config: vertical aspect, 30-60s duration, no captions. Video must be CONVERTED, 5min-5hrs, <50GB, no DRM.","inputs":[{"name":"aspect_ratio","type":"string","required":false,"description":"Output format (default: vertical)"},{"name":"contexts","type":"array","required":false,"description":"AI context hints: 'engajamento','educacional','humor','motivacional','personalizado'"},{"name":"duration_preset","type":"string","required":false,"description":"Clip duration range in seconds (default: 30-60)"},{"name":"end_time","type":"number","required":false,"description":"End time in seconds to clip to (default: full video)"},{"name":"source_type","type":"string","required":true,"description":"Source: 'library' for Panda video, 'youtube' for YouTube URL"},{"name":"source_url","type":"string","required":false,"description":"YouTube URL (required when source_type=youtube)"},{"name":"start_time","type":"number","required":false,"description":"Start time in seconds to clip from (default: 0)"},{"name":"video_id","type":"string","required":false,"description":"Video ID from Panda library (required when source_type=library)"},{"name":"video_title","type":"string","required":false,"description":"Title for the project (defaults to 'Shorts Project')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":252},{"name":"panda_list_short_segments","title":"List Short Segments","description":"List all generated segments (clips) for a Shorts job. Each segment has viralScore, duration, transcription.","inputs":[{"name":"job_id","type":"string","required":true,"description":"Shorts job ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"panda_delete_short","title":"Delete Short","description":"Delete a Shorts job/project","inputs":[{"name":"job_id","type":"string","required":true,"description":"Shorts job ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":26},{"name":"panda_save_segment_to_library","title":"Save Segment to Library","description":"Save a Short segment to the video library as an independent video","inputs":[{"name":"folder_id","type":"string","required":false,"description":"Folder ID to save into"},{"name":"segment_id","type":"string","required":true,"description":"Segment ID"},{"name":"title","type":"string","required":false,"description":"Title for the saved video"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":59},{"name":"panda_list_ai_assistants","title":"List AI Assistants","description":"List all AI video assistants. Returns array of {id, name, status, videos: [{id, title}], created_at}.","inputs":[{"name":"limit","type":"integer","required":false,"description":"Results per page (default: 25, max: 100)"},{"name":"page","type":"integer","required":false,"description":"Page number (default: 1)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":72},{"name":"panda_get_ai_assistant","title":"Get AI Assistant","description":"Get an AI assistant's details. Returns {id, name, status, videos: [{id, title}], files: [{id, file_name}], answers_count}.","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"AI assistant ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":55},{"name":"panda_create_ai_assistant","title":"Create AI Assistant","description":"Purchase credits and create a new AI assistant for a video. Returns the created {id, name, status, video_id}.","inputs":[{"name":"name","type":"string","required":false,"description":"Assistant name"},{"name":"video_id","type":"string","required":true,"description":"Video ID to bind the assistant to"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":60},{"name":"panda_get_ai_assistant_purchase_overview","title":"Get AI Assistant Purchase Overview","description":"Get credit cost overview before creating an AI assistant. Returns {credit_cost, current_balance, sufficient_credits}.","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"panda_update_ai_assistant","title":"Update AI Assistant","description":"Update AI assistant information (name, status, etc.)","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"AI assistant ID"},{"name":"name","type":"string","required":false,"description":"New name"},{"name":"status","type":"string","required":false,"description":"New status (e.g. 'ready', 'disabled')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":60},{"name":"panda_update_ai_assistant_video_bindings","title":"Update AI Assistant Video Bindings","description":"Bind videos to an AI assistant (Tutor). Additive: only videos not yet bound are added; videos already bound stay as they are and nothing is unbound (use panda_remove_tutor_video to remove one). Only CONVERTED videos: if any ID doesn't exist or isn't CONVERTED, the whole request is refused. Billing: each NEW video without a subtitle in the tutor's language gets a transcription, charged at ceil(minutes/5) credits per video (Gold/Enterprise plans outside trial get free transcriptions up to a daily limit); without enough credits the API refuses before binding anything.","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"AI assistant ID"},{"name":"lang","type":"string","required":false,"description":"Language code; only used when the tutor has no language set"},{"name":"video_ids","type":"array","required":true,"description":"Video IDs to add (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":180},{"name":"panda_update_ai_assistant_chat_visibility","title":"Update AI Assistant Chat Visibility","description":"Show or hide the AI chat widget on the video player","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"AI assistant ID"},{"name":"visible","type":"boolean","required":true,"description":"True to show, false to hide"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":50},{"name":"panda_delete_ai_assistant","title":"Delete AI Assistant","description":"Delete an AI assistant","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"AI assistant ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":27},{"name":"panda_generate_tutor_file_upload_url","title":"Generate Tutor File Upload URL","description":"Generate a presigned URL to upload a PDF/file to a Tutor AI assistant. Returns upload_url and file_id. After uploading, call panda_confirm_tutor_file_upload.","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"Tutor assistant ID"},{"name":"file_name","type":"string","required":true,"description":"File name (e.g. 'guide.pdf')"},{"name":"file_size","type":"number","required":true,"description":"File size in bytes"},{"name":"file_type","type":"string","required":true,"description":"MIME type (e.g. 'application/pdf')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":104},{"name":"panda_confirm_tutor_file_upload","title":"Confirm Tutor File Upload","description":"Confirm that a file was successfully uploaded to a Tutor AI assistant (call after uploading to the presigned URL)","inputs":[{"name":"file_id","type":"string","required":true,"description":"File ID returned from generate_file_upload_url"},{"name":"upload_success","type":"boolean","required":true,"description":"true if upload succeeded"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":62},{"name":"panda_delete_tutor_file","title":"Delete Tutor File","description":"Delete a file from a Tutor AI assistant","inputs":[{"name":"file_id","type":"string","required":true,"description":"File ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":30},{"name":"panda_add_tutor_videos","title":"Add Tutor Videos","description":"Add videos to a Tutor AI assistant. Additive: only videos not yet bound are added; videos already bound stay as they are and nothing is unbound (use panda_remove_tutor_video to remove one). Only CONVERTED videos: if any ID doesn't exist or isn't CONVERTED, the whole request is refused. Billing: each NEW video without a subtitle in the tutor's language gets a transcription, charged at ceil(minutes/5) credits per video (Gold/Enterprise plans outside trial get free transcriptions up to a daily limit); without enough credits the API refuses before binding anything.","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"Tutor assistant ID"},{"name":"lang","type":"string","required":false,"description":"Language code; only used when the tutor has no language set"},{"name":"video_ids","type":"array","required":true,"description":"Video IDs to add (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":177},{"name":"panda_remove_tutor_video","title":"Remove Tutor Video","description":"Remove ONE video from a Tutor AI assistant: the tutor stops using it and its knowledge is deleted from the tutor. The video stays in the library. Refused when the video isn't bound to the tutor, when it is the tutor's last video (use panda_delete_ai_assistant to delete the tutor), and while the video is still being processed by the tutor (queued/processing — try again when it finishes). Returns {assistant_id, video_id}.","inputs":[{"name":"assistant_id","type":"string","required":true,"description":"Tutor assistant ID"},{"name":"video_id","type":"string","required":true,"description":"Video ID to remove from the tutor (one per call)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":132},{"name":"panda_create_ai_dubbing","title":"Create AI Dubbing","description":"Create an AI dubbing of a video into one target language. The path follows the video's subtitles, like the dashboard: target already subtitled → audio only (DUBBING, reuses that subtitle); source subtitled → TRANSLATION + dubbing; otherwise TRANSCRIPTION + dubbing (also creates the source subtitle). Costs 5 credits/min (standard AI dubbing, HeyGen audio only) or 14 credits/min (lipsync) per language; minimum 1 min, a partial minute counts only past 1 s. Refuses lipsync on a video that already has standard dubbing (and the inverse), lipsync over 60 min, and a balance below the cost. Returns {video_id, path, from_lang, to_lang, cost_credits, response} — response is the queued work (for TRANSCRIPTION, the transcription work; the dubbing work is created when it finishes).","inputs":[{"name":"clone_original_voice","type":"boolean","required":false,"description":"Clone original voice"},{"name":"from_lang","type":"string","required":false,"description":"Spoken (source) language code, e.g. 'pt-BR'. Default: the video's original language, else 'auto' (detected). Only used on the TRANSLATION/TRANSCRIPTION paths."},{"name":"is_lipsync","type":"boolean","required":false,"description":"Use LipSync (lip sync, 14 credits/min). Default: standard AI dubbing (HeyGen, audio only, 5 credits/min)"},{"name":"num_speakers","type":"number","required":false,"description":"Number of speakers in the video"},{"name":"replace_existing_subtitles","type":"boolean","required":false,"description":"Same as the dashboard's 'Replace subtitles' option; only sent when the target language already has a subtitle. The API currently accepts it but does not regenerate the subtitle."},{"name":"to_lang","type":"string","required":true,"description":"Target language code (e.g. 'en', 'es')"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":386},{"name":"panda_delete_dubbing_audio","title":"Delete Dubbing Audio","description":"Delete a dubbed audio track from a video","inputs":[{"name":"audio_id","type":"string","required":true,"description":"Audio track ID to delete"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"panda_generate_ai_resource","title":"Generate AI Resource","description":"Generate ONE AI package resource of a video — eBook, mind map or quiz — in one or more languages, with its settings and extra instructions (same as the dashboard: Video Settings → Panda AI). PAID: 1 credit per minute of video per language (minimum 1 min; a partial minute counts only past 1 s), e.g. a 10-minute video in 2 languages = 20 credits. On an active Gold/Enterprise plan the free daily AI quota covers the whole request while it lasts (1 use per request, checked before sending). Languages that already have this resource, or are still generating, are skipped (listed in skipped); the balance is checked before sending. The resource is ready in a few minutes; follow it with panda_get_ai_workflows. Returns {video_id, resource, from_lang, to_langs, skipped, gross_cost_credits, cost_credits, free_by_daily_quota, response}; response is the queued request (its id isn't a work id: the works show up in panda_get_ai_workflows once processed). To redo an existing one use panda_regenerate_ai_resource.","inputs":[{"name":"custom_instructions","type":"string","required":false,"description":"Extra instructions for the AI (up to 1000 characters)"},{"name":"ebook_config","type":"object","required":false,"description":"eBook only: layout, fonts, colors, format, header/footer, logo"},{"name":"from_lang","type":"string","required":false,"description":"Spoken language of the video. Default: the video's original language, else 'auto'"},{"name":"image_generation_count","type":"integer","required":false,"description":"eBook only: AI images in the eBook (dashboard offers 0, 3, 5 or 10; default 10)"},{"name":"mindmap_config","type":"object","required":false,"description":"Mind map only: orientation, color"},{"name":"quiz_config","type":"object","required":false,"description":"Quiz only: questions, options per question and quiz options"},{"name":"resource","type":"string","required":true,"description":"ebook, mindmap or quiz"},{"name":"to_langs","type":"array","required":false,"description":"Languages to generate in, e.g. ['pt-BR','en']. Default: the video's language"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":433},{"name":"panda_get_ai_resource_content","title":"Get AI Resource Content","description":"Read the CONTENT of one AI package resource of a video in one language: the quiz questions and options (correct ones marked) and its options, the mind map topics, or the eBook cover, style and chapters (with `chapter`, that chapter's text; the whole text when short). Also says whether the resource can be edited (legacy = generated by the old package, not editable; uploaded PDF eBook = no content). Read-only. Use before panda_update_ai_resource. To list which resources a video has use panda_get_videos_ai_resources.","inputs":[{"name":"chapter","type":"integer","required":false,"description":"eBook only: chapter number whose text to return"},{"name":"lang","type":"string","required":false,"description":"Language of the resource, e.g. 'en'. Default: the only one, else the video's language"},{"name":"resource","type":"string","required":true,"description":"ebook, mindmap or quiz"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":191},{"name":"panda_update_ai_resource","title":"Update AI Resource","description":"Edit an existing AI package resource of a video in one language, like the dashboard editor — free. Quiz: send `questions` (the WHOLE new list, 1 to 10 questions, 2 to 5 options each, read it first with panda_get_ai_resource_content) and/or `quiz_settings`. Mind map: `mindmap_edits` (replace an excerpt that exists in one topic only) and/or `mindmap_settings`. eBook: `ebook_edits` (replace an excerpt that exists once in the text), `cover` and/or `ebook_config` (style, logo); the eBook is then recomposed from its text (manual formatting done in the dashboard editor may be lost; images stay) and the new PDF is ready in about 1 minute. Legacy resources (old package) and uploaded PDF eBooks can't be edited. Returns {video_id, resource, lang, saved, changes}; read the result with panda_get_ai_resource_content.","inputs":[{"name":"cover","type":"object","required":false,"description":"eBook: cover texts that change"},{"name":"ebook_config","type":"object","required":false,"description":"eBook: style that changes (layout, fonts, colors, format, logo)"},{"name":"ebook_edits","type":"array","required":false,"description":"eBook: text replacements"},{"name":"lang","type":"string","required":true,"description":"Language of the resource, e.g. 'en'"},{"name":"mindmap_edits","type":"array","required":false,"description":"Mind map: text replacements in topics"},{"name":"mindmap_settings","type":"object","required":false,"description":"Mind map: orientation, color"},{"name":"questions","type":"array","required":false,"description":"Quiz: the whole new list of questions (replaces the current one)"},{"name":"quiz_settings","type":"object","required":false,"description":"Quiz: turn its options on/off"},{"name":"resource","type":"string","required":true,"description":"ebook, mindmap or quiz"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":369},{"name":"panda_regenerate_ai_resource","title":"Regenerate AI Resource","description":"Generate AGAIN an existing AI package resource of a video in one language — PAID and cannot be undone: the current one is deleted first, including every edit made to it. Cost: 1 credit per minute of video (minimum 1 min; a partial minute counts only past 1 s); free on an active Gold/Enterprise plan while the daily AI quota lasts (checked before sending). Without new settings it reuses the previous ones. Refused while the resource is still generating, for uploaded PDF eBooks, or when the balance doesn't cover it. Also the way to make a legacy (old package) resource editable. Returns {video_id, resource, lang, gross_cost_credits, cost_credits, free_by_daily_quota, response}; response is the queued request, and while it generates the resource is missing from the video.","inputs":[{"name":"custom_instructions","type":"string","required":false,"description":"Extra instructions for the AI"},{"name":"ebook_config","type":"object","required":false,"description":"eBook only: new style"},{"name":"image_generation_count","type":"integer","required":false,"description":"eBook only: AI images (0 to 10)"},{"name":"lang","type":"string","required":true,"description":"Language of the resource to regenerate, e.g. 'en'"},{"name":"mindmap_config","type":"object","required":false,"description":"Mind map only: orientation, color"},{"name":"quiz_config","type":"object","required":false,"description":"Quiz only: questions, options and quiz options"},{"name":"resource","type":"string","required":true,"description":"ebook, mindmap or quiz"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":304},{"name":"panda_delete_ai_resource","title":"Delete AI Resource","description":"Delete ONE AI package resource of a video in one language (eBook, mind map or quiz) — cannot be undone: its content, PDF, images and the published file are removed, also for legacy resources. Same as the dashboard's Remove. Refused while it is still generating (checked before deleting; if that check fails nothing is deleted). Other languages and resources stay. To remove a failed generation card use panda_delete_ai_workflow.","inputs":[{"name":"lang","type":"string","required":true,"description":"Language of the resource to delete, e.g. 'en'"},{"name":"resource","type":"string","required":true,"description":"ebook, mindmap or quiz"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":141},{"name":"panda_create_ai_resource","title":"Create AI Resource Manually","description":"Create a quiz or mind map WITH CONTENT YOU PROVIDE (no AI, free) in a language that doesn't have one yet — the dashboard's \"Add → Create New\". Quiz: `questions` (1 to 10, 2 to 5 options each, correct ones marked) and optional `quiz_settings`. Mind map: `topics` (with optional subtopics), `mindmap_theme` (center; default the video title) and optional `mindmap_settings`. The eBook has no manual creation: generate it or upload a PDF (panda_get_ai_ebook_upload_url).","inputs":[{"name":"lang","type":"string","required":false,"description":"Language, e.g. 'en'. Default: the video's language"},{"name":"mindmap_settings","type":"object","required":false,"description":"Mind map: orientation, color"},{"name":"mindmap_theme","type":"string","required":false,"description":"Mind map: central theme"},{"name":"questions","type":"array","required":false,"description":"Quiz: the questions"},{"name":"quiz_settings","type":"object","required":false,"description":"Quiz: its options"},{"name":"resource","type":"string","required":true,"description":"mindmap or quiz"},{"name":"topics","type":"array","required":false,"description":"Mind map: topics and their subtopics"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":238},{"name":"panda_set_ai_resource_download","title":"Set AI Resource Download","description":"Allow or block viewers from downloading a video's eBook, mind map or quiz (the dashboard's \"Allow download\"). Applies to every language of that resource. Free.","inputs":[{"name":"allow_download","type":"boolean","required":true,"description":"true = viewers can download; false = blocked"},{"name":"resource","type":"string","required":true,"description":"ebook, mindmap or quiz"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":84},{"name":"panda_get_ai_ebook_upload_url","title":"Get AI eBook Upload URL","description":"Get a temporary upload URL (valid 1 hour) to send a file of the eBook: kind=pdf — your own PDF as the eBook of a language that has no eBook yet (up to 15 MB); kind=logo — a PNG/JPEG logo for the eBook (up to 5 MB). The URL is a credential: don't show or share it. Send the file with an HTTP PUT to upload_url with the Content-Type header exactly as returned. Then: PDF → panda_confirm_ai_ebook_pdf; logo → pass logo_key in ebook_config of panda_update_ai_resource (existing eBook) or panda_generate_ai_resource. Your client must be able to send files over HTTP; otherwise use the dashboard (Video Settings → Panda AI → eBook).","inputs":[{"name":"content_type","type":"string","required":false,"description":"logo: file type"},{"name":"kind","type":"string","required":true,"description":"pdf or logo"},{"name":"lang","type":"string","required":false,"description":"pdf: language of the eBook. Default: the video's language"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":223},{"name":"panda_confirm_ai_ebook_pdf","title":"Confirm AI eBook PDF","description":"Finish the PDF upload started with panda_get_ai_ebook_upload_url (kind=pdf): the PDF is checked (exists, not empty, up to 15 MB, valid PDF) and becomes the eBook of that language. With upload_success=false the uploaded file is discarded instead.","inputs":[{"name":"lang","type":"string","required":true,"description":"Same lang used to get the upload URL"},{"name":"upload_success","type":"boolean","required":false,"description":"false = the PUT failed; discard the file"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":111},{"name":"panda_list_ai_works","title":"List AI Works","description":"List the account's AI works (subtitles, translations, dubbing, lipsync, eBook=ABSTRACT, mind map=MINDMAP, quiz=QUESTIONS) page by page, newest first, with status (QUEUE, RUNNING, FINISHED, ERROR, SKIPPED). Only the latest attempt of each video × type × language. Filters: status, updated_since, video_id, folder_id (the API doesn't filter by type). Read-only. Returns {works: [{id, video_id, type, status, from_lang, to_lang, credits_charged, created_at, updated_at}], page, pages, total}.","inputs":[{"name":"folder_id","type":"string","required":false,"description":"Only this folder"},{"name":"limit","type":"integer","required":false,"description":"Per page, 1–50 (default 25)"},{"name":"page","type":"integer","required":false,"description":"Page (default 1)"},{"name":"status","type":"array","required":false,"description":"Only these statuses"},{"name":"updated_since","type":"string","required":false,"description":"Only works updated since this ISO date/time, e.g. '2026-10-01T00:00:00Z'"},{"name":"video_id","type":"string","required":false,"description":"Only this video"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":238},{"name":"panda_get_ai_ebook_images","title":"Get AI eBook Images","description":"Images generated with AI in the dashboard's eBook editor for one eBook × language, with their status (QUEUED, PROCESSING, SUCCESS, ERROR), and how many free images that eBook still has (5 free per eBook × language, then 1 credit each). Generating images is done in the dashboard editor. Read-only.","inputs":[{"name":"lang","type":"string","required":true,"description":"Language of the eBook, e.g. 'pt-BR'"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":113},{"name":"panda_get_referrals_summary","title":"Get Referrals Summary","description":"Get referral program summary (balance, estimated value)","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":21},{"name":"panda_get_credits_balance","title":"Get Credits Balance","description":"Get the current credits balance for the account. 1 credit = R$1.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":28},{"name":"panda_get_credits_history","title":"Get Credits History","description":"Get credits transaction history for a date range. Returns {balance, history: [{id, type, amount, status, description, created_at}]}.","inputs":[{"name":"end_date","type":null,"required":false,"description":"End date (YYYY-MM-DD)"},{"name":"start_date","type":"string","required":false,"description":"Start date (YYYY-MM-DD)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":68},{"name":"panda_get_auto_recharge_settings","title":"Get Auto Recharge Settings","description":"Get auto-recharge configuration for credits. Returns {enabled, trigger_value, action_value}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":30},{"name":"panda_enable_auto_recharge","title":"Enable Auto Recharge","description":"Enable auto-recharge for credits. When balance drops below trigger, recharges action_value.","inputs":[{"name":"action_value","type":"number","required":true,"description":"Amount to recharge (min 5 credits)"},{"name":"trigger_value","type":"number","required":true,"description":"Balance threshold to trigger recharge (min 100)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":62},{"name":"panda_update_auto_recharge","title":"Update Auto Recharge","description":"Update auto-recharge settings","inputs":[{"name":"action_value","type":"number","required":true,"description":"New recharge amount"},{"name":"trigger_value","type":"number","required":true,"description":"New trigger threshold"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":39},{"name":"panda_disable_auto_recharge","title":"Disable Auto Recharge","description":"Disable auto-recharge for credits","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":18},{"name":"panda_list_comparisons","title":"List Comparisons","description":"List all A/B test comparisons. Status: DRAFT → IN_PROGRESS → COMPLETED. Returns array of {id, name, description, status, videos: [], winner_video_id, created_at}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":51},{"name":"panda_create_comparison","title":"Create Comparison","description":"Create a new A/B test. Needs at least 2 videos to start. Returns the created {id, name, status, video_ids}.","inputs":[{"name":"name","type":"string","required":false,"description":"Test name"},{"name":"video_ids","type":"array","required":false,"description":"Video IDs to compare (min 2)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":64},{"name":"panda_start_comparison","title":"Start Comparison","description":"Start an A/B test (begin collecting data). Only from DRAFT status. Returns the updated comparison with status IN_PROGRESS.","inputs":[{"name":"comparison_id","type":"string","required":true,"description":"Comparison ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":45},{"name":"panda_finish_comparison","title":"Finish Comparison","description":"Finish an A/B test and declare a winner. PERMANENT — cannot be reversed.","inputs":[{"name":"comparison_id","type":"string","required":true,"description":"Comparison ID"},{"name":"winner_video_id","type":"string","required":true,"description":"ID of the winning video"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":52},{"name":"panda_delete_comparisons","title":"Delete Comparisons","description":"Delete one or more A/B tests","inputs":[{"name":"comparison_ids","type":"array","required":true,"description":"Comparison IDs to delete (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":35},{"name":"panda_get_player_config","title":"Get Player Config","description":"Get global player configuration (applies to all videos without a custom profile)","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":25},{"name":"panda_update_player_config","title":"Update Player Config","description":"Update the account's GLOBAL player (dashboard page Player): controls, colors, theme, caption color/background/size, resume from last position, gear-menu items, menu language and time display. Applies to every video WITHOUT a player profile — including videos uploaded later (they are born without a profile). Send only what changes; the rest is kept. Speed, autoplay and VSL options are NOT global: they live in each video's profile (panda_update_profile / panda_action_configure_folder_profile). Panda branding is not changed here (Settings → Panda Partner). Returns the saved config.","inputs":[{"name":"captionsBackgroundColor","type":null,"required":false,"description":"Caption background color (#RRGGBB or #RRGGBBAA)"},{"name":"captionsColor","type":null,"required":false,"description":"Caption text color (#RRGGBB or #RRGGBBAA)"},{"name":"captionsSize","type":"string","required":false,"description":"Caption font size by the dashboard name: extra_small (10px), small (12px), normal (14px, default), large (16px), extra_large (18px). Use the user's word ('legenda grande' / 'large captions' → large)."},{"name":"controls","type":"array","required":false,"description":"COMPLETE list of player controls (replaces the current one)"},{"name":"controlsColor","type":null,"required":false,"description":"Controls color (#RRGGBB)"},{"name":"defaultLanguage","type":"string","required":false,"description":"Language of the player menus (auto = viewer's browser)"},{"name":"primaryColor","type":"string","required":false,"description":"Primary accent color (#RRGGBB)"},{"name":"saveProgress","type":"boolean","required":false,"description":"Resume from where the viewer stopped (continuar de onde parou)"},{"name":"settingsControls","type":"object","required":false,"description":"Show/hide items of the gear (settings) menu — send only the items that change. With the captions button on, caption language stays on; all items off removes the settings button; turning one on brings…"},{"name":"theme","type":"string","required":false,"description":"Player theme"},{"name":"timeDisplayType","type":"string","required":false,"description":"Time shown in the control bar: current, remaining, or current/total"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":402},{"name":"panda_get_video_player_config","title":"Get Video Player Config","description":"Get per-video player configuration (chapters, CTAs, pixels, redirect, AI features, retention markers, subtitle default, offline config)","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"panda_update_video_config","title":"Update Video Config","description":"Update per-video config (POST /player?type=video). Send only fields you want to change.\nFields: chapters, default_subtitle, default_audio, redirect_video_id, custom_pixels, on_funnel, questions (AI quiz), mindmap (AI), abstract (AI ebook), retention_markers, ai.\nNOT for: controls, autoplay, Smart Autoplay, colors, speed, big play button, save progress — use panda_update_profile for those.","inputs":[{"name":"abstract","type":"boolean","required":false,"description":"Enable/disable AI eBook/Abstract feature"},{"name":"ai","type":"object","required":false,"description":"AI configuration object (search, tutor settings)"},{"name":"chapters","type":"array","required":false,"description":"Chapters/bookmarks. Send [] to remove all."},{"name":"custom_pixels","type":"array","required":false,"description":"Array of custom pixel objects (fbPixel, gtagIds, custom script)"},{"name":"default_audio","type":"string","required":false,"description":"Default audio language (code of a dubbing the video already has, e.g. 'es', 'en') or 'false' to go back to the original audio. Does not change the profile nor the menu language. Only takes effect wit…"},{"name":"default_subtitle","type":"string","required":false,"description":"Default subtitle language code (e.g. 'pt-BR', 'en') or 'false' to disable"},{"name":"mindmap","type":"boolean","required":false,"description":"Enable/disable AI MindMap feature"},{"name":"on_funnel","type":"boolean","required":false,"description":"Enable/disable funnel integration"},{"name":"questions","type":"boolean","required":false,"description":"Enable/disable AI Quiz feature"},{"name":"redirect_video_id","type":"string|null","required":false,"description":"Video ID to redirect to at end, or null to remove redirect"},{"name":"retention_markers","type":"array","required":false,"description":"Retention markers (pitch points) for analytics"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":371},{"name":"panda_set_video_offline","title":"Set Video Offline","description":"Configure offline playback for a video (mobile app feature)","inputs":[{"name":"enabled","type":"boolean","required":true,"description":"Enable or disable offline playback"},{"name":"expire_days","type":"number|null","required":false,"description":"Days until offline access expires (null = never)"},{"name":"external_link_enabled","type":"boolean","required":false,"description":"Show external link button"},{"name":"external_link_text","type":"string","required":false,"description":"External link button text"},{"name":"external_link_url","type":"string","required":false,"description":"External link URL"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":100},{"name":"panda_add_cta","title":"Add CTA","description":"Add a CTA (Call-to-Action) button to a video. Placement 'inside' = overlay on the video, 'outside' = below the video. Builds the same payload the dashboard's button editor sends.","inputs":[{"name":"append_website_query_params","type":"boolean","required":false,"description":"Append the page's URL query params to the button's URL"},{"name":"background_color","type":"string","required":false,"description":"Background color, hex (default: #3e50f7)"},{"name":"background_hover_color","type":"string","required":false,"description":"Background color on hover, hex"},{"name":"custom_html","type":"string","required":false,"description":"Raw HTML/CSS/JS to render instead of the styled button (advanced)"},{"name":"end_time","type":"number","required":false,"description":"Seconds into the video when the button disappears. Omit to show until the end of the video."},{"name":"placement","type":"string","required":true,"description":"Where to place the CTA"},{"name":"position","type":"string","required":false,"description":"Button position on the video overlay. Only applies to placement='inside'."},{"name":"size","type":"string","required":false,"description":"Button size (default: small)"},{"name":"start_time","type":"number","required":false,"description":"Seconds into the video when the button appears. Omit (with end_time) for the whole video."},{"name":"text","type":"string","required":false,"description":"Button label text. Required unless custom_html is set."},{"name":"text_color","type":"string","required":false,"description":"Text color, hex (default: #FFFFFF)"},{"name":"text_hover_color","type":"string","required":false,"description":"Text color on hover, hex"},{"name":"url","type":"string","required":false,"description":"URL opened when the button is clicked. Required unless custom_html is set."},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":315},{"name":"panda_update_cta","title":"Update CTA","description":"Update a CTA on a video. Only the fields you pass are changed; everything else keeps its current value. Placement cannot be changed — delete and re-add the CTA instead.","inputs":[{"name":"append_website_query_params","type":"boolean","required":false,"description":"Append the page's URL query params to the button's URL"},{"name":"background_color","type":"string","required":false,"description":"Background color, hex (default: #3e50f7)"},{"name":"background_hover_color","type":"string","required":false,"description":"Background color on hover, hex"},{"name":"cta_id","type":"string","required":true,"description":"ID of the CTA to update"},{"name":"custom_html","type":"string","required":false,"description":"Raw HTML/CSS/JS to render instead of the styled button (advanced)"},{"name":"end_time","type":"number","required":false,"description":"Seconds into the video when the button disappears. Omit to show until the end of the video."},{"name":"placement","type":"string","required":true,"description":"CTA placement"},{"name":"position","type":"string","required":false,"description":"Button position on the video overlay. Only applies to placement='inside'."},{"name":"size","type":"string","required":false,"description":"Button size (default: small)"},{"name":"start_time","type":"number","required":false,"description":"Seconds into the video when the button appears. Omit (with end_time) for the whole video."},{"name":"text","type":"string","required":false,"description":"Button label text. Required unless custom_html is set."},{"name":"text_color","type":"string","required":false,"description":"Text color, hex (default: #FFFFFF)"},{"name":"text_hover_color","type":"string","required":false,"description":"Text color on hover, hex"},{"name":"url","type":"string","required":false,"description":"URL opened when the button is clicked. Required unless custom_html is set."},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":319},{"name":"panda_delete_cta","title":"Delete CTA","description":"Delete a CTA from a video","inputs":[{"name":"cta_id","type":"string","required":true,"description":"CTA ID to delete"},{"name":"placement","type":"string","required":true,"description":"CTA placement"},{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"panda_get_ai_workflows","title":"Get AI Workflows","description":"Get every AI work of a video (subtitles, translation, dubbing, eBook=ABSTRACT, mind map=MINDMAP, quiz=QUESTIONS) with status (QUEUE, RUNNING, FINISHED, ERROR, SKIPPED). For the whole account or a folder, page by page, use panda_list_ai_works.","inputs":[{"name":"video_id","type":"string","required":true,"description":"Video ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":90},{"name":"panda_delete_ai_workflow","title":"Delete AI Workflow","description":"Delete an AI work record (e.g. a failed or queued transcription/dubbing card; a queued one is refunded). It doesn't remove what a finished work produced: to remove an eBook, mind map or quiz use panda_delete_ai_resource.","inputs":[{"name":"workflow_id","type":"string","required":true,"description":"Workflow ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":70},{"name":"panda_get_subscription","title":"Get Subscription","description":"Get current subscription/plan details. Returns {subscription_id, subscriptions: {name, status, active}, currency, addons}. addons.live lists live minutes billed above the plan's free minutes, per region and quality (quantity in minutes, unit_amount in cents); the plan's max live quality is subscriptions.metadata.live_max_quality.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"panda_get_plan_usage","title":"Get Plan Usage","description":"Get the current billing cycle usage and plan limits. Returns {start_period, end_period, plan_name, is_trial, storage, storage_plan, traffic, traffic_plan (all MB), play, play_plan, live, live_plan, live_count}. live = live minutes used this cycle (whole account, all regions); live_plan = free live minutes informed in the plan; live_count = lives in the cycle. Live minutes above live_plan are billed per minute by region and quality: see panda_get_subscription → addons.live. Trial accounts (is_trial) cannot create lives.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":125},{"name":"panda_list_invoices","title":"List Invoices","description":"List all invoices. Returns array of {id, status, amount_due, amount_paid, created, due_date, invoice_pdf, hosted_invoice_url}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":40},{"name":"panda_list_plans","title":"List Plans","description":"List available subscription plans and pricing","inputs":[{"name":"currency","type":"string","required":false,"description":"Currency"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":25},{"name":"panda_list_subaccounts","title":"List Subaccounts","description":"List all subaccounts and their usage limits. Returns array of {organization_id, name, status, credits_balance, storage_used, limits}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":38},{"name":"panda_update_subaccount","title":"Update Subaccount","description":"Update a subaccount's settings (name, limits, status)","inputs":[{"name":"subaccount","type":"object","required":true,"description":"Subaccount update payload"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":35},{"name":"panda_delete_subaccount","title":"Delete Subaccount","description":"Delete a subaccount","inputs":[{"name":"organization_id","type":"string","required":true,"description":"Subaccount organization ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":27},{"name":"panda_transfer_credits","title":"Transfer Credits","description":"Transfer credits to a subaccount","inputs":[{"name":"amount","type":"number","required":true,"description":"Number of credits to transfer"},{"name":"target_organization_id","type":"string","required":true,"description":"Target subaccount organization ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":44},{"name":"panda_list_notices","title":"List Notices","description":"List the notices the Panda team sent to the account (tips, alerts, news) — the ones shown in the dashboard notice card and Notifications panel. Only the account owner and admins have notices: any other user gets an empty list (not an error). Status: 'sent' = unread, 'read' = dismissed, 'completed' = the user already acted on it (clicked its button). Returns up to 100 [{id, notice_type, title, text, primary_button, secondary_button, status, created_at, read_at, completed_at}].","inputs":[{"name":"status","type":"string","required":false,"description":"Filter by status ('sent' = unread). Omit for all."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":143},{"name":"panda_update_notice_status","title":"Mark Notice","description":"Mark one notice as 'read' (default — same as dismissing it in the dashboard) or 'completed'. Use 'completed' ONLY when the user explicitly asks for it: in the dashboard it means the user did what the notice asked, and it is final (a completed notice never changes again). Nothing is deleted. Only the account owner and admins can mark notices. Get the id from panda_list_notices.","inputs":[{"name":"notice_id","type":"string","required":true,"description":"Notice ID (from panda_list_notices)"},{"name":"status","type":"string","required":false,"description":"'read' (default) or 'completed' (final; only if the user asks)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":135},{"name":"panda_request_partial_deletion","title":"Request Partial Deletion","description":"Remove some qualities and/or the original file (backup) of ONE CONVERTED video to free storage, keeping the video. The removed items disappear right away and are deleted for good after retention_days (30); until then panda_cancel_partial_deletion restores them. Videos from an external source are refused. Refused when it would leave the video with no quality: the API would send the whole video to the trash instead — use panda_delete_videos to delete a video. Returns {retention_days, action, remaining_qualities, ignored, partial_deletion}.","inputs":[{"name":"backup","type":"boolean","required":false,"description":"true = remove the original uploaded file (backup)"},{"name":"qualities","type":"array","required":false,"description":"Qualities to remove, as in the video's available_resolutions (e.g. ['1080p', '720p'])"},{"name":"video_id","type":"string","required":true,"description":"Video ID (one video per call)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":185},{"name":"panda_list_partial_deletions","title":"List Partial Deletions","description":"List pending removals that can still be undone. type 'partial' = qualities/backup removed with panda_request_partial_deletion (cancel with panda_cancel_partial_deletion); 'video' = whole videos in the trash; 'all' (default) = both. Returns {retention_days, partial_deletions, pagination}.","inputs":[{"name":"limit","type":"integer","required":false,"description":"Results per page (default: 25, max: 100)"},{"name":"page","type":"integer","required":false,"description":"Page number (default: 1)"},{"name":"type","type":"string","required":false,"description":"Default: all"},{"name":"video_id","type":"string","required":false,"description":"Only this video"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":133},{"name":"panda_cancel_partial_deletion","title":"Cancel Partial Deletion","description":"Undo a partial deletion of ONE video before it is executed: the qualities/backup come back. Without qualities and backup, everything pending for the video is restored. Refused once the final deletion has started. Does not recover videos in the trash.","inputs":[{"name":"backup","type":"boolean","required":false,"description":"true = remove the original uploaded file (backup)"},{"name":"qualities","type":"array","required":false,"description":"Qualities to remove, as in the video's available_resolutions (e.g. ['1080p', '720p'])"},{"name":"video_id","type":"string","required":true,"description":"Video ID (one video per call)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":122},{"name":"panda_update_sign_language_display","title":"Update Sign Language Display","description":"Change how the sign language interpreter (Libras) window shows on a video's player: start time, size, position, autostart, or a free position/size. Only fields passed are changed. The interpreter clip itself is uploaded and removed on the dashboard (Video → Settings → Libras); this tool does not create or delete it. Choosing a preset size or position drops the free position (custom), like the dashboard. Returns the updated sign language entry.","inputs":[{"name":"autostart","type":"boolean","required":false,"description":"true = interpreter already on when the video starts"},{"name":"custom","type":"object","required":false,"description":"Free position and size (fractions of the player, 0–1); overrides size/position"},{"name":"language","type":"string","required":false,"description":"Sign language, by the country's language code ('pt-br' = Libras); needed only if the video has more than one"},{"name":"position","type":"string","required":false,"description":"Preset window corner"},{"name":"size","type":"string","required":false,"description":"Preset window size"},{"name":"start_time","type":"number","required":false,"description":"Second of the video when the window appears"},{"name":"video_id","type":"string","required":true,"description":"Video ID (the main video, not the interpreter clip)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":239},{"name":"panda_encrypt_videos","title":"Encrypt Videos (HLS)","description":"Turn on Encrypted Anti-Download (HLS encryption) on existing videos, 1–100 per call (one video works too). PAID in credits, per video: ceil(duration in hours × number of current qualities), e.g. a 10-minute video in 3 qualities = 1 credit; charged when the video is queued. Cannot be undone: there is no way to decrypt a video. Only for Gold/Enterprise plans or accounts with the 'Anti-Download Criptografado' add-on (checked before sending; otherwise refused). Videos already encrypted are left out (checked before sending) and listed in skipped as already_encrypted. Videos are also skipped without charge when still processing, with a pending partial deletion, without duration/qualities, not found, or when the credit balance doesn't cover them (insufficient_funds). Returns {idempotency_key, total, queued, skipped: [{video_id, reason}]}; follow the progress with panda_get_hls_encryption_batches. To encrypt future uploads automatically use panda_set_new_uploads_encryption.","inputs":[{"name":"video_ids","type":"array","required":true,"description":"Video IDs (1–100)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":240},{"name":"panda_get_hls_encryption_batches","title":"Get HLS Encryption Batches","description":"Progress of encryption batches started with panda_encrypt_videos. With idempotency_key: that batch; without it: every batch not finished yet (including failed videos). Each video: {video_id, status, state, updated_at}; state is pending, in_progress, processed, failed or cancelled. estimated_completion_minutes estimates the whole encryption queue (all accounts), not only your batch, and may be 0 when unknown.","inputs":[{"name":"idempotency_key","type":"string","required":false,"description":"Batch ID returned by panda_encrypt_videos"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":116},{"name":"panda_list_hls_encrypted_videos","title":"List HLS Encrypted Videos","description":"List the account's videos that are already encrypted (HLS). Videos still in an encryption batch only show up when it finishes (see panda_get_hls_encryption_batches). Returns {total, page, limit, pages, videos: [{id, title, status, folder_id, encrypted_at, available_resolutions, ...}]}. Default 25 videos per page, max 50; keep calling with page+1 while page < pages.","inputs":[{"name":"limit","type":"integer","required":false,"description":"Videos per page (default: 25, max: 50)"},{"name":"page","type":"integer","required":false,"description":"Page number (default: 1)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":137},{"name":"panda_get_new_uploads_encryption","title":"Get New Uploads Encryption","description":"Whether new uploads are encrypted automatically (Encrypted Anti-Download / HLS encryption for future videos). Returns {library_id, status}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":39},{"name":"panda_set_new_uploads_encryption","title":"Set New Uploads Encryption","description":"Turn automatic encryption (HLS) of NEW uploads on or off. No credit cost. Turning on is only for Gold/Enterprise plans or accounts with the 'Anti-Download Criptografado' add-on (checked before changing; otherwise refused). Existing videos don't change: to encrypt them use panda_encrypt_videos (paid). Turning off only affects future uploads: videos already encrypted stay encrypted, and a paid add-on stays billed until it is removed in the dashboard.","inputs":[{"name":"enabled","type":"boolean","required":true,"description":"true = encrypt new uploads; false = stop"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":123},{"name":"panda_get_exclusive_playback","title":"Get Exclusive Playback","description":"Whether Exclusive Playback is on (on-demand videos only play in the Panda Player). Returns {status}.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":32},{"name":"panda_set_exclusive_playback","title":"Set Exclusive Playback","description":"Turn Exclusive Playback on or off (dashboard: Security > Anti-Download > \"Reprodução Exclusiva\", Beta). When ON, the on-demand videos of the account are served only to the Panda Player: the Panda Player embedded by iframe keeps working on any site allowed by domain protection (members areas that use the embed included), while custom players, scrapers or extensions that open the HLS (m3u8) link directly get a decoy video. It deters casual capture; it is not DRM. Covers on-demand videos, Libras and the main audio; does not cover live streams, dubbed audio tracks, subtitles or downloads (they keep working). Requires the Simple Anti-Download to be ON (checked before changing; turn it on with panda_action_set_anti_download); turning Simple Anti-Download off turns Exclusive Playback off too. Turning on is only for plans that include Simple Anti-Download (Gold/Enterprise and others; Silver/Bronze need the \"Anti-Download Simples\" add-on, contracted in the dashboard; not available on Clipador/Clipper and VSL Only plans).","inputs":[{"name":"enabled","type":"boolean","required":true,"description":"true = only the Panda Player plays the videos; false = stop"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":256},{"name":"panda_get_library_qualities","title":"Get Library Qualities","description":"The account's quality settings (dashboard: Settings > Qualities). Returns {encoding, playback, compression_mode, compression_label, keep_original_files}: encoding = \"Conversão de Novos Uploads\" (qualities new uploads are converted to); playback = \"Reprodução de Todos Vídeos\" (qualities the player offers, on every video, when converted in that quality); compression_mode = \"Compressão de Novos Uploads\", shown as compression_label (size = Econômica, balanced = Equilibrada, quality = Maior qualidade); keep_original_files = \"Backup do Arquivo Original de Novos Uploads\".","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":135},{"name":"panda_update_library_qualities","title":"Update Library Qualities","description":"Change the account's quality settings (dashboard: Settings > Qualities); send only what changes. encoding (\"Conversão de Novos Uploads\"): qualities NEW uploads are converted to, each one using storage. playback (\"Reprodução de Todos Vídeos\"): qualities the player offers on ALL videos, including the ones already uploaded, when converted in that quality. compression_mode (\"Compressão de Novos Uploads\", NEW uploads): Econômica (size, smaller files), Equilibrada (balanced) or Maior qualidade (quality, larger files). keep_original_files (\"Backup do Arquivo Original de Novos Uploads\"): keep the original file of NEW uploads (uses storage; when off, downloads only offer the converted versions). Existing videos are not re-encoded (use panda_reencode_video). Not available on the Clipador/Clipper plan and needs the permission to change account settings (put-general-config); both are checked before changing.","inputs":[{"name":"compression_mode","type":"string","required":false,"description":"Econômica / Equilibrada / Maior qualidade (or size / balanced / quality)"},{"name":"encoding","type":"array","required":false,"description":"Qualities new uploads are converted to (240p, 360p, 480p, 720p, 1080p, 1440p, 2160p; 2160p = 4K); the whole list, at least one"},{"name":"keep_original_files","type":"boolean","required":false,"description":"true = keep the original file of new uploads"},{"name":"playback","type":"array","required":false,"description":"Qualities the player offers (240p, 360p, 480p, 720p, 1080p, 1440p, 2160p; 2160p = 4K); the whole list, at least one"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":361},{"name":"panda_help_search","title":"Search Help Articles","description":"Search Panda Video help center articles to answer user questions.\nSearches through ALL 146 pre-indexed articles from the official help center (https://help.pandavideo.com/pt-br/).\nUse this tool whenever the user has a QUESTION about how Panda Video works, pricing, features, integrations, configuration, etc.\nDO NOT use this for API execution commands — only for knowledge/support questions.\nIMPORTANT: Base your answer EXCLUSIVELY on the article content returned. Do NOT infer, assume, or use external knowledge.","inputs":[{"name":"limit","type":"number","required":false,"description":"Max articles to return (default 5, max 20)"},{"name":"query","type":"string","required":true,"description":"The user's question or search keywords about Panda Video"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":150},{"name":"panda_help_get_article","title":"Get Help Article","description":"Get the full content of a specific Panda Video help center article by slug.\nUse this after searching to read the complete content of an article.\nThe response is the full official documentation.","inputs":[{"name":"slug","type":"string","required":true,"description":"Article slug (e.g. 'como-publicar-seu-video-na-panda-video')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":70},{"name":"panda_get_business_rules","title":"Get Business Rules","description":"Returns the platform business rules: the real consequences of actions that modify, delete or move resources (e.g., deleting a folder or a funnel sends the videos inside to the trash for 30 days).\nUseful before planning such actions, so the advice given to the user matches how the platform actually behaves.\nDomains: funnels, videos_and_folders, video_upload, embed_and_share, player_settings, cta_interactions, playlists, drm_watermark, comparisons_ab_tests, lives, shorts, anti_download_and_domains, credits, thumbnails_and_subtitles, trash_and_recovery, analytics, tutor_ai_assistant, webhooks, review_timeline, subaccounts, billing_and_plans, member_get_member, organization_and_accounts.","inputs":[{"name":"domain","type":"string","required":false,"description":"Filter by domain (e.g. 'funnels', 'playlists', 'drm_watermark'). Omit to get ALL rules."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":188},{"name":"panda_list_refer","title":"List Domain Referrers (library)","description":"List the library-level domain referrers (Domain Protection / allow-block list for playback). Returns { refers: [{ id, url, type, status }] } where type is ALLOW|BLOCK and status is one of active|inactive|pending|deleting|turning_inactive. library_id is resolved automatically when omitted.","inputs":[{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":95},{"name":"panda_list_refer_all","title":"List All Domain Referrers (consolidated)","description":"List all of the library's domains consolidated by hostname across library and folder scopes. Returns { refers: [{ hostname, type, status, scope, library_refer_id, folders, type_inconsistency, created_at }] }. scope is library|folder|mixed; status may be 'mixed' when rows differ; library_refer_id is the library-level row id (null if folder-only); folders is an array of { folder_id, name, refer_id, status }; type_inconsistency=true when the same hostname has divergent ALLOW/BLOCK rows. Referrers with status=deleting are ignored. library_id is resolved automatically when omitted.","inputs":[{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":161},{"name":"panda_list_folder_refer","title":"List Folder Domain Referrers","description":"List the domain referrers set directly on a folder. Returns { refers: [{ id, url, type, status, origin: { type, id } }] }. library_id is resolved automatically when omitted.","inputs":[{"name":"folder_id","type":"string","required":true,"description":"Folder UUID whose referrers to list"},{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":88},{"name":"panda_list_folder_refer_inherited","title":"List Folder Effective Domain Referrers","description":"List the effective referrers that apply to a folder using override-total semantics: the folder's own referrers if it has any, otherwise the library-level referrers. Use this to know which domains actually gate playback for videos in the folder. Returns { refers: [{ id, url, type, status, origin: { type, id } }] }. library_id is resolved automatically when omitted.","inputs":[{"name":"folder_id","type":"string","required":true,"description":"Folder UUID to resolve effective referrers for"},{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":130},{"name":"panda_create_refer","title":"Create Domain Referrers (library)","description":"Add one or more library-level domain referrers. Each entry has a hostname and a type (ALLOW|BLOCK, default ALLOW). The same hostname cannot coexist as both ALLOW and BLOCK at the library scope (duplicate check is type-agnostic). New rows start in 'pending' (when domain protection is active) or 'inactive'. library_id is resolved automatically when omitted. On error the API returns { errCode, errMsg }.","inputs":[{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."},{"name":"refers","type":"array","required":true,"description":"Referrers to create (1 or more)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":136},{"name":"panda_create_folder_refer","title":"Create Folder Domain Referrer","description":"Add a domain referrer scoped to a single folder. type is ALLOW|BLOCK. The new row starts in 'pending'. A folder cannot have the same hostname twice. library_id is resolved automatically when omitted. On error the API returns { errCode, errMsg }.","inputs":[{"name":"folder_id","type":"string","required":true,"description":"Folder UUID where the referrer applies"},{"name":"hostname","type":"string","required":true,"description":"Domain hostname without protocol, e.g. 'example.com' or wildcard '*.cliente.com'"},{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."},{"name":"type","type":"string","required":true,"description":"ALLOW = whitelist (only listed domains play); BLOCK = blacklist (listed domains are denied)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":150},{"name":"panda_set_refer_status","title":"Activate/Deactivate Domain Referrer","description":"Activate (active=true) or deactivate (active=false) a single referrer by refer_id. Activation moves inactive→pending; deactivation moves active→turning_inactive (the async worker finalizes the state). If the referrer is already in an intermediate state (pending|deleting|turning_inactive) the API returns 400 ({ errCode, errMsg }: 'Operation in progress, ...'). Works for both library- and folder-level referrers.","inputs":[{"name":"active","type":"boolean","required":true,"description":"true to activate, false to deactivate"},{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."},{"name":"refer_id","type":"string","required":true,"description":"Referrer UUID to toggle"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":152},{"name":"panda_delete_refer","title":"Delete Domain Referrers (library)","description":"Delete one or more library-level referrers by id (batch). Each referrer must be library-level (folder_id=null) and belong to the library; otherwise the API returns 400 ({ errCode, errMsg }). Rows transition to 'deleting' and are removed asynchronously.","inputs":[{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."},{"name":"refer_ids","type":"array","required":true,"description":"Referrer UUIDs to delete (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":104},{"name":"panda_delete_folder_refer","title":"Delete Folder Domain Referrers","description":"Delete one or more folder-level referrers by id (batch). Duplicate ids are de-duplicated; if any id is missing the API returns 404, and if any referrer is library-level it returns 400 ({ errCode, errMsg }). Rows transition to 'deleting' and are removed asynchronously.","inputs":[{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."},{"name":"refer_ids","type":"array","required":true,"description":"Folder referrer UUIDs to delete (max 50)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":113},{"name":"panda_update_folder_refer","title":"Update/Move Domain Referrers (mass-edit)","description":"Edit one or more existing referrers (refer_ids) in a single call: rename the hostname, change the type (ALLOW|BLOCK), and/or move them between scopes. scope='library' makes the domain apply to the whole library (omit folder_ids). scope='folder' makes it apply to the listed folder_ids (required and non-empty, the backend computes the add/remove diff). All refer_ids must belong to the same hostname. Moving a folder domain to scope='library' recreates it as a library domain that starts 'pending' until it is active. Returns { message, hostname, type, scope, renamed, folders_added, folders_removed, refers }. On error the API returns { errCode, errMsg }. library_id is resolved automatically when omitted.","inputs":[{"name":"folder_ids","type":"array","required":false,"description":"Target folder UUIDs — required when scope='folder' (max 50)"},{"name":"hostname","type":"string","required":true,"description":"Domain hostname without protocol, e.g. 'example.com' or wildcard '*.cliente.com'"},{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."},{"name":"refer_ids","type":"array","required":true,"description":"Referrer UUIDs to edit (all must be the same hostname) (max 50)"},{"name":"scope","type":"string","required":true,"description":"Target scope: 'library' (whole library) or 'folder' (specific folder_ids)"},{"name":"type","type":"string","required":true,"description":"ALLOW = whitelist (only listed domains play); BLOCK = blacklist (listed domains are denied)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":308},{"name":"panda_set_block_none_refer","title":"Turn Domain Protection On/Off","description":"Turn the library's domain protection on or off (block_none_refer). false = protection OFF for the whole library: every request plays, with or without a referer, and even BLOCK domains are ignored. true = the ACTIVE domains apply: requests without a referer are blocked (native TV/iOS players excepted), with ALLOW domains only matching referers play, with only BLOCK domains the matching referers are blocked; with no active domain nothing is blocked. WARNING: this also rewrites the status of ALL the library's domains (library and folders): true activates every domain, including ones turned off on purpose (to keep one off, deactivate it afterwards with panda_set_refer_status); false deactivates all of them. Refused (400) while any domain is still pending, deleting or turning inactive. The server recalculates the flag afterwards: it is true while at least one domain is active. On error the API returns { errCode, errMsg }. library_id is resolved automatically when omitted.","inputs":[{"name":"block_none_refer","type":"boolean","required":true,"description":"true = protection on (active domains apply; all domains are activated); false = protection off (all domains are deactivated)"},{"name":"library_id","type":"string","required":false,"description":"Library UUID. Resolved from GET /library when omitted."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":270},{"name":"panda_action_move_videos_by_folder","title":"Move Videos Between Folders","description":"Deterministically resolve a source and target folder and move every video from the source into the target in one call. Pass target_folder_ref='root' to move to the root (no folder). Skips videos already being deleted. Free action (no credits). dry_run=true (default) returns a preview of which videos would move.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = move"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied key to make retries safe (not yet enforced server-side)"},{"name":"source_folder_ref","type":"string","required":true,"description":"Source folder name, ID, or dashboard URL"},{"name":"target_folder_ref","type":"string","required":true,"description":"Target folder name, ID, or dashboard URL — or 'root' to move to the root (no folder)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":171},{"name":"panda_action_delete_folder_videos","title":"Delete Folder Videos","description":"Deterministically resolve a folder and send every video inside it to the trash (30-day recovery). DESTRUCTIVE. dry_run=true (default) returns a preview of what would be deleted; set dry_run=false AND confirm=true to actually delete.","inputs":[{"name":"confirm","type":"boolean","required":false,"description":"Required safety flag — must be true (with dry_run=false) to delete"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = delete"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":133},{"name":"panda_action_reencode_folder_videos","title":"Reencode Folder Videos","description":"Deterministically resolve a folder and re-encode every CONVERTED video with a given compression mode (no credit cost). Each video is processed again from its original file (backup): videos without the backup are refused and listed in failed. The current qualities are replaced by the re-encoded ones; encryption (HLS) is kept. dry_run=true (default) previews the affected videos.","inputs":[{"name":"compression_mode","type":"string","required":true,"description":"Compression mode applied to every video: size = 'Econômica', balanced = 'Equilibrada', quality = 'Maior qualidade' (dashboard names)"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = reencode"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":182},{"name":"panda_action_duplicate_folder_videos","title":"Duplicate Folder Videos","description":"Deterministically resolve a folder and create a copy of every CONVERTED video inside it. Duplication only works for non-external, non-funnel videos (the API rejects others, surfaced per-video). dry_run=true (default) previews the affected videos.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = duplicate"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":114},{"name":"panda_action_set_folder_videos_offline","title":"Set Folder Videos Offline Playback","description":"Deterministically resolve a folder and enable or disable offline (mobile app) playback for every CONVERTED video inside it, in one batch call (POST /app). dry_run=true (default) previews the affected videos.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"enabled","type":"boolean","required":true,"description":"true = allow offline playback, false = disable"},{"name":"expire_days","type":null,"required":false,"description":"Days until offline access expires (null = never)"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":139},{"name":"panda_action_rename_folder","title":"Rename Folder","description":"Deterministically resolve a folder by name/ID/URL and rename it (PUT /folders/{id}). dry_run=true (default) previews the rename.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = rename"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"new_name","type":"string","required":true,"description":"New folder name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":103},{"name":"panda_action_create_folder_path","title":"Create Folder Path","description":"Deterministically ensure a nested folder path exists (e.g. 'Courses/2026/Module 1'), creating only the missing segments and returning the leaf folder ID. Idempotent: existing segments are reused. dry_run=true (default) previews which segments would be created.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"path","type":"string","required":true,"description":"Slash-separated folder path by name, e.g. 'Courses/2026/Module 1'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":127},{"name":"panda_action_create_playlist_from_folder","title":"Create Playlist from Folder","description":"Deterministically resolve a folder, create a new playlist, and add every CONVERTED video to it in folder order. dry_run=true (default) previews the playlist and its videos without creating anything.","inputs":[{"name":"access_type","type":"string","required":false,"description":"Playlist access type (the Panda API requires it; defaults to anyone_with_link)"},{"name":"creator_name","type":"string","required":false,"description":"Creator name shown in the player (the Panda API requires it; defaults to the playlist name)"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"password","type":"string","required":false,"description":"Password (for password-protected playlists)"},{"name":"playlist_name","type":"string","required":true,"description":"Name for the new playlist"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":178},{"name":"panda_action_add_folder_videos_to_playlist","title":"Add Folder Videos to Playlist","description":"Deterministically resolve a folder and an existing playlist (by name or ID), then append every CONVERTED folder video to the playlist after its current items. dry_run=true (default) previews the additions.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = add"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"playlist_ref","type":"string","required":true,"description":"Playlist name or ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":117},{"name":"panda_action_apply_profile_to_folder","title":"Apply Profile to Folder","description":"Deterministically resolve a player profile and a folder and link the profile to ALL videos of the folder in one call (sends folder_id, like the dashboard). Subfolders are not included; videos in any status (not only converted ones) also receive the profile. Videos with their own customized player lose that customization. The work is queued: the result is status 'executed' with api_status 'pending' — confirm later with panda_get_profile (videos_count). api_status 'ok' only means the API found no videos in the folder: nothing was changed. Free action (no credits). dry_run=true (default) returns a preview.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied key to make retries safe (not yet enforced server-side)"},{"name":"profile_ref","type":"string","required":true,"description":"Player profile name or ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":213},{"name":"panda_action_apply_video_config_to_folder","title":"Apply Video Config to Folder","description":"Deterministically resolve a folder and apply per-video player config to every CONVERTED video (POST /player?type=video). Supports: default_subtitle (lang code or 'false'), default_audio (dubbing language code or 'false'), on_funnel, and the AI toggles questions/mindmap/abstract. Send only the fields you want to change. dry_run=true (default) previews the affected videos.","inputs":[{"name":"abstract","type":"boolean","required":false,"description":"Enable/disable AI eBook/Abstract"},{"name":"default_audio","type":"string","required":false,"description":"Default audio language — code of a dubbing the videos have (e.g. 'es') or 'false' for the original audio. Only takes effect with the dubbing item on in the gear menu and without lipsync."},{"name":"default_subtitle","type":"string","required":false,"description":"Default subtitle language code (e.g. 'pt-BR') or 'false' to disable"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"mindmap","type":"boolean","required":false,"description":"Enable/disable AI MindMap"},{"name":"on_funnel","type":"boolean","required":false,"description":"Enable/disable funnel integration"},{"name":"questions","type":"boolean","required":false,"description":"Enable/disable AI Quiz"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":284},{"name":"panda_action_configure_folder_profile","title":"Configure Folder Player Profile","description":"Deterministically apply player-profile settings to every CONVERTED video in a folder, without touching videos outside it. Covers everything a profile holds: colors (Cores) incl. caption colors, captionsSize, controls incl. the big play button 'play-large' (Controles / Botão de Play Grande), VSL, save-progress, general (speed, theme, gear menu, offline) and availableQualities — pass any subset. Per video: its own (exclusive) profile is updated; a video on a SHARED or the default profile first gets its own copy of that profile (like the dashboard does), so the other videos of that profile do not change; a video without a profile gets a new one. Colors are merged with the current ones. dry_run=true (default) first VALIDATES each video and previews the plan — including which shared profiles end up with no videos — without changing anything.","inputs":[{"name":"availableQualities","type":"array","required":false,"description":"Qualities the viewer can pick, e.g. [\"480p\",\"720p\",\"1080p\"]. Empty list = all qualities."},{"name":"captionsSize","type":"string","required":false,"description":"Caption font size by the dashboard name: extra_small (10px), small (12px), normal (14px, default), large (16px), extra_large (18px). Use the user's word ('legenda grande' / 'large captions' → large)."},{"name":"colors","type":"object","required":false,"description":"Player colors, including caption text/background. Only the colors you send change — the others are kept."},{"name":"controls","type":"array","required":false,"description":"Array of enabled player controls (incl. \"play-large\" = Botão de Play Grande). Values: \"play-large\", \"rewind\", \"play\", \"fast-forward\", \"progress\", \"current-time\", \"volume\", \"captions\", \"settings\", \"pi…"},{"name":"dry_run","type":"boolean","required":false,"description":"true = validate + preview only; false = apply"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"general","type":"object","required":false,"description":"General player settings (speed, search-in-video, theme, gear menu, offline). Merged into the current values — keys you omit are kept."},{"name":"hideControlsOnStart","type":"boolean","required":false,"description":"Hide controls until user interacts"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"saveProgress","type":"object","required":false,"description":"Save progress / resume settings"},{"name":"vsl","type":"object","required":false,"description":"VSL (Video Sales Letter) settings — controls autoplay, smart autoplay, fake progress bar, muted indicator"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":534},{"name":"panda_action_set_folder_player_control","title":"Toggle a Player Control for Folder","description":"Enable or disable a single player control on every CONVERTED video in a folder, via player profiles, PRESERVING all other controls and without touching videos outside the folder. The big play button (dashboard 'Botão de Play Grande') is the 'play-large' control — disable it with control='play-large', enabled=false. Each video's controls are read-modify-written; when a profile has no explicit control list it inherits the global player controls, so the action materializes that global list minus/plus the control. A video on a SHARED or the default profile first gets its own copy of that profile (like the dashboard does); videos without a profile get one created and assigned. dry_run=true (default) validates + previews per-video changes, including which shared profiles end up with no videos.","inputs":[{"name":"control","type":"string","required":true,"description":"Player control to toggle. 'play-large' = the big center play button."},{"name":"dry_run","type":"boolean","required":false,"description":"true = validate + preview only; false = apply"},{"name":"enabled","type":"boolean","required":true,"description":"true = show the control, false = hide/disable it"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":266},{"name":"panda_action_generate_subtitles_for_folder","title":"Generate Subtitles for Folder","description":"Deterministically resolve a folder, list eligible (CONVERTED) videos, estimate the AI subtitle cost in credits, and optionally generate subtitles in one or more languages. Tiers: essential (only en/pt-BR/es, 1 credit/30min), advanced (34 langs, 1 credit/5min), pro (34 langs, 1 credit/min). dry_run=true (default) returns a preview.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = generate"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"from_lang","type":"string","required":false,"description":"Source language code (default 'auto')"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied key to make retries safe (not yet enforced server-side)"},{"name":"target_langs","type":"array","required":true,"description":"Subtitle language codes to generate, e.g. ['en','es']"},{"name":"tier","type":"string","required":false,"description":"Quality tier (essential restricts languages to en/pt-BR/es)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":215},{"name":"panda_action_set_default_subtitle_for_folder","title":"Set Default Subtitle for Folder","description":"Deterministically resolve a folder and set the default subtitle language on every CONVERTED video (POST /player?type=video). Pass language 'false' to clear the default. dry_run=true (default) previews the affected videos. Note: videos lacking that subtitle simply won't show it.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"language","type":"string","required":true,"description":"Subtitle language code to set as default (e.g. 'pt-BR'), or 'false' to clear"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":151},{"name":"panda_action_remove_subtitle_language_from_folder","title":"Remove Subtitle Language from Folder","description":"Deterministically resolve a folder and delete a subtitle language from every CONVERTED video that has it (DELETE /subtitles/{id}). DESTRUCTIVE. dry_run=true (default) previews; set dry_run=false AND confirm=true to delete. Videos without that language are simply skipped by the API.","inputs":[{"name":"confirm","type":"boolean","required":false,"description":"Required safety flag to delete"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = delete"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"language","type":"string","required":true,"description":"Subtitle language code to remove (e.g. 'en')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":154},{"name":"panda_action_dub_folder_videos","title":"Dub Folder Videos","description":"Deterministically resolve a folder, list eligible (CONVERTED) videos, estimate the dubbing cost in credits, and optionally create AI dubbing jobs for one or more target languages. dry_run=true (default) returns a preview without creating any job. standard mode (AI dubbing, HeyGen audio only) = 5 credits/min, lipsync = 14 credits/min, per language (minimum 1 min; a partial minute counts only past 1 s). Skips videos that already have the other dubbing technology (standard and lipsync can't be mixed) and, in lipsync, videos over 60 minutes. Each video follows its subtitles like the dashboard: targets already subtitled get audio only (DUBBING), the others TRANSLATION (source subtitled) or TRANSCRIPTION + dubbing. Stops at the first insufficient-credits (402) answer and lists the videos not attempted.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create jobs"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"from_lang","type":"string","required":false,"description":"Source language code (default 'auto' = each video's original language)"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied key to make retries safe (not yet enforced server-side)"},{"name":"mode","type":"string","required":false,"description":"standard = AI dubbing (HeyGen, audio only), 5 credits/min, lipsync = 14 credits/min"},{"name":"target_langs","type":"array","required":true,"description":"Target language codes to dub into, e.g. ['en','es']"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":332},{"name":"panda_action_create_tutor_from_folder","title":"Create AI Tutor from Folder","description":"Deterministically resolve a folder, estimate the credit cost via purchase_overview, and create an AI Tutor bound to every CONVERTED video in the folder. dry_run=true (default) returns the cost preview without creating anything.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"initial_question","type":"string","required":false,"description":"Optional initial question shown in chat"},{"name":"lang","type":"string","required":false,"description":"Tutor language code (default 'pt-BR')"},{"name":"name","type":"string","required":true,"description":"Name for the new tutor"},{"name":"open_new_tab","type":"boolean","required":false,"description":"Open links in a new tab"},{"name":"question_suggestions","type":"boolean","required":false,"description":"Show suggested questions"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":177},{"name":"panda_action_add_folder_videos_to_tutor","title":"Add Folder Videos to Tutor","description":"Deterministically resolve an existing AI Tutor (by name or ID) and a folder, then bind every CONVERTED folder video to the tutor (PUT /assist-ai/update_assistant_video_bind/{id}). Additive: videos already bound stay as they are and nothing is unbound. Billing: each NEW video without a subtitle in the tutor's language gets a transcription, charged at ceil(minutes/5) credits per video (Gold/Enterprise plans outside trial get free transcriptions up to a daily limit); without enough credits the API refuses before binding anything. dry_run=true (default) previews the additions.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = bind"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"tutor_ref","type":"string","required":true,"description":"Tutor name or ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":198},{"name":"panda_action_enable_ai_package_for_folder","title":"Enable AI Package for Folder","description":"Deterministically resolve a folder and generate AI package resources — eBook, mind map and/or quiz — for every CONVERTED video, one request per video × resource (POST /aiworkflow ABSTRACT | MINDMAP | QUESTIONS, like the dashboard). Default: the three resources in each video's own language. Resources a video already has in a language (or is still generating) are skipped. PAID: 1 credit per minute of video per resource per language (minimum 1 min; a partial minute counts only past 1 s); on an active Gold/Enterprise plan the free daily AI quota covers the first requests while it lasts (1 use per request). dry_run=true (default) returns the cost preview; execution is refused when the balance doesn't cover the cost.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = generate"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"from_lang","type":"string","required":false,"description":"Spoken language of the videos. Default: each video's original language, else 'auto'"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"resources","type":"array","required":false,"description":"Which resources to generate (default all three)"},{"name":"to_langs","type":"array","required":false,"description":"Languages to generate in, e.g. ['pt-BR','en']. Default: each video's own language"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":287},{"name":"panda_action_folder_ai_status","title":"Folder AI Status","description":"Deterministically resolve a folder and report the aggregate status of all its AI workflow jobs (subtitles, dubbing, AI package) via GET /aiworkflow?folder_id. Read-only — returns counts by status and by type. No dry_run (nothing is mutated).","inputs":[{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":82},{"name":"panda_action_generate_shorts_from_folder","title":"Generate Shorts from Folder","description":"Deterministically resolve a folder and submit each eligible video (CONVERTED, 5min–5h) for AI Shorts generation (POST /shorts/import-video). Each job consumes Shorts processing. dry_run=true (default) previews eligible videos. DRM-protected videos are rejected by the API and surfaced per-video.","inputs":[{"name":"aspect_ratio","type":"string","required":false,"description":"Output aspect ratio"},{"name":"contexts","type":"array","required":false,"description":"AI context hints (e.g. 'engajamento','educacional','humor')"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = submit"},{"name":"duration_preset","type":"string","required":false,"description":"Clip duration range in seconds"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":176},{"name":"panda_action_set_custom_field_for_folder","title":"Set Custom Field for Folder","description":"Deterministically resolve a folder and set a custom metadata field (key/value) on every CONVERTED video (POST /videos/{id}?custom_fields). dry_run=true (default) previews the affected videos.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"key","type":"string","required":true,"description":"Custom field key (max 200 chars)"},{"name":"value","type":"string","required":true,"description":"Custom field value (max 500 chars)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":135},{"name":"panda_action_apply_watermark_group_to_folder","title":"Apply Watermark Group to Folder","description":"Deterministically resolve a watermark/DRM group (by name or ID) and a folder, then add the folder to the group so all its videos (current and future) inherit the forensic watermark (PUT /drm/videos/{id} folders.increment). dry_run=true (default) previews.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"group_ref","type":"string","required":true,"description":"Watermark group name or ID"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":137},{"name":"panda_action_create_watermark_group_for_folder","title":"Create Watermark Group for Folder","description":"Deterministically resolve a folder and create a new watermark/DRM group seeded with all its videos (POST /drm/videos). dry_run=true (default) previews the group and its videos.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"group_name","type":"string","required":true,"description":"Name for the new watermark group"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":117},{"name":"panda_action_add_folder_videos_to_funnel","title":"Add Folder Videos to Funnel","description":"Deterministically resolve a funnel (by name or ID) and a folder, then add every CONVERTED folder video to the funnel (POST /funnels/add_videos). dry_run=true (default) previews the additions.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = add"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"funnel_ref","type":"string","required":true,"description":"Funnel name or ID"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":121},{"name":"panda_action_schedule_lives","title":"Schedule Lives","description":"Create one or more scheduled live streams in a single call (POST /lives), optionally recording into a resolved folder. Defaults like the dashboard: region us, quality_package hd, save_vod true. Refuses trial accounts and quality above the plan's maximum. Without stream_key_id the account's default stream key is used. dry_run=true (default) previews the lives that would be created.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"folder_ref","type":"string","required":false,"description":"Optional folder (name/ID/URL) to store recordings in"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"lives","type":"array","required":true,"description":"Lives to create"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":155},{"name":"panda_action_set_anti_download","title":"Set Anti-Download Protection","description":"Enable or disable account-wide anti-download protection (GET/PUT /block_download). Reads the current state first and only changes it if needed. Turning it on is only for plans that include it (Gold/Enterprise and others; Silver/Bronze need the \"Anti-Download Simples\" add-on, contracted in the dashboard; not available on Clipador/Clipper and VSL Only plans). Turning it off also turns Exclusive Playback off; a paid add-on stays billed until it is removed in the dashboard. dry_run=true (default) previews the change.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"enabled","type":"boolean","required":true,"description":"true = enable anti-download, false = disable"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":174},{"name":"panda_action_set_allowed_domains","title":"Set Allowed/Blocked Domains","description":"Add referer domains to the account's allow/block list for playback (POST /library/{id}?action=refer) and optionally turn domain protection on or off (block_none_refer). block_none_refer is applied first and rewrites the status of ALL the library's domains: true activates every domain (including ones turned off on purpose), false deactivates all of them and lets every request play; it is refused while a domain is still pending. With protection off, the new domains are created inactive. Resolves the library ID automatically. dry_run=true (default) previews.","inputs":[{"name":"allow","type":"array","required":false,"description":"Hostnames to allow (e.g. 'example.com')"},{"name":"block","type":"array","required":false,"description":"Hostnames to block"},{"name":"block_none_refer","type":"boolean","required":false,"description":"If set, turn domain protection on (true: active domains apply, all domains are activated) or off (false: all domains are deactivated)"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":230},{"name":"panda_action_request_folder_downloads","title":"Request Folder Downloads","description":"Deterministically resolve a folder and request an async download for every CONVERTED video (POST /download-async/{externalId}). Without quality, each video is requested at the highest quality it has; with a quality, videos that don't have it are skipped with the reason. Results list each video's status and `url` when it is already ready (temporary signed link); poll the others with panda_check_download_status. dry_run=true (default) previews the requests.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = request"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"format","type":"string","required":false,"description":"Download format"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"language","type":"string","required":false,"description":"Audio language: 'default' (original audio) or the code of a dubbed audio (e.g. 'en'). 'original' is read as 'default'."},{"name":"quality","type":"string","required":false,"description":"Quality: one of 240p, 360p, 480p, 720p, 1080p, 1440p, 2160p, original ('1080' is read as '1080p'). Default: the highest quality of each video."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":266},{"name":"panda_action_export_folder_analytics","title":"Export Folder Analytics","description":"Deterministically resolve a folder and aggregate per-video play analytics over a date range (GET /general/{videoId} on the analytics host). Read-only — returns a per-video breakdown and folder total. No dry_run.","inputs":[{"name":"end_date","type":"string","required":true,"description":"End date (YYYY-MM-DD)"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"start_date","type":"string","required":true,"description":"Start date (YYYY-MM-DD)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":101},{"name":"panda_action_create_ab_test","title":"Create A/B Test","description":"Create an A/B comparison from 2+ videos (POST /comparison) and optionally start it immediately (PUT /comparison/{id}?type=start). dry_run=true (default) previews.","inputs":[{"name":"description","type":"string","required":false,"description":"Optional description"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"name","type":"string","required":true,"description":"Comparison name"},{"name":"start","type":"boolean","required":false,"description":"Start the test immediately after creating"},{"name":"video_ids","type":"array","required":true,"description":"Video IDs to compare (at least 2)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":130},{"name":"panda_action_credit_preflight","title":"Credit Preflight","description":"Estimate the credit cost of running a paid operation (dub / subtitles / ai_package) across every CONVERTED video in a folder and compare it to the current balance — WITHOUT executing anything. ai_package = eBook + mind map + quiz in target_langs (default 1 language), 1 credit/min per resource per language, minus the free daily AI quota of an active Gold/Enterprise plan (1 use per video × resource); resources the videos already have aren't subtracted (panda_action_enable_ai_package_for_folder with dry_run=true gives the exact preview). Read-only; use before the real action to decide whether to proceed.","inputs":[{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"mode","type":"string","required":false,"description":"Dubbing mode"},{"name":"operation","type":"string","required":true,"description":"Which paid operation to price"},{"name":"target_langs","type":"array","required":false,"description":"Target languages (for dub/subtitles/ai_package); count drives the cost"},{"name":"tier","type":"string","required":false,"description":"Subtitle tier"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":210},{"name":"panda_action_preview_storage_reduction","title":"Preview Storage Reduction","description":"How much the invoice will be if the account reduces its ADDITIONAL storage — to a new total (target_total_gb) or by removing an amount (remove_gb), in GB (1 TB = 1024 GB). Without an amount, returns the current storage, what is in use and the smallest possible total. Refuses totals below what is already in use or below what the plan includes (plan storage only changes by changing plans). It never applies the change (that is done in the dashboard). dry_run=true (default) checks the new total against the plan and usage without calling billing; dry_run=false also gets the price from billing (same calculation as the dashboard cart: next invoice, next cycles, savings). Side effect of dry_run=false, same as opening the preview in the dashboard: if the account has a subscription but no default payment method, Panda's billing sets its first saved card as the default payment method.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = check the new total only; false = also get the price from billing"},{"name":"remove_gb","type":"number","required":false,"description":"How much to remove from the current total, in GB. Use this OR target_total_gb."},{"name":"target_total_gb","type":"number","required":false,"description":"Desired new TOTAL storage, in GB (1 TB = 1024 GB). Use this OR remove_gb."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":285},{"name":"panda_action_transfer_credits_to_subaccount","title":"Transfer Credits to Subaccount","description":"Resolve a subaccount by name or ID and transfer credits to it (POST /user/limit/transfer_credits). Checks the parent balance first. dry_run=true (default) previews the transfer.","inputs":[{"name":"credits","type":"integer","required":true,"description":"Number of credits to transfer"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = transfer"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"subaccount_ref","type":"string","required":true,"description":"Subaccount name or ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":113},{"name":"panda_action_provision_user","title":"Provision Team User","description":"Create a team user, resolving the role by name (or original_name/ID) to its role_id (POST /users). dry_run=true (default) previews. Validates the email format up front.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"email","type":"string","required":true,"description":"User email"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"name","type":"string","required":true,"description":"User's display name"},{"name":"phone","type":"string","required":false,"description":"Optional phone number"},{"name":"role_ref","type":"string","required":true,"description":"Role name or ID (e.g. 'viewer', 'editor')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":137},{"name":"panda_action_create_review_link_for_folder","title":"Create Review Links for Folder","description":"Deterministically resolve a folder and create a review link for every CONVERTED video (POST /video-review/{id}?action=link). dry_run=true (default) previews the links that would be created.","inputs":[{"name":"allow_comment","type":"boolean","required":false,"description":"Allow reviewers to comment"},{"name":"allow_status_edit","type":"boolean","required":false,"description":"Allow reviewers to change status"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = create"},{"name":"expires_at","type":"integer","required":false,"description":"Expiry as a Unix timestamp (0 = never)"},{"name":"folder_ref","type":"string","required":true,"description":"Folder name, ID, or dashboard URL"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"link_name","type":"string","required":true,"description":"Name applied to each review link"},{"name":"show_resolved","type":"boolean","required":false,"description":"Show resolved comments"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":175},{"name":"panda_action_set_webhook","title":"Set Account Webhook","description":"Idempotently set the account webhook URL. Reads the current webhook (GET /user/webhook); if a different one exists it is removed (DELETE /user/webhook/{id}) before creating the new one (POST /user/webhook). dry_run=true (default) previews the change.","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = apply"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"url","type":"string","required":true,"description":"Webhook URL to receive Panda events"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":117},{"name":"panda_action_set_forms_integration","title":"Set Forms/CRM Integration","description":"Create or update a forms/CRM integration by service name. Reads existing integrations (GET /forms-integration/get); updates in place if the service already exists (PUT /forms-integration/update), otherwise creates it (POST /forms-integration/save). dry_run=true (default) previews.","inputs":[{"name":"api_key","type":"string","required":false,"description":"API key/token"},{"name":"api_url","type":"string","required":false,"description":"API URL (if the service uses one)"},{"name":"dry_run","type":"boolean","required":false,"description":"true = preview only; false = save"},{"name":"idempotency_key","type":"string","required":false,"description":"Reserved client-supplied retry key"},{"name":"name","type":"string","required":false,"description":"Display name"},{"name":"service","type":"string","required":true,"description":"Integration service identifier (e.g. 'rd_station')"},{"name":"webhook_url","type":"string","required":false,"description":"Webhook URL (if applicable)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":170}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T08:24:51.000Z","track":"remote","endpoint":"https://mcp.pandavideo.com/mcp","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.2","cipherSuite":"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=*.pandavideo.com","issuer":"CN=Amazon RSA 2048 M01,O=Amazon,C=US","notBefore":"2026-10-22T00:00:00Z","notAfter":"2027-05-07T23:59:59Z","keyType":"RSA","keyBits":2048,"isCa":false},{"subject":"CN=Amazon RSA 2048 M01,O=Amazon,C=US","issuer":"CN=Amazon Root CA 1,O=Amazon,C=US","notBefore":"2022-08-23T22:21:28Z","notAfter":"2030-08-23T22:21:28Z","keyType":"RSA","keyBits":2048,"isCa":true},{"subject":"CN=Amazon Root CA 1,O=Amazon,C=US","issuer":"CN=Starfield Services Root Certificate Authority - G2,O=Starfield Technologies\\, Inc.,L=Scottsdale,ST=Arizona,C=US","notBefore":"2015-05-25T12:00:00Z","notAfter":"2037-12-31T01:00:00Z","keyType":"RSA","keyBits":2048,"isCa":true}]},"dnssec":{"result":"insecure","label":"Not signed","name":"mcp.pandavideo.com.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"com.","outcome":"verified","label":"Verified"},{"zone":"pandavideo.com.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"enforced_validated","label":"Enforced and verified","gate":"invoke","gateLabel":"On tool calls","status":200,"authorizationServers":["https://mcp.pandavideo.com"]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":301},"transports":[{"transport":"streamable-http","outcome":"verified","label":"Verified","status":200,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-07","recent":[{"id":"chg_01a1aacf-8dfd-76d7-a5a0-fd6a34b40815","kind":"tool.description_changed","summary":"Tool “panda_action_dub_folder_videos” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1aacf-8dfd-76d7-a5a0-fd6a34b40815"},{"id":"chg_01a1aacf-8dfe-7d23-91a6-96a1b18f8d9e","kind":"param.description_changed","summary":"“panda_action_dub_folder_videos” reworded the description of “mode”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1aacf-8dfe-7d23-91a6-96a1b18f8d9e"},{"id":"chg_01a1aacf-8dff-7754-8acf-20cd853a0afc","kind":"tool.description_changed","summary":"Tool “panda_create_ai_dubbing” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1aacf-8dff-7754-8acf-20cd853a0afc"},{"id":"chg_01a1aacf-8dff-7f04-9a2a-80a75311af81","kind":"param.description_changed","summary":"“panda_create_ai_dubbing” reworded the description of “is_lipsync”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1aacf-8dff-7f04-9a2a-80a75311af81"},{"id":"chg_01a1aacf-8e00-76f4-9189-7f3c69bd2d3a","kind":"score.total_changed","summary":"Trust score (91 → 92)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1aacf-8e00-76f4-9189-7f3c69bd2d3a"},{"id":"chg_01a1a5a5-073c-7918-85d0-f01e79b8cbfe","kind":"tool.description_changed","summary":"Tool “panda_add_videos_to_funnel” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1a5a5-073c-7918-85d0-f01e79b8cbfe"},{"id":"chg_01a1a5a5-073d-76b2-9647-d31b431afc65","kind":"tool.description_changed","summary":"Tool “panda_delete_funnel” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1a5a5-073d-76b2-9647-d31b431afc65"},{"id":"chg_01a1a5a5-073d-7b79-bc6e-900229ec862e","kind":"tool.description_changed","summary":"Tool “panda_get_business_rules” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1a5a5-073d-7b79-bc6e-900229ec862e"},{"id":"chg_01a1a5a5-073e-71b5-b1b5-8a462d214ac5","kind":"tool.description_changed","summary":"Tool “panda_help_search” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1a5a5-073e-71b5-b1b5-8a462d214ac5"},{"id":"chg_01a1a5a5-073e-7650-b711-3128678951ec","kind":"tool.description_changed","summary":"Tool “panda_remove_videos_from_funnel” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1a5a5-073e-7650-b711-3128678951ec"},{"id":"chg_01a1a080-5e65-7b43-997f-836e31b78b08","kind":"score.total_changed","summary":"Trust score (90 → 91)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1a080-5e65-7b43-997f-836e31b78b08"},{"id":"chg_01a1910c-031f-7f05-aac2-8726830dc974","kind":"score.total_changed","summary":"Trust score (89 → 90)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a1910c-031f-7f05-aac2-8726830dc974"},{"id":"chg_01a18be6-7676-7197-9b5d-1bff56fe56f8","kind":"check.measure","summary":"Schema quality (24596 → 27392)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7676-7197-9b5d-1bff56fe56f8"},{"id":"chg_01a18be6-7676-77c2-af80-5552ff433801","kind":"tool.description_changed","summary":"Tool “panda_action_credit_preflight” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7676-77c2-af80-5552ff433801"},{"id":"chg_01a18be6-7677-707e-817c-f69f83c53042","kind":"param.description_changed","summary":"“panda_action_credit_preflight” reworded the description of “target_langs”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7677-707e-817c-f69f83c53042"},{"id":"chg_01a18be6-7677-75bc-9264-644e4a7f76de","kind":"tool.description_changed","summary":"Tool “panda_action_enable_ai_package_for_folder” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7677-75bc-9264-644e4a7f76de"},{"id":"chg_01a18be6-7677-7b6e-9dbe-bf989249d821","kind":"param.description_changed","summary":"“panda_action_enable_ai_package_for_folder” reworded the description of “dry_run”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7677-7b6e-9dbe-bf989249d821"},{"id":"chg_01a18be6-7678-70c2-a069-ce45e6f5a780","kind":"param.description_changed","summary":"“panda_action_enable_ai_package_for_folder” reworded the description of “from_lang”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7678-70c2-a069-ce45e6f5a780"},{"id":"chg_01a18be6-7678-74f6-b600-73c9d84b1d49","kind":"param.added_optional","summary":"“panda_action_enable_ai_package_for_folder” added an optional parameter “resources”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7678-74f6-b600-73c9d84b1d49"},{"id":"chg_01a18be6-7678-7946-93b9-7a0dee277de4","kind":"param.added_optional","summary":"“panda_action_enable_ai_package_for_folder” added an optional parameter “to_langs”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp#chg-chg_01a18be6-7678-7946-93b9-7a0dee277de4"}],"truncated":true,"feedUrl":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp","markdown":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp.md","changelogJson":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/com-pandavideo-mcp/mcp.xml","external":[{"label":"Remote endpoint","href":"https://mcp.pandavideo.com/mcp"},{"label":"Repository","href":"https://github.com/pandavideo/panda-video-mcp"},{"label":"Website","href":"https://www.pandavideo.com/"}]}}