Video hosting: upload, organize and configure videos, analytics, AI subtitles and Shorts.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Panda Video API key (panda-...). Optional: clients that support OAuth 2.1 sign in instead.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
Folder name, ID, or dashboard URL
Funnel name or ID
true = preview only; false = add
Reserved client-supplied retry key
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Tool list last changed Oct 23, 2026.
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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = add |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| funnel_ref* | string | Funnel name or ID |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"funnel_ref",
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = add"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"funnel_ref": {
"type": "string",
"description": "Funnel name or ID"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = add |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| playlist_ref* | string | Playlist name or ID |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"playlist_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = add"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"playlist_ref": {
"type": "string",
"description": "Playlist name or ID"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Deterministically resolve an existing AI Tutor (by name or ID) and a folder, then bind every CONVERTED folder video to the tutor (POST /assist_ai/update_assistant_videos). dry_run=true (default) previews the additions.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = bind |
| tutor_ref* | string | Tutor name or ID |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tutor_ref",
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = bind"
},
"tutor_ref": {
"type": "string",
"description": "Tutor name or ID"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Deterministically resolve a player profile and a folder, list eligible (CONVERTED) videos, and apply the profile to all of them in one call. Free action (no credits). dry_run=true (default) returns a preview of which videos would be updated.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = apply |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| profile_ref* | string | Player profile name or ID |
| idempotency_key | string | Reserved client-supplied key to make retries safe (not yet enforced server-side) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"profile_ref",
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"profile_ref": {
"type": "string",
"description": "Player profile name or ID"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied key to make retries safe (not yet enforced server-side)"
}
},
"additionalProperties": false
}Deterministically resolve a folder and apply per-video player config to every CONVERTED video (POST /player?type=video). Supports: panda_branding, default_subtitle (lang 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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = apply |
| mindmap | boolean | Enable/disable AI MindMap |
| abstract | boolean | Enable/disable AI eBook/Abstract |
| on_funnel | boolean | Enable/disable funnel integration |
| questions | boolean | Enable/disable AI Quiz |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| panda_branding | boolean | Show/hide Panda logo branding |
| idempotency_key | string | Reserved client-supplied retry key |
| default_subtitle | string |
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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = apply |
| group_ref* | string | Watermark group name or ID |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"group_ref",
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"group_ref": {
"type": "string",
"description": "Watermark group name or ID"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Deterministically apply player-profile settings to every CONVERTED video in a folder, taking the correct create-or-update route per video. Covers everything a profile holds: colors (Cores), controls incl. the big play button 'play-large' (Controles / Botão de Play Grande), caption appearance (Legendas), VSL, save-progress, and general settings — pass any subset. Per video: if it already has a profile, that profile is updated (PUT /profile/{id}); if it has none, a new profile is created (POST /profile, name=video id), configured, and assigned (set-videos). dry_run=true (default) first VALIDATES each video (has-profile vs not) and previews the plan without changing anything.
| Argument | Type | Description |
|---|---|---|
| vsl | object | VSL (Video Sales Letter) settings — controls autoplay, smart autoplay, fake progress bar, muted indicator |
| colors | object | Player color settings |
| dry_run | boolean | true = validate + preview only; false = apply |
| general | object | General player + subtitle settings (speed, font size, search-in-video, defaults). |
| captions | object | Per-video subtitle (caption) appearance — text and background colors (v2 dashboard). |
| controls | array | 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", "pip", "fullscreen", "airplay", "cast" |
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.
| Argument | Type | Description |
|---|---|---|
| name* | string | Comparison name |
| start | boolean | Start the test immediately after creating |
| dry_run | boolean | true = preview only; false = create |
| video_ids* | array | Video IDs to compare (at least 2) |
| description | string | Optional description |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"video_ids"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Comparison name"
},
"start": {
"type": "boolean",
"default": false,
"description": "Start the test immediately after creating"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"description": "Video IDs to compare (at least 2)"
},
"description": {
"type": "string",
"default": "",
"description": "Optional description"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| path* | string | Slash-separated folder path by name, e.g. 'Courses/2026/Module 1' |
| dry_run | boolean | true = preview only; false = create |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"minLength": 1,
"description": "Slash-separated folder path by name, e.g. 'Courses/2026/Module 1'"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = create |
| password | string | Password (for password-protected playlists) |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| access_type | string | Playlist access type (the Panda API requires it; defaults to anyone_with_link) |
| creator_name | string | Creator name shown in the player (the Panda API requires it; defaults to the playlist name) |
| playlist_name* | string | Name for the new playlist |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"playlist_name"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"password": {
"type": "string",
"description": "Password (for password-protected playlists)"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"access_type": {
"enum": [
"anyone_with_link",
"anyone_with_password"
],
"type": "string",
"default": "anyone_with_link",
"description": "Playlist access type (the Panda API requires it; defaults to anyone_with_link)"
},
"creator_name": {
"type": "string",
"description": "Creator name shown in the player (the Panda API requires it; defaults to the playlist name)"
},
"playlist_name": {
"type": "string",
"minLength": 1,
"description": "Name for the new playlist"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = create |
| link_name* | string | Name applied to each review link |
| expires_at | integer | Expiry as a Unix timestamp (0 = never) |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| allow_comment | boolean | Allow reviewers to comment |
| show_resolved | boolean | Show resolved comments |
| idempotency_key | string | Reserved client-supplied retry key |
| allow_status_edit | boolean | Allow reviewers to change status |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"link_name"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"link_name": {
"type": "string",
"minLength": 1,
"description": "Name applied to each review link"
},
"expires_at": {
"type": "integer",
"default": 0,
"description": "Expiry as a Unix timestamp (0 = never)"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"allow_comment": {
"type": "boolean",
"default": true,
"description": "Allow reviewers to comment"
},
"show_resolved": {
"type": "boolean",
"default": true,
"description": "Show resolved comments"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
},
"allow_status_edit": {
"type": "boolean",
"default": false,
"description": "Allow reviewers to change status"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| lang | string | Tutor language code (default 'pt-BR') |
| name* | string | Name for the new tutor |
| dry_run | boolean | true = preview only; false = create |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| open_new_tab | boolean | Open links in a new tab |
| idempotency_key | string | Reserved client-supplied retry key |
| initial_question | string | Optional initial question shown in chat |
| question_suggestions | boolean | Show suggested questions |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"name"
],
"properties": {
"lang": {
"type": "string",
"default": "pt-BR",
"description": "Tutor language code (default 'pt-BR')"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Name for the new tutor"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"open_new_tab": {
"type": "boolean",
"default": false,
"description": "Open links in a new tab"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
},
"initial_question": {
"type": "string",
"default": "",
"description": "Optional initial question shown in chat"
},
"question_suggestions": {
"type": "boolean",
"default": false,
"description": "Show suggested questions"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = create |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| group_name* | string | Name for the new watermark group |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"group_name"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"group_name": {
"type": "string",
"minLength": 1,
"description": "Name for the new watermark group"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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. Read-only; use before the real action to decide whether to proceed.
| Argument | Type | Description |
|---|---|---|
| mode | string | Dubbing mode |
| tier | string | Subtitle tier |
| operation* | string | Which paid operation to price |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| target_langs | array | Target languages (for dub/subtitles); count drives the cost |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"operation"
],
"properties": {
"mode": {
"enum": [
"standard",
"lipsync"
],
"type": "string",
"default": "standard",
"description": "Dubbing mode"
},
"tier": {
"enum": [
"essential",
"advanced",
"pro"
],
"type": "string",
"default": "essential",
"description": "Subtitle tier"
},
"operation": {
"enum": [
"dub",
"subtitles",
"ai_package"
],
"type": "string",
"description": "Which paid operation to price"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"target_langs": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Target languages (for dub/subtitles); count drives the cost"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| confirm | boolean | Required safety flag — must be true (with dry_run=false) to delete |
| dry_run | boolean | true = preview only; false = delete |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Required safety flag — must be true (with dry_run=false) to delete"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = delete"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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 = 2 credits/min, lipsync = 10 credits/min (lipsync rejects videos over 60 minutes).
| Argument | Type | Description |
|---|---|---|
| mode | string | standard = 2 credits/min, lipsync = 10 credits/min |
| dry_run | boolean | true = preview only; false = create jobs |
| from_lang | string | Source language code (default 'auto') |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| target_langs* | array | Target language codes to dub into, e.g. ['en','es'] |
| idempotency_key | string | Reserved client-supplied key to make retries safe (not yet enforced server-side) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"target_langs"
],
"properties": {
"mode": {
"enum": [
"standard",
"lipsync"
],
"type": "string",
"default": "standard",
"description": "standard = 2 credits/min, lipsync = 10 credits/min"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create jobs"
},
"from_lang": {
"type": "string",
"default": "auto",
"description": "Source language code (default 'auto')"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"target_langs": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Target language codes to dub into, e.g. ['en','es']"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied key to make retries safe (not yet enforced server-side)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = duplicate |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = duplicate"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Deterministically resolve a folder and activate the AI package (mindmap + abstract/eBook + quiz) for every CONVERTED video (POST /aiworkflow type=ALL_TEXT_ITEMS). Estimates credits (1/started minute; Gold/Enterprise may have a free daily quota that reduces real cost). dry_run=true (default) returns the cost preview.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = activate |
| from_lang | string | Source language code (default 'auto') |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = activate"
},
"from_lang": {
"type": "string",
"default": "auto",
"description": "Source language code (default 'auto')"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| end_date* | string | End date (YYYY-MM-DD) |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| start_date* | string | Start date (YYYY-MM-DD) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"start_date",
"end_date"
],
"properties": {
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "End date (YYYY-MM-DD)"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}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).
| Argument | Type | Description |
|---|---|---|
| folder_ref* | string | Folder name, ID, or dashboard URL |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = submit |
| contexts | array | AI context hints (e.g. 'engajamento','educacional','humor') |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| aspect_ratio | string | Output aspect ratio |
| duration_preset | string | Clip duration range in seconds |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = submit"
},
"contexts": {
"type": "array",
"items": {
"type": "string"
},
"default": [
"engajamento"
],
"description": "AI context hints (e.g. 'engajamento','educacional','humor')"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"aspect_ratio": {
"enum": [
"vertical",
"horizontal",
"square"
],
"type": "string",
"default": "vertical",
"description": "Output aspect ratio"
},
"duration_preset": {
"enum": [
"30-60",
"60-90",
"90-180"
],
"type": "string",
"default": "30-60",
"description": "Clip duration range in seconds"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| tier | string | Quality tier (essential restricts languages to en/pt-BR/es) |
| dry_run | boolean | true = preview only; false = generate |
| from_lang | string | Source language code (default 'auto') |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| target_langs* | array | Subtitle language codes to generate, e.g. ['en','es'] |
| idempotency_key | string | Reserved client-supplied key to make retries safe (not yet enforced server-side) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"target_langs"
],
"properties": {
"tier": {
"enum": [
"essential",
"advanced",
"pro"
],
"type": "string",
"default": "essential",
"description": "Quality tier (essential restricts languages to en/pt-BR/es)"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = generate"
},
"from_lang": {
"type": "string",
"default": "auto",
"description": "Source language code (default 'auto')"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"target_langs": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Subtitle language codes to generate, e.g. ['en','es']"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied key to make retries safe (not yet enforced server-side)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = move |
| idempotency_key | string | Reserved client-supplied key to make retries safe (not yet enforced server-side) |
| source_folder_ref* | string | Source folder name, ID, or dashboard URL |
| target_folder_ref* | string | Target folder name, ID, or dashboard URL — or 'root' to move to the root (no folder) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"source_folder_ref",
"target_folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = move"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied key to make retries safe (not yet enforced server-side)"
},
"source_folder_ref": {
"type": "string",
"description": "Source folder name, ID, or dashboard URL"
},
"target_folder_ref": {
"type": "string",
"description": "Target folder name, ID, or dashboard URL — or 'root' to move to the root (no folder)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = check the new total only; false = also get the price from billing |
| remove_gb | number | How much to remove from the current total, in GB. Use this OR target_total_gb. |
| target_total_gb | number | Desired new TOTAL storage, in GB (1 TB = 1024 GB). Use this OR remove_gb. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = check the new total only; false = also get the price from billing"
},
"remove_gb": {
"type": "number",
"description": "How much to remove from the current total, in GB. Use this OR target_total_gb.",
"exclusiveMinimum": 0
},
"target_total_gb": {
"type": "number",
"description": "Desired new TOTAL storage, in GB (1 TB = 1024 GB). Use this OR remove_gb.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| name* | string | User's display name |
| email* | string | User email |
| phone | string | Optional phone number |
| dry_run | boolean | true = preview only; false = create |
| role_ref* | string | Role name or ID (e.g. 'viewer', 'editor') |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"email",
"role_ref"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "User's display name"
},
"email": {
"type": "string",
"description": "User email"
},
"phone": {
"type": "string",
"description": "Optional phone number"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"role_ref": {
"type": "string",
"description": "Role name or ID (e.g. 'viewer', 'editor')"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Deterministically resolve a folder and re-encode every CONVERTED video with a given compression mode. Reprocessing consumes processing resources. dry_run=true (default) previews the affected videos.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = reencode |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
| compression_mode* | string | Compression mode applied to every video |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"compression_mode"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = reencode"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
},
"compression_mode": {
"enum": [
"lossless",
"balanced",
"aggressive"
],
"type": "string",
"description": "Compression mode applied to every video"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| confirm | boolean | Required safety flag to delete |
| dry_run | boolean | true = preview only; false = delete |
| language* | string | Subtitle language code to remove (e.g. 'en') |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"language"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Required safety flag to delete"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = delete"
},
"language": {
"type": "string",
"description": "Subtitle language code to remove (e.g. 'en')"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Deterministically resolve a folder by name/ID/URL and rename it (PUT /folders/{id}). dry_run=true (default) previews the rename.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = rename |
| new_name* | string | New folder name |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"new_name"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = rename"
},
"new_name": {
"type": "string",
"minLength": 1,
"description": "New folder name"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Deterministically resolve a folder and request an async download for every CONVERTED video at a given quality/format/language (POST /download-async/{externalId}). Poll status later with panda_check_download_status. dry_run=true (default) previews the requests.
| Argument | Type | Description |
|---|---|---|
| format | string | Download format |
| dry_run | boolean | true = preview only; false = request |
| quality | string | Quality (e.g. '1080', '720', '480') |
| language | string | Language code (e.g. 'original', 'en') |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"format": {
"enum": [
"video",
"audio"
],
"type": "string",
"default": "video",
"description": "Download format"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = request"
},
"quality": {
"type": "string",
"default": "1080",
"description": "Quality (e.g. '1080', '720', '480')"
},
"language": {
"type": "string",
"default": "original",
"description": "Language code (e.g. 'original', 'en')"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| lives* | array | Lives to create |
| dry_run | boolean | true = preview only; false = create |
| folder_ref | string | Optional folder (name/ID/URL) to store recordings in |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"lives"
],
"properties": {
"lives": {
"type": "array",
"items": {
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"minLength": 3,
"description": "Live title (min 3 characters)"
},
"region": {
"enum": [
"us",
"br"
],
"type": "string",
"description": "us (default) or br (lower delay for viewers in Brazil)"
},
"save_vod": {
"type": "boolean",
"description": "Save the recording as a video (default true)"
},
"scheduled_at": {
"type": "string",
"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."
},
"stream_key_id": {
"type": "string",
"description": "Stream key ID (panda_list_stream_keys); default key when omitted"
},
"quality_package": {
"enum": [
"sd",
"hd",
"fhd",
"4k"
],
"type": "string",
"description": "sd, hd (default), fhd (Full HD) or 4k"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Lives to create"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = create"
},
"folder_ref": {
"type": "string",
"description": "Optional folder (name/ID/URL) to store recordings in"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Add referer domains to the account's allow/block list for playback (POST /library/{id}?action=refer) and optionally toggle 'block requests with no referer'. Resolves the library ID automatically. dry_run=true (default) previews.
| Argument | Type | Description |
|---|---|---|
| allow | array | Hostnames to allow (e.g. 'example.com') |
| block | array | Hostnames to block |
| dry_run | boolean | true = preview only; false = apply |
| idempotency_key | string | Reserved client-supplied retry key |
| block_none_refer | boolean | If set, block playback requests that carry no referer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"allow": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Hostnames to allow (e.g. 'example.com')"
},
"block": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Hostnames to block"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
},
"block_none_refer": {
"type": "boolean",
"description": "If set, block playback requests that carry no referer"
}
},
"additionalProperties": false
}Enable or disable account-wide anti-download protection (GET/PUT /block_download). Reads the current state first and only changes it if needed. dry_run=true (default) previews the change.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = apply |
| enabled* | boolean | true = enable anti-download, false = disable |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"enabled"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"enabled": {
"type": "boolean",
"description": "true = enable anti-download, false = disable"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Custom field key (max 200 chars) |
| value* | string | Custom field value (max 500 chars) |
| dry_run | boolean | true = preview only; false = apply |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Custom field key (max 200 chars)"
},
"value": {
"type": "string",
"maxLength": 500,
"description": "Custom field value (max 500 chars)"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = apply |
| language* | string | Subtitle language code to set as default (e.g. 'pt-BR'), or 'false' to clear |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"language"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"language": {
"type": "string",
"description": "Subtitle language code to set as default (e.g. 'pt-BR'), or 'false' to clear"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}Enable or disable a single player control on every CONVERTED video in a folder, via player profiles, PRESERVING all other controls. 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 profile 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. Videos without a profile get one created and assigned. dry_run=true (default) validates + previews per-video changes.
| Argument | Type | Description |
|---|---|---|
| control* | string | Player control to toggle. 'play-large' = the big center play button. |
| dry_run | boolean | true = validate + preview only; false = apply |
| enabled* | boolean | true = show the control, false = hide/disable it |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"control",
"enabled"
],
"properties": {
"control": {
"enum": [
"play-large",
"rewind",
"play",
"fast-forward",
"progress",
"current-time",
"volume",
"captions",
"settings",
"pip",
"fullscreen",
"airplay",
"cast"
],
"type": "string",
"description": "Player control to toggle. 'play-large' = the big center play button."
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = validate + preview only; false = apply"
},
"enabled": {
"type": "boolean",
"description": "true = show the control, false = hide/disable it"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true = preview only; false = apply |
| enabled* | boolean | true = allow offline playback, false = disable |
| folder_ref* | string | Folder name, ID, or dashboard URL |
| expire_days | any | Days until offline access expires (null = never) |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref",
"enabled"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"enabled": {
"type": "boolean",
"description": "true = allow offline playback, false = disable"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"expire_days": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Days until offline access expires (null = never)"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| name | string | Display name |
| api_key | string | API key/token |
| api_url | string | API URL (if the service uses one) |
| dry_run | boolean | true = preview only; false = save |
| service* | string | Integration service identifier (e.g. 'rd_station') |
| webhook_url | string | Webhook URL (if applicable) |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"service"
],
"properties": {
"name": {
"type": "string",
"description": "Display name"
},
"api_key": {
"type": "string",
"description": "API key/token"
},
"api_url": {
"type": "string",
"description": "API URL (if the service uses one)"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = save"
},
"service": {
"type": "string",
"minLength": 1,
"description": "Integration service identifier (e.g. 'rd_station')"
},
"webhook_url": {
"type": "string",
"description": "Webhook URL (if applicable)"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| url* | string | Webhook URL to receive Panda events |
| dry_run | boolean | true = preview only; false = apply |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Webhook URL to receive Panda events"
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| credits* | integer | Number of credits to transfer |
| dry_run | boolean | true = preview only; false = transfer |
| subaccount_ref* | string | Subaccount name or ID |
| idempotency_key | string | Reserved client-supplied retry key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"subaccount_ref",
"credits"
],
"properties": {
"credits": {
"type": "integer",
"description": "Number of credits to transfer",
"exclusiveMinimum": 0
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = transfer"
},
"subaccount_ref": {
"type": "string",
"description": "Subaccount name or ID"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| url | string | URL opened when the button is clicked. Required unless custom_html is set. |
| size | string | Button size (default: small) |
| text | string | Button label text. Required unless custom_html is set. |
| end_time | number | Seconds into the video when the button disappears. Omit to show until the end of the video. |
| position | string | Button position on the video overlay. Only applies to placement='inside'. |
| video_id* | string | Video ID |
| placement* | string | Where to place the CTA |
| start_time | number | Seconds into the video when the button appears. Omit (with end_time) for the whole video. |
| text_color | string | Text color, hex (default: #FFFFFF) |
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>}}.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
| image_url* | string | Public URL of the image to upload |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"image_url"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
},
"image_url": {
"type": "string",
"format": "uri",
"description": "Public URL of the image to upload"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
| image_url* | string | Public URL of the image to upload |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"image_url"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
},
"image_url": {
"type": "string",
"format": "uri",
"description": "Public URL of the image to upload"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
| image_url* | string | Public URL of the image to use as the cover |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"image_url"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
},
"image_url": {
"type": "string",
"format": "uri",
"description": "Public URL of the image to use as the cover"
}
},
"additionalProperties": false
}Add videos to a Tutor AI assistant
| Argument | Type | Description |
|---|---|---|
| video_ids* | array | Video IDs to add (max 50) |
| assistant_id* | string | Tutor assistant ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assistant_id",
"video_ids"
],
"properties": {
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Video IDs to add (max 50)"
},
"assistant_id": {
"type": "string",
"description": "Tutor assistant ID"
}
},
"additionalProperties": false
}Add one or more videos to a funnel with optional coordinates
| Argument | Type | Description |
|---|---|---|
| id* | string | Funnel ID |
| videos* | array | Videos to add with optional positions |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"videos"
],
"properties": {
"id": {
"type": "string",
"description": "Funnel ID"
},
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"video_id"
],
"properties": {
"x": {
"type": "number",
"description": "X coordinate in funnel layout"
},
"y": {
"type": "number",
"description": "Y coordinate in funnel layout"
},
"is_first": {
"type": "boolean",
"description": "Mark as the initial video"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
},
"maxItems": 50,
"minItems": 1,
"description": "Videos to add with optional positions"
}
},
"additionalProperties": false
}Add videos to a playlist with order. Returns the updated playlist video entries [{video_id, playlist_id, order}].
| Argument | Type | Description |
|---|---|---|
| videos* | array | Videos to add with order |
| playlist_id* | string | Playlist ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"playlist_id",
"videos"
],
"properties": {
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"video_id",
"order"
],
"properties": {
"order": {
"type": "number",
"description": "Position order (0-based)"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Videos to add with order"
},
"playlist_id": {
"type": "string",
"description": "Playlist ID"
}
},
"additionalProperties": false
}Apply a player profile to one or more videos. Returns confirmation with the list of updated video_ids.
| Argument | Type | Description |
|---|---|---|
| video_ids* | array | List of video IDs to apply the profile to (max 50) |
| profile_id* | string | Profile ID to apply |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"profile_id",
"video_ids"
],
"properties": {
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "List of video IDs to apply the profile to (max 50)"
},
"profile_id": {
"type": "string",
"description": "Profile ID to apply"
}
},
"additionalProperties": false
}Check the status of an async download request. Returns {status, download_url} — url is present when status is 'ready'.
| Argument | Type | Description |
|---|---|---|
| format* | string | Requested format |
| quality* | string | Requested quality |
| language* | string | Requested language |
| video_external_id* | string | Video external ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_external_id",
"format",
"quality",
"language"
],
"properties": {
"format": {
"enum": [
"video",
"audio"
],
"type": "string",
"description": "Requested format"
},
"quality": {
"type": "string",
"description": "Requested quality"
},
"language": {
"type": "string",
"description": "Requested language"
},
"video_external_id": {
"type": "string",
"description": "Video external ID"
}
},
"additionalProperties": false
}Confirm that a file was successfully uploaded to a Tutor AI assistant (call after uploading to the presigned URL)
| Argument | Type | Description |
|---|---|---|
| file_id* | string | File ID returned from generate_file_upload_url |
| upload_success* | boolean | true if upload succeeded |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file_id",
"upload_success"
],
"properties": {
"file_id": {
"type": "string",
"description": "File ID returned from generate_file_upload_url"
},
"upload_success": {
"type": "boolean",
"description": "true if upload succeeded"
}
},
"additionalProperties": false
}Purchase credits and create a new AI assistant for a video. Returns the created {id, name, status, video_id}.
| Argument | Type | Description |
|---|---|---|
| name | string | Assistant name |
| video_id* | string | Video ID to bind the assistant to |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"name": {
"type": "string",
"description": "Assistant name"
},
"video_id": {
"type": "string",
"description": "Video ID to bind the assistant to"
}
},
"additionalProperties": false
}Create an AI dubbing job for a video. Costs 2 credits/min (standard) or 10 credits/min (lipsync). Returns {id, status, video_id, from_lang, to_lang}.
| Argument | Type | Description |
|---|---|---|
| to_lang* | string | Target language code (e.g. 'en', 'es') |
| video_id* | string | Video ID |
| from_lang* | string | Source language code (e.g. 'pt-BR', 'en') |
| is_lipsync | boolean | Use LipSync (lip sync, 10 credits/min). Default: standard dubbing (2 credits/min) |
| num_speakers | number | Number of speakers in the video |
| clone_original_voice | boolean | Clone original voice |
| replace_existing_subtitles | boolean | Replace existing subtitles with synced ones |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"from_lang",
"to_lang"
],
"properties": {
"to_lang": {
"type": "string",
"description": "Target language code (e.g. 'en', 'es')"
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"from_lang": {
"type": "string",
"description": "Source language code (e.g. 'pt-BR', 'en')"
},
"is_lipsync": {
"type": "boolean",
"default": false,
"description": "Use LipSync (lip sync, 10 credits/min). Default: standard dubbing (2 credits/min)"
},
"num_speakers": {
"type": "number",
"default": 1,
"description": "Number of speakers in the video"
},
"clone_original_voice": {
"type": "boolean",
"default": false,
"description": "Clone original voice"
},
"replace_existing_subtitles": {
"type": "boolean",
"default": false,
"description": "Replace existing subtitles with synced ones"
}
},
"additionalProperties": false
}Create a new A/B test. Needs at least 2 videos to start. Returns the created {id, name, status, video_ids}.
| Argument | Type | Description |
|---|---|---|
| name | string | Test name |
| video_ids | array | Video IDs to compare (min 2) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"type": "string",
"description": "Test name"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"description": "Video IDs to compare (min 2)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Field key/name |
| value* | string | Field value |
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"maxLength": 200,
"description": "Field key/name"
},
"value": {
"type": "string",
"maxLength": 500,
"description": "Field value"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Create a new folder. Returns the created {id, name, parent_folder_id}.
| Argument | Type | Description |
|---|---|---|
| name* | string | Folder name |
| parent_folder_id | string | Parent folder ID for nesting |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Folder name"
},
"parent_folder_id": {
"type": "string",
"description": "Parent folder ID for nesting"
}
},
"additionalProperties": false
}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 }.
| Argument | Type | Description |
|---|---|---|
| type* | string | ALLOW = whitelist (only listed domains play); BLOCK = blacklist (listed domains are denied) |
| hostname* | string | Domain hostname without protocol, e.g. 'example.com' or wildcard '*.cliente.com' |
| folder_id* | string | Folder UUID where the referrer applies |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_id",
"hostname",
"type"
],
"properties": {
"type": {
"enum": [
"ALLOW",
"BLOCK"
],
"type": "string",
"description": "ALLOW = whitelist (only listed domains play); BLOCK = blacklist (listed domains are denied)"
},
"hostname": {
"type": "string",
"description": "Domain hostname without protocol, e.g. 'example.com' or wildcard '*.cliente.com'"
},
"folder_id": {
"type": "string",
"description": "Folder UUID where the referrer applies"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}Create a new video funnel
| Argument | Type | Description |
|---|---|---|
| name* | string | Funnel name |
| description | string | Funnel description |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Funnel name"
},
"description": {
"type": "string",
"description": "Funnel description"
}
},
"additionalProperties": false
}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).
| Argument | Type | Description |
|---|---|---|
| title* | string | Live title (min 3 characters) |
| region | string | Broadcast region: us (USA) or br (Brazil, lower delay for viewers in Brazil) |
| save_vod | boolean | Save the recording as a video when the live ends (default true) |
| folder_id | string | Folder ID for recording |
| scheduled_at | string | 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. |
| stream_key_id | string | Stream key ID (panda_list_stream_keys); default key when omitted |
| quality_package | string | Quality package: sd, hd, fhd (Full HD) or 4k |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"minLength": 3,
"description": "Live title (min 3 characters)"
},
"region": {
"enum": [
"us",
"br"
],
"type": "string",
"description": "Broadcast region: us (USA) or br (Brazil, lower delay for viewers in Brazil)"
},
"save_vod": {
"type": "boolean",
"description": "Save the recording as a video when the live ends (default true)"
},
"folder_id": {
"type": "string",
"description": "Folder ID for recording"
},
"scheduled_at": {
"type": "string",
"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."
},
"stream_key_id": {
"type": "string",
"description": "Stream key ID (panda_list_stream_keys); default key when omitted"
},
"quality_package": {
"enum": [
"sd",
"hd",
"fhd",
"4k"
],
"type": "string",
"description": "Quality package: sd, hd, fhd (Full HD) or 4k"
}
},
"additionalProperties": false
}Create a new playlist. Videos are REFERENCES — removing from playlist does NOT delete the video. Returns the created {id, name, description, access_type}.
| Argument | Type | Description |
|---|---|---|
| name* | string | Playlist name |
| password | string | Password (for password-protected playlists) |
| access_type | string | Access type — REQUIRED by the Panda API; defaults to anyone_with_link |
| description | string | Playlist description |
| creator_name | string | Creator name displayed in player — REQUIRED by the API; defaults to the playlist name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Playlist name"
},
"password": {
"type": "string",
"description": "Password (for password-protected playlists)"
},
"access_type": {
"enum": [
"anyone_with_link",
"anyone_with_password"
],
"type": "string",
"default": "anyone_with_link",
"description": "Access type — REQUIRED by the Panda API; defaults to anyone_with_link"
},
"description": {
"type": "string",
"description": "Playlist description"
},
"creator_name": {
"type": "string",
"description": "Creator name displayed in player — REQUIRED by the API; defaults to the playlist name"
}
},
"additionalProperties": false
}Create a new player profile (POST /profile). IMPORTANT: per the Panda API, `name` MUST be the ID of an existing video — if it is not a real video ID the API returns 500 and nothing is created. Create only accepts `name` and `exclusive`; it does NOT accept colors/controls/vsl. To set those, call panda_update_profile with the returned profile id afterward. Returns {data: {id, name}}.
| Argument | Type | Description |
|---|---|---|
| name* | string | MUST be the ID of an existing video (the profile is created for that video) |
| exclusive | boolean | Optional. True = dedicated/restricted to a single video |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "MUST be the ID of an existing video (the profile is created for that video)"
},
"exclusive": {
"type": "boolean",
"description": "Optional. True = dedicated/restricted to a single video"
}
},
"additionalProperties": false
}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 }.
| Argument | Type | Description |
|---|---|---|
| refers* | array | Referrers to create (1 or more) |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"refers"
],
"properties": {
"refers": {
"type": "array",
"items": {
"type": "object",
"required": [
"hostname"
],
"properties": {
"type": {
"enum": [
"ALLOW",
"BLOCK"
],
"type": "string",
"default": "ALLOW",
"description": "ALLOW = whitelist (only listed domains play); BLOCK = blacklist (listed domains are denied)"
},
"hostname": {
"type": "string",
"description": "Domain hostname without protocol, e.g. 'example.com' or wildcard '*.cliente.com'"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Referrers to create (1 or more)"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}Create a new stream key for OBS or other streaming software. The account's first key becomes the default.
| Argument | Type | Description |
|---|---|---|
| title* | string | Stream key title (min 3 characters) |
| region | string | Region: us (default) or br |
| set_default | boolean | Make it the default key for new lives |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"minLength": 3,
"description": "Stream key title (min 3 characters)"
},
"region": {
"enum": [
"us",
"br"
],
"type": "string",
"description": "Region: us (default) or br"
},
"set_default": {
"type": "boolean",
"description": "Make it the default key for new lives"
}
},
"additionalProperties": false
}Create a new user in the organization. Returns the created {id, name, email, role_id}.
| Argument | Type | Description |
|---|---|---|
| name* | string | User full name |
| email* | string | User email |
| role_id | string | Role ID to assign |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "User full name"
},
"email": {
"type": "string",
"format": "email",
"description": "User email"
},
"role_id": {
"type": "string",
"description": "Role ID to assign"
}
},
"additionalProperties": false
}Create a new watermark group
| Argument | Type | Description |
|---|---|---|
| name* | string | Group name |
| video_ids | array | Videos to include in this group (max 50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Group name"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Videos to include in this group (max 50)"
}
},
"additionalProperties": false
}Delete an AI assistant
| Argument | Type | Description |
|---|---|---|
| assistant_id* | string | AI assistant ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assistant_id"
],
"properties": {
"assistant_id": {
"type": "string",
"description": "AI assistant ID"
}
},
"additionalProperties": false
}Delete an AI workflow (transcription, dubbing, etc.)
| Argument | Type | Description |
|---|---|---|
| workflow_id* | string | Workflow ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"workflow_id"
],
"properties": {
"workflow_id": {
"type": "string",
"description": "Workflow ID"
}
},
"additionalProperties": false
}Delete one or more A/B tests
| Argument | Type | Description |
|---|---|---|
| comparison_ids* | array | Comparison IDs to delete (max 50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"comparison_ids"
],
"properties": {
"comparison_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Comparison IDs to delete (max 50)"
}
},
"additionalProperties": false
}Delete a CTA from a video
| Argument | Type | Description |
|---|---|---|
| cta_id* | string | CTA ID to delete |
| video_id* | string | Video ID |
| placement* | string | CTA placement |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"placement",
"cta_id"
],
"properties": {
"cta_id": {
"type": "string",
"description": "CTA ID to delete"
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"placement": {
"enum": [
"inside",
"outside"
],
"type": "string",
"description": "CTA placement"
}
},
"additionalProperties": false
}Delete a dubbed audio track from a video
| Argument | Type | Description |
|---|---|---|
| audio_id* | string | Audio track ID to delete |
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"audio_id"
],
"properties": {
"audio_id": {
"type": "string",
"description": "Audio track ID to delete"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Delete a folder by ID. WARNING: All videos and subfolders inside are also deleted (cascade). Goes to trash for 30 days.
| Argument | Type | Description |
|---|---|---|
| folder_id* | string | Folder ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_id"
],
"properties": {
"folder_id": {
"type": "string",
"description": "Folder ID"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| refer_ids* | array | Folder referrer UUIDs to delete (max 50) |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"refer_ids"
],
"properties": {
"refer_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Folder referrer UUIDs to delete (max 50)"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}Delete a funnel by ID. WARNING: this is destructive. Videos inside the funnel may become inaccessible.
| Argument | Type | Description |
|---|---|---|
| funnel_id* | string | Funnel ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"funnel_id"
],
"properties": {
"funnel_id": {
"type": "string",
"description": "Funnel ID"
}
},
"additionalProperties": false
}Delete one or more live streams
| Argument | Type | Description |
|---|---|---|
| live_ids* | array | List of live IDs to delete (max 50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_ids"
],
"properties": {
"live_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "List of live IDs to delete (max 50)"
}
},
"additionalProperties": false
}Delete a playlist. Videos are NOT deleted — only the collection is removed.
| Argument | Type | Description |
|---|---|---|
| playlist_id* | string | Playlist ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"playlist_id"
],
"properties": {
"playlist_id": {
"type": "string",
"description": "Playlist ID"
}
},
"additionalProperties": false
}Delete a player profile by ID
| Argument | Type | Description |
|---|---|---|
| profile_id* | string | Profile ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"profile_id"
],
"properties": {
"profile_id": {
"type": "string",
"description": "Profile ID"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| refer_ids* | array | Referrer UUIDs to delete (max 50) |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"refer_ids"
],
"properties": {
"refer_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Referrer UUIDs to delete (max 50)"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}Delete a Shorts job/project
| Argument | Type | Description |
|---|---|---|
| job_id* | string | Shorts job ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"description": "Shorts job ID"
}
},
"additionalProperties": false
}Delete a subaccount
| Argument | Type | Description |
|---|---|---|
| organization_id* | string | Subaccount organization ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"organization_id"
],
"properties": {
"organization_id": {
"type": "string",
"description": "Subaccount organization ID"
}
},
"additionalProperties": false
}Remove a subtitle from a video by language
| Argument | Type | Description |
|---|---|---|
| srclang* | string | Language code to delete (e.g. pt-BR, en, es) |
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"srclang"
],
"properties": {
"srclang": {
"type": "string",
"description": "Language code to delete (e.g. pt-BR, en, es)"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| type | string | Thumbnail type to delete |
| video_id* | string | Video ID |
| thumb_name | string | Exact pause thumbnail file name (required for type 'pause') |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"type": {
"enum": [
"start",
"pause",
"end"
],
"type": "string",
"default": "start",
"description": "Thumbnail type to delete"
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"thumb_name": {
"type": "string",
"description": "Exact pause thumbnail file name (required for type 'pause')"
}
},
"additionalProperties": false
}Delete a file from a Tutor AI assistant
| Argument | Type | Description |
|---|---|---|
| file_id* | string | File ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "File ID"
}
},
"additionalProperties": false
}Remove a user from the organization
| Argument | Type | Description |
|---|---|---|
| user_id* | string | User ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"description": "User ID"
}
},
"additionalProperties": false
}Delete one or more videos by ID. Sends to trash for 30 days.
| Argument | Type | Description |
|---|---|---|
| video_ids* | array | List of video IDs to delete (max 50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_ids"
],
"properties": {
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "List of video IDs to delete (max 50)"
}
},
"additionalProperties": false
}Delete a watermark group
| Argument | Type | Description |
|---|---|---|
| drm_group_id* | string | Watermark group ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"drm_group_id"
],
"properties": {
"drm_group_id": {
"type": "string",
"description": "Watermark group ID"
}
},
"additionalProperties": false
}Disable auto-recharge for credits
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Disable watermark protection for the account
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Download a subtitle file for a specific language
| Argument | Type | Description |
|---|---|---|
| srclang* | string | Language code (e.g. 'pt-BR', 'en') |
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"srclang"
],
"properties": {
"srclang": {
"type": "string",
"description": "Language code (e.g. 'pt-BR', 'en')"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Create a copy of a video. Only works for CONVERTED, non-external, non-funnel videos.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID to duplicate |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID to duplicate"
}
},
"additionalProperties": false
}Enable auto-recharge for credits. When balance drops below trigger, recharges action_value.
| Argument | Type | Description |
|---|---|---|
| action_value* | number | Amount to recharge (min 5 credits) |
| trigger_value* | number | Balance threshold to trigger recharge (min 100) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"trigger_value",
"action_value"
],
"properties": {
"action_value": {
"type": "number",
"minimum": 5,
"description": "Amount to recharge (min 5 credits)"
},
"trigger_value": {
"type": "number",
"minimum": 100,
"description": "Balance threshold to trigger recharge (min 100)"
}
},
"additionalProperties": false
}Enable watermark protection for the account
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Finish an A/B test and declare a winner. PERMANENT — cannot be reversed.
| Argument | Type | Description |
|---|---|---|
| comparison_id* | string | Comparison ID |
| winner_video_id* | string | ID of the winning video |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"comparison_id",
"winner_video_id"
],
"properties": {
"comparison_id": {
"type": "string",
"description": "Comparison ID"
},
"winner_video_id": {
"type": "string",
"description": "ID of the winning video"
}
},
"additionalProperties": false
}End a live broadcast
| Argument | Type | Description |
|---|---|---|
| live_id* | string | Live ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_id"
],
"properties": {
"live_id": {
"type": "string",
"description": "Live ID"
}
},
"additionalProperties": false
}Generate subtitles for a video using Panda AI. Creates a transcription in the specified language. Costs credits based on video duration and tier.
| Argument | Type | Description |
|---|---|---|
| tier | string | 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) |
| video_id* | string | Video ID |
| from_lang* | string | Source language code (e.g. 'pt-BR', 'en', 'es') |
| additional_langs | array | Additional languages to translate into (e.g. ['en', 'es']) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"from_lang"
],
"properties": {
"tier": {
"enum": [
"essential",
"advanced",
"pro"
],
"type": "string",
"default": "essential",
"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)"
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"from_lang": {
"type": "string",
"description": "Source language code (e.g. 'pt-BR', 'en', 'es')"
},
"additional_langs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Additional languages to translate into (e.g. ['en', 'es'])"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| file_name* | string | File name (e.g. 'guide.pdf') |
| file_size* | number | File size in bytes |
| file_type* | string | MIME type (e.g. 'application/pdf') |
| assistant_id* | string | Tutor assistant ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assistant_id",
"file_name",
"file_type",
"file_size"
],
"properties": {
"file_name": {
"type": "string",
"description": "File name (e.g. 'guide.pdf')"
},
"file_size": {
"type": "number",
"description": "File size in bytes"
},
"file_type": {
"type": "string",
"description": "MIME type (e.g. 'application/pdf')"
},
"assistant_id": {
"type": "string",
"description": "Tutor assistant ID"
}
},
"additionalProperties": false
}Get general analytics metrics for the whole account. Returns {views, unique_viewers, watch_time_seconds, avg_watch_percentage, plays}.
| Argument | Type | Description |
|---|---|---|
| end_date | any | End date (YYYY-MM-DD) |
| start_date | string | Start date (YYYY-MM-DD) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD)"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}Get an AI assistant's details. Returns {id, name, status, videos: [{id, title}], files: [{id, file_name}], answers_count}.
| Argument | Type | Description |
|---|---|---|
| assistant_id* | string | AI assistant ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assistant_id"
],
"properties": {
"assistant_id": {
"type": "string",
"description": "AI assistant ID"
}
},
"additionalProperties": false
}Get credit cost overview before creating an AI assistant. Returns {credit_cost, current_balance, sufficient_credits}.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Get AI workflow status for a video (transcription, dubbing, translation progress)
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Get auto-recharge configuration for credits. Returns {enabled, trigger_value, action_value}.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get bandwidth/traffic usage by folder, by video, or DRM by video. Returns array of {name, bandwidth_bytes, video_id?} entries.
| Argument | Type | Description |
|---|---|---|
| type | string | Traffic type — 'all' (regular, required by the API) or 'drm' |
| end_date | any | End date (YYYY-MM-DD) |
| video_id | string | Video ID (omit for folder-level) |
| start_date | string | Start date (YYYY-MM-DD) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"type": {
"enum": [
"all",
"drm"
],
"type": "string",
"default": "all",
"description": "Traffic type — 'all' (regular, required by the API) or 'drm'"
},
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD)"
},
"video_id": {
"type": "string",
"description": "Video ID (omit for folder-level)"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| metric | string | 'plays' = unique plays (dashboard default) or 'impressions' = unique player views |
| end_date | any | End date (YYYY-MM-DD). Default: today. |
| start_date | string | Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"metric": {
"enum": [
"plays",
"impressions"
],
"type": "string",
"default": "plays",
"description": "'plays' = unique plays (dashboard default) or 'impressions' = unique player views"
},
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD). Default: today."
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."
}
},
"additionalProperties": false
}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}.
| Argument | Type | Description |
|---|---|---|
| metric | string | 'plays' = unique plays (dashboard default) or 'impressions' = unique player views |
| end_date | any | End date (YYYY-MM-DD). Default: today. |
| folder_id | string | Folder ID: uses every video in the folder (up to 5000). Use this OR video_external_ids. |
| start_date | string | Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it. |
| video_external_ids | array | 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. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"metric": {
"enum": [
"plays",
"impressions"
],
"type": "string",
"default": "plays",
"description": "'plays' = unique plays (dashboard default) or 'impressions' = unique player views"
},
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD). Default: today."
},
"folder_id": {
"type": "string",
"description": "Folder ID: uses every video in the folder (up to 5000). Use this OR video_external_ids."
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."
},
"video_external_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 2000,
"minItems": 1,
"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."
}
},
"additionalProperties": false
}Returns the platform business rules: the real consequences of actions that modify, delete or move resources (e.g., removing a video from a funnel deletes it permanently, it does not just unlink it). Useful before planning such actions, so the advice given to the user matches how the platform actually behaves. Domains: funnels, videos_and_folders, playlists, drm_watermark, comparisons_ab_tests, lives, shorts, player_profiles, anti_download_and_domains, credits, thumbnails_and_subtitles.
| Argument | Type | Description |
|---|---|---|
| domain | string | Filter by domain (e.g. 'funnels', 'playlists', 'drm_watermark'). Omit to get ALL rules. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"domain": {
"type": "string",
"description": "Filter by domain (e.g. 'funnels', 'playlists', 'drm_watermark'). Omit to get ALL rules."
}
},
"additionalProperties": false
}Get the current credits balance for the account. 1 credit = R$1.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get credits transaction history for a date range. Returns {balance, history: [{id, type, amount, status, description, created_at}]}.
| Argument | Type | Description |
|---|---|---|
| end_date | any | End date (YYYY-MM-DD) |
| start_date | string | Start date (YYYY-MM-DD) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD)"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}Get all custom fields for a video. Returns array of {id, key, value} metadata pairs.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Get a folder's details and contents. Returns {id, name, parent_folder_id, status, videos: [{id, title, status}], folders: [{id, name}]}.
| Argument | Type | Description |
|---|---|---|
| folder_id* | string | Folder ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_id"
],
"properties": {
"folder_id": {
"type": "string",
"description": "Folder ID"
}
},
"additionalProperties": false
}Get a funnel's details and its videos. Returns {data: {id, name, videos: [{id, title, status, is_first}]}}. Funnels are NOT folders.
| Argument | Type | Description |
|---|---|---|
| funnel_id* | string | Funnel ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"funnel_id"
],
"properties": {
"funnel_id": {
"type": "string",
"description": "Funnel ID"
}
},
"additionalProperties": false
}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).
| Argument | Type | Description |
|---|---|---|
| live_id* | string | Live ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_id"
],
"properties": {
"live_id": {
"type": "string",
"description": "Live ID"
}
},
"additionalProperties": false
}Get viewer history for a live stream. Returns time-series array of viewer counts.
| Argument | Type | Description |
|---|---|---|
| live_id* | string | Live ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_id"
],
"properties": {
"live_id": {
"type": "string",
"description": "Live ID"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get global player configuration (applies to all videos without a custom profile)
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get details of a specific playlist. Returns {id, name, description, videos_quantity, access_type, creator_name, duration, updated_at}.
| Argument | Type | Description |
|---|---|---|
| playlist_id* | string | Playlist ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"playlist_id"
],
"properties": {
"playlist_id": {
"type": "string",
"description": "Playlist ID"
}
},
"additionalProperties": false
}List all videos in a playlist. Returns array of {id, video_id, order, video: {id, title, duration}}.
| Argument | Type | Description |
|---|---|---|
| playlist_id* | string | Playlist ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"playlist_id"
],
"properties": {
"playlist_id": {
"type": "string",
"description": "Playlist ID"
}
},
"additionalProperties": false
}Get details of a specific player profile including all settings (controls, colors, vsl, saveProgress)
| Argument | Type | Description |
|---|---|---|
| profile_id* | string | Profile ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"profile_id"
],
"properties": {
"profile_id": {
"type": "string",
"description": "Profile ID"
}
},
"additionalProperties": false
}Get ranking analytics for the account. Returns {most_watched: [{video_id, title, watch_time}], most_played: [{video_id, title, plays}]}.
| Argument | Type | Description |
|---|---|---|
| end_date | any | End date (YYYY-MM-DD) |
| start_date | string | Start date (YYYY-MM-DD) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD)"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get referral program summary (balance, estimated value)
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get audience retention analytics (account-wide or per video). Returns array of {percentage, viewers} showing drop-off at each point.
| Argument | Type | Description |
|---|---|---|
| end_date | any | End date (YYYY-MM-DD) |
| video_id | string | Video ID — the `id` field from panda_list_videos, NOT video_external_id (omit for account-wide) |
| start_date | string | Start date (YYYY-MM-DD) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD)"
},
"video_id": {
"type": "string",
"description": "Video ID — the `id` field from panda_list_videos, NOT video_external_id (omit for account-wide)"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get a subtitle file for a specific language
| Argument | Type | Description |
|---|---|---|
| srclang* | string | Language code (e.g. pt-BR, en, es) |
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"srclang"
],
"properties": {
"srclang": {
"type": "string",
"description": "Language code (e.g. pt-BR, en, es)"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Get all subtitle information for a video
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}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').
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Videos per page (default 50, max 500) |
| offset | integer | Pagination offset (default 0) |
| end_date | any | End date (YYYY-MM-DD). Default: today. |
| start_date | string | Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Videos per page (default 50, max 500)"
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Pagination offset (default 0)"
},
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD). Default: today."
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Get analytics metrics for a specific video. Returns {views, unique_viewers, watch_time_seconds, avg_watch_percentage, plays}.
| Argument | Type | Description |
|---|---|---|
| end_date | any | End date (YYYY-MM-DD) |
| video_id* | string | Video ID — the `id` field from panda_list_videos, NOT video_external_id |
| start_date | string | Start date (YYYY-MM-DD) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD)"
},
"video_id": {
"type": "string",
"description": "Video ID — the `id` field from panda_list_videos, NOT video_external_id"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}Get per-video player configuration (chapters, CTAs, pixels, redirect, AI features, retention markers, subtitle default, offline config)
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Get total video count by status (CONVERTED, CONVERTING, DRAFT, etc.)
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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}.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many viewers to list (default 50, max 500); total_viewers counts all |
| end_date | any | End date (YYYY-MM-DD). Default: today. |
| folder_id | string | Folder ID: uses every video in the folder (up to 5000). Use this OR video_external_ids. |
| start_date | string | Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it. |
| video_external_ids | array | 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. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "How many viewers to list (default 50, max 500); total_viewers counts all"
},
"end_date": {
"$ref": "#/properties/start_date",
"description": "End date (YYYY-MM-DD). Default: today."
},
"folder_id": {
"type": "string",
"description": "Folder ID: uses every video in the folder (up to 5000). Use this OR video_external_ids."
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date (YYYY-MM-DD). Default: 30 days ago — always sent, since the API returns partial data without it."
},
"video_external_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 2000,
"minItems": 1,
"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."
}
},
"additionalProperties": false
}Get a watermark group's details. Returns {id, name, video_ids: [], folder_ids: [], created_at}.
| Argument | Type | Description |
|---|---|---|
| drm_group_id* | string | Watermark group ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"drm_group_id"
],
"properties": {
"drm_group_id": {
"type": "string",
"description": "Watermark group ID"
}
},
"additionalProperties": false
}Check whether watermark/DRM is currently active on the account. Returns {active: boolean}.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get the full content of a specific Panda Video help center article by slug. Use this after searching to read the complete content of an article. The response is the full official documentation.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Article slug (e.g. 'como-publicar-seu-video-na-panda-video') |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "Article slug (e.g. 'como-publicar-seu-video-na-panda-video')"
}
},
"additionalProperties": false
}Search Panda Video help center articles to answer user questions. Searches through ALL 136 pre-indexed articles from the official help center (https://help.pandavideo.com/pt-br/). Use this tool whenever the user has a QUESTION about how Panda Video works, pricing, features, integrations, configuration, etc. DO NOT use this for API execution commands — only for knowledge/support questions. IMPORTANT: Base your answer EXCLUSIVELY on the article content returned. Do NOT infer, assume, or use external knowledge.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max articles to return (default 5, max 20) |
| query* | string | The user's question or search keywords about Panda Video |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"default": 5,
"maximum": 20,
"minimum": 1,
"description": "Max articles to return (default 5, max 20)"
},
"query": {
"type": "string",
"description": "The user's question or search keywords about Panda Video"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| contexts | array | AI context hints: 'engajamento','educacional','humor','motivacional','personalizado' |
| end_time | number | End time in seconds to clip to (default: full video) |
| video_id | string | Video ID from Panda library (required when source_type=library) |
| source_url | string | YouTube URL (required when source_type=youtube) |
| start_time | number | Start time in seconds to clip from (default: 0) |
| source_type* | string | Source: 'library' for Panda video, 'youtube' for YouTube URL |
| video_title | string | Title for the project (defaults to 'Shorts Project') |
| aspect_ratio | string | Output format (default: vertical) |
| duration_preset | string |
List all AI video assistants. Returns array of {id, name, status, videos: [{id, title}], created_at}.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (default: 1) |
| limit | integer | Results per page (default: 25, max: 100) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number (default: 1)"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page (default: 25, max: 100)"
}
},
"additionalProperties": false
}List all A/B test comparisons. Status: DRAFT → IN_PROGRESS → COMPLETED. Returns array of {id, name, description, status, videos: [], winner_video_id, created_at}.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| folder_id* | string | Folder UUID whose referrers to list |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_id"
],
"properties": {
"folder_id": {
"type": "string",
"description": "Folder UUID whose referrers to list"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| folder_id* | string | Folder UUID to resolve effective referrers for |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_id"
],
"properties": {
"folder_id": {
"type": "string",
"description": "Folder UUID to resolve effective referrers for"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}List all folders. Returns array of {id, name, parent_folder_id, status, created_at, videos_count}.
| Argument | Type | Description |
|---|---|---|
| all_status | number | 1 to include deleted folders, 0 for active only |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"all_status": {
"type": "number",
"description": "1 to include deleted folders, 0 for active only"
}
},
"additionalProperties": false
}List all funnels. Returns {data: [{id, name, videos_count, created_at}]}. A funnel with videos_count=0 has no videos. Funnels are NOT folders.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}List all invoices. Returns array of {id, status, amount_due, amount_paid, created, due_date, invoice_pdf, hosted_invoice_url}.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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).
| Argument | Type | Description |
|---|---|---|
| page | number | Page number (default 1, 100 per page) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"page": {
"type": "number",
"description": "Page number (default 1, 100 per page)"
}
},
"additionalProperties": false
}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}].
| Argument | Type | Description |
|---|---|---|
| status | string | Filter by status ('sent' = unread). Omit for all. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"status": {
"enum": [
"sent",
"read",
"completed"
],
"type": "string",
"description": "Filter by status ('sent' = unread). Omit for all."
}
},
"additionalProperties": false
}List available subscription plans and pricing
| Argument | Type | Description |
|---|---|---|
| currency | string | Currency |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"currency": {
"enum": [
"BRL",
"USD"
],
"type": "string",
"default": "BRL",
"description": "Currency"
}
},
"additionalProperties": false
}List all playlists. Returns array of {id, name, videos_quantity, duration, access_type, updated_at}.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}List all player profiles (GET /profile). 'Profiles' are player UI configs, not user accounts. Returns {data: [{id, name, pullzone_name}]} — a profile's `name` is the ID of the video it was created for. Use panda_get_profile for a profile's full settings. No pagination.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}List all generated segments (clips) for a Shorts job. Each segment has viralScore, duration, transcription.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | Shorts job ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"description": "Shorts job ID"
}
},
"additionalProperties": false
}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}.
| Argument | Type | Description |
|---|---|---|
| page | number | Page number (default 1) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"page": {
"type": "number",
"description": "Page number (default 1)"
}
},
"additionalProperties": false
}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).
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}List all subaccounts and their usage limits. Returns array of {organization_id, name, status, credits_balance, storage_used, limits}.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}List all users in the organization. Returns array of {id, name, email, role_id, role_name, created_at}.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (default: 1) |
| limit | integer | Results per page (default: 25, max: 100) |
| title | string | Search by video title (partial match, case-insensitive) |
| status | string | Filter by status (e.g. 'CONVERTED') |
| folder_id | string | Filter by folder ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number (default: 1)"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page (default: 25, max: 100)"
},
"title": {
"type": "string",
"description": "Search by video title (partial match, case-insensitive)"
},
"status": {
"type": "string",
"description": "Filter by status (e.g. 'CONVERTED')"
},
"folder_id": {
"type": "string",
"description": "Filter by folder ID"
}
},
"additionalProperties": false
}List all watermark groups. Returns array of {id, name, active, video_ids: [], folder_ids: [], created_at}.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (default: 1) |
| limit | integer | Results per page (default: 25, max: 100) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number (default: 1)"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page (default: 25, max: 100)"
}
},
"additionalProperties": false
}Add or remove videos and/or folders from a DRM watermark group. Returns the updated group with current video_ids and folder_ids.
| Argument | Type | Description |
|---|---|---|
| action* | string | Whether to add or remove items |
| video_ids | array | Video IDs |
| folder_ids | array | Folder IDs |
| drm_group_id* | string | Watermark group ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"drm_group_id",
"action"
],
"properties": {
"action": {
"enum": [
"add",
"remove"
],
"type": "string",
"description": "Whether to add or remove items"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Video IDs"
},
"folder_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Folder IDs"
},
"drm_group_id": {
"type": "string",
"description": "Watermark group ID"
}
},
"additionalProperties": false
}Move one or more videos to a folder
| Argument | Type | Description |
|---|---|---|
| folder_id* | string | Target folder ID, or "root" to move to the root (no folder) |
| video_ids* | array | List of video IDs to move (max 50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_ids",
"folder_id"
],
"properties": {
"folder_id": {
"type": "string",
"description": "Target folder ID, or \"root\" to move to the root (no folder)"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "List of video IDs to move (max 50)"
}
},
"additionalProperties": false
}Re-encode a video with a specific compression mode
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID |
| compression_mode* | string | Compression mode |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"compression_mode"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
},
"compression_mode": {
"enum": [
"lossless",
"balanced",
"aggressive"
],
"type": "string",
"description": "Compression mode"
}
},
"additionalProperties": false
}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).
| Argument | Type | Description |
|---|---|---|
| live_id* | string | Live ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_id"
],
"properties": {
"live_id": {
"type": "string",
"description": "Live ID"
}
},
"additionalProperties": false
}Remove a video from a playlist. Does NOT delete the video.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | Video ID to remove |
| playlist_id* | string | Playlist ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"playlist_id",
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "Video ID to remove"
},
"playlist_id": {
"type": "string",
"description": "Playlist ID"
}
},
"additionalProperties": false
}Remove one or more videos from a funnel
| Argument | Type | Description |
|---|---|---|
| id* | string | Funnel ID |
| video_ids* | array | Video IDs to remove (max 50) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"video_ids"
],
"properties": {
"id": {
"type": "string",
"description": "Funnel ID"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Video IDs to remove (max 50)"
}
},
"additionalProperties": false
}Request an async download for a video. Only works for CONVERTED, non-external, non-Hotmart videos. Returns {status, message}.
| Argument | Type | Description |
|---|---|---|
| format* | string | Download format |
| quality* | string | Quality (e.g. '1080', '720', '480') |
| language* | string | Language code (e.g. 'original', 'en', 'pt-BR') |
| video_title* | string | Video title (for the download file name) |
| video_external_id* | string | Video external ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_external_id",
"quality",
"format",
"language",
"video_title"
],
"properties": {
"format": {
"enum": [
"video",
"audio"
],
"type": "string",
"description": "Download format"
},
"quality": {
"type": "string",
"description": "Quality (e.g. '1080', '720', '480')"
},
"language": {
"type": "string",
"description": "Language code (e.g. 'original', 'en', 'pt-BR')"
},
"video_title": {
"type": "string",
"description": "Video title (for the download file name)"
},
"video_external_id": {
"type": "string",
"description": "Video external ID"
}
},
"additionalProperties": false
}Save a Short segment to the video library as an independent video
| Argument | Type | Description |
|---|---|---|
| title | string | Title for the saved video |
| folder_id | string | Folder ID to save into |
| segment_id* | string | Segment ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"segment_id"
],
"properties": {
"title": {
"type": "string",
"description": "Title for the saved video"
},
"folder_id": {
"type": "string",
"description": "Folder ID to save into"
},
"segment_id": {
"type": "string",
"description": "Segment ID"
}
},
"additionalProperties": false
}Set the global 'block_none_refer' policy for the library. When true, playback requests that carry NO referer are blocked; when false, they are allowed. This is the master switch that activates/deactivates domain protection for requests without a referer. On error the API returns { errCode, errMsg }. library_id is resolved automatically when omitted.
| Argument | Type | Description |
|---|---|---|
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
| block_none_refer* | boolean | true = block playback requests with no referer; false = allow them |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"block_none_refer"
],
"properties": {
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
},
"block_none_refer": {
"type": "boolean",
"description": "true = block playback requests with no referer; false = allow them"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| active* | boolean | true to activate, false to deactivate |
| refer_id* | string | Referrer UUID to toggle |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"refer_id",
"active"
],
"properties": {
"active": {
"type": "boolean",
"description": "true to activate, false to deactivate"
},
"refer_id": {
"type": "string",
"description": "Referrer UUID to toggle"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}Configure offline playback for a video (mobile app feature)
| Argument | Type | Description |
|---|---|---|
| enabled* | boolean | Enable or disable offline playback |
| video_id* | string | Video ID |
| expire_days | number | null | Days until offline access expires (null = never) |
| external_link_url | string | External link URL |
| external_link_text | string | External link button text |
| external_link_enabled | boolean | Show external link button |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"enabled"
],
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable or disable offline playback"
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"expire_days": {
"type": [
"number",
"null"
],
"description": "Days until offline access expires (null = never)"
},
"external_link_url": {
"type": "string",
"description": "External link URL"
},
"external_link_text": {
"type": "string",
"description": "External link button text"
},
"external_link_enabled": {
"type": "boolean",
"description": "Show external link button"
}
},
"additionalProperties": false
}Start an A/B test (begin collecting data). Only from DRAFT status. Returns the updated comparison with status IN_PROGRESS.
| Argument | Type | Description |
|---|---|---|
| comparison_id* | string | Comparison ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"comparison_id"
],
"properties": {
"comparison_id": {
"type": "string",
"description": "Comparison ID"
}
},
"additionalProperties": false
}Transfer credits to a subaccount
| Argument | Type | Description |
|---|---|---|
| amount* | number | Number of credits to transfer |
| target_organization_id* | string | Target subaccount organization ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"target_organization_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "Number of credits to transfer"
},
"target_organization_id": {
"type": "string",
"description": "Target subaccount organization ID"
}
},
"additionalProperties": false
}Update AI assistant information (name, status, etc.)
| Argument | Type | Description |
|---|---|---|
| name | string | New name |
| status | string | New status (e.g. 'ready', 'disabled') |
| assistant_id* | string | AI assistant ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assistant_id"
],
"properties": {
"name": {
"type": "string",
"description": "New name"
},
"status": {
"type": "string",
"description": "New status (e.g. 'ready', 'disabled')"
},
"assistant_id": {
"type": "string",
"description": "AI assistant ID"
}
},
"additionalProperties": false
}Show or hide the AI chat widget on the video player
| Argument | Type | Description |
|---|---|---|
| visible* | boolean | True to show, false to hide |
| assistant_id* | string | AI assistant ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assistant_id",
"visible"
],
"properties": {
"visible": {
"type": "boolean",
"description": "True to show, false to hide"
},
"assistant_id": {
"type": "string",
"description": "AI assistant ID"
}
},
"additionalProperties": false
}Replace the videos bound to an AI assistant. Sends the FULL list of video_ids — existing bindings not in the list will be removed.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language code |
| video_ids* | array | New list of video IDs to bind (max 50) |
| assistant_id* | string | AI assistant ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assistant_id",
"video_ids"
],
"properties": {
"lang": {
"type": "string",
"description": "Language code"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "New list of video IDs to bind (max 50)"
},
"assistant_id": {
"type": "string",
"description": "AI assistant ID"
}
},
"additionalProperties": false
}Update auto-recharge settings
| Argument | Type | Description |
|---|---|---|
| action_value* | number | New recharge amount |
| trigger_value* | number | New trigger threshold |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"trigger_value",
"action_value"
],
"properties": {
"action_value": {
"type": "number",
"minimum": 5,
"description": "New recharge amount"
},
"trigger_value": {
"type": "number",
"minimum": 100,
"description": "New trigger threshold"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| url | string | URL opened when the button is clicked. Required unless custom_html is set. |
| size | string | Button size (default: small) |
| text | string | Button label text. Required unless custom_html is set. |
| cta_id* | string | ID of the CTA to update |
| end_time | number | Seconds into the video when the button disappears. Omit to show until the end of the video. |
| position | string | Button position on the video overlay. Only applies to placement='inside'. |
| video_id* | string | Video ID |
| placement* | string | CTA placement |
| start_time | number |
Update folder properties (name, parent). Also used to recover deleted folders with status=true.
| Argument | Type | Description |
|---|---|---|
| name | string | New folder name |
| status | boolean | Set true to recover a deleted folder |
| folder_id* | string | Folder ID |
| parent_folder_id | string | New parent folder ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_id"
],
"properties": {
"name": {
"type": "string",
"description": "New folder name"
},
"status": {
"type": "boolean",
"description": "Set true to recover a deleted folder"
},
"folder_id": {
"type": "string",
"description": "Folder ID"
},
"parent_folder_id": {
"type": "string",
"description": "New parent folder ID"
}
},
"additionalProperties": false
}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. 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.
| Argument | Type | Description |
|---|---|---|
| type* | string | ALLOW = whitelist (only listed domains play); BLOCK = blacklist (listed domains are denied) |
| scope* | string | Target scope: 'library' (whole library) or 'folder' (specific folder_ids) |
| hostname* | string | Domain hostname without protocol, e.g. 'example.com' or wildcard '*.cliente.com' |
| refer_ids* | array | Referrer UUIDs to edit (all must be the same hostname) (max 50) |
| folder_ids | array | Target folder UUIDs — required when scope='folder' (max 50) |
| library_id | string | Library UUID. Resolved from GET /library when omitted. |
Update a funnel's properties (rename)
| Argument | Type | Description |
|---|---|---|
| id* | string | Funnel ID (required in body too) |
| name | string | New name |
| funnel_id* | string | Funnel ID |
| description | string | New description |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"funnel_id",
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Funnel ID (required in body too)"
},
"name": {
"type": "string",
"description": "New name"
},
"funnel_id": {
"type": "string",
"description": "Funnel ID"
},
"description": {
"type": "string",
"description": "New description"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| status | string | 'read' (default) or 'completed' (final; only if the user asks) |
| notice_id* | string | Notice ID (from panda_list_notices) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notice_id"
],
"properties": {
"status": {
"enum": [
"read",
"completed"
],
"type": "string",
"default": "read",
"description": "'read' (default) or 'completed' (final; only if the user asks)"
},
"notice_id": {
"type": "string",
"description": "Notice ID (from panda_list_notices)"
}
},
"additionalProperties": false
}Update global player configuration (applies to all videos without a custom profile). Returns the updated config object.
| Argument | Type | Description |
|---|---|---|
| config* | object | Global player config object (controls, colors, vsl, saveProgress, general) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"config"
],
"properties": {
"config": {
"type": "object",
"description": "Global player config object (controls, colors, vsl, saveProgress, general)",
"additionalProperties": {}
}
},
"additionalProperties": false
}Update a playlist's properties
| Argument | Type | Description |
|---|---|---|
| name | string | New name |
| image_id | string | Logo image ID |
| password | string | Password |
| access_type | string | Access type |
| description | string | New description |
| playlist_id* | string | Playlist ID |
| creator_name | string | Creator name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"playlist_id"
],
"properties": {
"name": {
"type": "string",
"description": "New name"
},
"image_id": {
"type": "string",
"description": "Logo image ID"
},
"password": {
"type": "string",
"description": "Password"
},
"access_type": {
"enum": [
"anyone_with_link",
"anyone_with_password"
],
"type": "string",
"description": "Access type"
},
"description": {
"type": "string",
"description": "New description"
},
"playlist_id": {
"type": "string",
"description": "Playlist ID"
},
"creator_name": {
"type": "string",
"description": "Creator name"
}
},
"additionalProperties": false
}Update a player profile's settings. 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, big play button (use panda_update_video_config — that lives elsewhere), and SUBTITLE APPEARANCE: caption text/background colors (captions.foreground / captions.background — 8-char hex with alpha) and caption font size (general.fontSize as keyword 'extraSmall'|'small'|'normal'|'large'|'extraLarge', plus general.fontSizePx as the matching pixel number). When the user names a UI label like "extra pequeno" / "extra small", map it to the corresponding fontSize keyword and send both fontSize + fontSizePx. 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). Each nested object REPLACES the existing one — send the COMPLETE object you want to keep.
| Argument | Type | Description |
|---|---|---|
| vsl | object | VSL (Video Sales Letter) settings — controls autoplay, smart autoplay, fake progress bar, muted indicator |
| name | string | Rename the profile (usually a video ID; 3–100 chars) |
| colors | object | Player color settings |
| general | object | General player + subtitle settings (speed, font size, search-in-video, defaults). |
| captions | object | Per-video subtitle (caption) appearance — text and background colors (v2 dashboard). |
Update a subaccount's settings (name, limits, status)
| Argument | Type | Description |
|---|---|---|
| subaccount* | object | Subaccount update payload |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"subaccount"
],
"properties": {
"subaccount": {
"type": "object",
"description": "Subaccount update payload",
"additionalProperties": {}
}
},
"additionalProperties": false
}Show or hide a subtitle language (hidden subtitles are not visible but still indexable for search)
| Argument | Type | Description |
|---|---|---|
| hidden* | boolean | true = hide subtitle, false = show |
| srclang* | string | Language code (e.g. 'pt-BR', 'en') |
| video_id* | string | Video ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"srclang",
"hidden"
],
"properties": {
"hidden": {
"type": "boolean",
"description": "true = hide subtitle, false = show"
},
"srclang": {
"type": "string",
"description": "Language code (e.g. 'pt-BR', 'en')"
},
"video_id": {
"type": "string",
"description": "Video ID"
}
},
"additionalProperties": false
}Update a user's information or role
| Argument | Type | Description |
|---|---|---|
| name | string | New name |
| role_id | string | New role ID |
| user_id* | string | User ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"user_id"
],
"properties": {
"name": {
"type": "string",
"description": "New name"
},
"role_id": {
"type": "string",
"description": "New role ID"
},
"user_id": {
"type": "string",
"description": "User ID"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| title | string | New video title |
| video_id* | string | Video ID |
| folder_id | string | Folder ID to move the video into |
| description | string | New video description |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"title": {
"type": "string",
"description": "New video title"
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"folder_id": {
"type": "string",
"description": "Folder ID to move the video into"
},
"description": {
"type": "string",
"description": "New video description"
}
},
"additionalProperties": false
}Update per-video config (POST /player?type=video). Send only fields you want to change. Fields: chapters, default_subtitle, redirect_video_id, custom_pixels, on_funnel, panda_branding, questions (AI quiz), mindmap (AI), abstract (AI ebook), retention_markers, ai. NOT for: controls, autoplay, Smart Autoplay, colors, speed, big play button, save progress — use panda_update_profile for those.
| Argument | Type | Description |
|---|---|---|
| ai | object | AI configuration object (search, tutor settings) |
| mindmap | boolean | Enable/disable AI MindMap feature |
| abstract | boolean | Enable/disable AI eBook/Abstract feature |
| chapters | array | Chapters/bookmarks. Send [] to remove all. |
| video_id* | string | Video ID |
| on_funnel | boolean | Enable/disable funnel integration |
| questions | boolean | Enable/disable AI Quiz feature |
| custom_pixels | array | Array of custom pixel objects (fbPixel, gtagIds, custom script) |
Update a watermark group
| Argument | Type | Description |
|---|---|---|
| name | string | New group name |
| video_ids | array | Updated video list (max 50) |
| drm_group_id* | string | Watermark group ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"drm_group_id"
],
"properties": {
"name": {
"type": "string",
"description": "New group name"
},
"video_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Updated video list (max 50)"
},
"drm_group_id": {
"type": "string",
"description": "Watermark group ID"
}
},
"additionalProperties": false
}Import a video from an external URL (YouTube, Vimeo, S3, generic HTTPS)
| Argument | Type | Description |
|---|---|---|
| url* | string | URL of the video to import |
| title | string | Title for the imported video |
| source | string | Source type (e.g. 'youtube', 'vimeo', 's3', or domain) |
| folder_id | string | Folder to place the video in |
| access_key | string | S3 access key (for S3 imports only) |
| secret_key | string | S3 secret key (for S3 imports only) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "URL of the video to import"
},
"title": {
"type": "string",
"description": "Title for the imported video"
},
"source": {
"type": "string",
"description": "Source type (e.g. 'youtube', 'vimeo', 's3', or domain)"
},
"folder_id": {
"type": "string",
"description": "Folder to place the video in"
},
"access_key": {
"type": "string",
"description": "S3 access key (for S3 imports only)"
},
"secret_key": {
"type": "string",
"description": "S3 secret key (for S3 imports only)"
}
},
"additionalProperties": false
}| Default subtitle language code (e.g. 'pt-BR') or 'false' to disable |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = preview only; false = apply"
},
"mindmap": {
"type": "boolean",
"description": "Enable/disable AI MindMap"
},
"abstract": {
"type": "boolean",
"description": "Enable/disable AI eBook/Abstract"
},
"on_funnel": {
"type": "boolean",
"description": "Enable/disable funnel integration"
},
"questions": {
"type": "boolean",
"description": "Enable/disable AI Quiz"
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"panda_branding": {
"type": "boolean",
"description": "Show/hide Panda logo branding"
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
},
"default_subtitle": {
"type": "string",
"description": "Default subtitle language code (e.g. 'pt-BR') or 'false' to disable"
}
},
"additionalProperties": false
}| folder_ref* | string | Folder name, ID, or dashboard URL |
| saveProgress | object | Save progress / resume settings |
| idempotency_key | string | Reserved client-supplied retry key |
| hideControlsOnStart | boolean | Hide controls until user interacts |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"folder_ref"
],
"properties": {
"vsl": {
"type": "object",
"properties": {
"refCode": {
"type": "string",
"description": "Affiliate referral code"
},
"autoplay": {
"type": "boolean",
"description": "Auto-play video"
},
"disablePause": {
"type": "boolean",
"description": "Disable pause button (VSL mode)"
},
"pandaBranding": {
"type": "boolean",
"description": "Show Panda branding in player"
},
"smartAutoplay": {
"type": "boolean",
"description": "Smart Autoplay — auto-plays muted, unmutes on interaction"
},
"disableForward": {
"type": "boolean",
"description": "Disable forward/seek (VSL mode)"
},
"defaultLanguage": {
"type": "string",
"description": "Default subtitle language"
},
"restartAfterEnd": {
"type": "boolean",
"description": "Restart video after it ends"
},
"timeDisplayType": {
"enum": [
"CURRENT_TIME",
"REMAINING_TIME"
],
"type": "string",
"description": "Time display format"
},
"mutedIndicatorIcon": {
"type": "boolean",
"description": "Show muted indicator overlay"
},
"mutedIndicatorSize": {
"enum": [
"none",
"small",
"medium",
"large"
],
"type": "string",
"description": "Muted indicator size"
},
"alternativeProgress": {
"type": "boolean",
"description": "Fake progress bar (VSL mode)"
},
"mutedIndicatorTextTop": {
"type": "string",
"description": "Muted indicator top text (max 40 chars)"
},
"mutedIndicatorFontSize": {
"type": "number",
"description": "Muted indicator font size (12-32)"
},
"mutedIndicatorAnimation": {
"type": "string",
"description": "Muted indicator animation style"
},
"mutedIndicatorTextColor": {
"type": "string",
"description": "Muted indicator text color"
},
"mutedIndicatorTextBottom": {
"type": "string",
"description": "Muted indicator bottom text (max 40 chars)"
},
"alternativeProgressHeight": {
"type": "number",
"description": "Fake progress bar height in px"
},
"alternativeProgress2xLimit": {
"type": "number",
"description": "Percentage at which fake progress accelerates"
},
"alternativeProgressVelocity": {
"type": "number",
"description": "Fake progress bar speed (1-10)"
},
"mutedIndicatorBackgroundColor": {
"type": "string",
"description": "Muted indicator background color"
},
"alternativeProgressDefaultVelocity": {
"type": "boolean",
"description": "Use recommended fake progress speed"
}
},
"description": "VSL (Video Sales Letter) settings — controls autoplay, smart autoplay, fake progress bar, muted indicator",
"additionalProperties": false
},
"colors": {
"type": "object",
"properties": {
"background": {
"type": "string",
"description": "Player background color (hex)"
},
"primaryColor": {
"type": "string",
"description": "Primary accent color (hex)"
},
"captionsColor": {
"type": "string",
"description": "(Legacy) Subtitle text color (hex). Prefer `captions.foreground` on the modern subtitle editor."
},
"controlsColor": {
"type": "string",
"description": "Controls color (hex)"
},
"captionsBackgroundColor": {
"type": "string",
"description": "(Legacy) Subtitle background color (hex). Prefer `captions.background`."
}
},
"description": "Player color settings",
"additionalProperties": false
},
"dry_run": {
"type": "boolean",
"default": true,
"description": "true = validate + preview only; false = apply"
},
"general": {
"type": "object",
"properties": {
"fontSize": {
"enum": [
"extraSmall",
"small",
"normal",
"large",
"extraLarge"
],
"type": "string",
"description": "Subtitle font size keyword: extraSmall=10px, small=12px, normal=14px(default), large=16px, extraLarge=18px. Send fontSizePx alongside."
},
"fontSizePx": {
"type": "number",
"description": "Subtitle font size in px — must match fontSize: 10/12/14/16/18."
},
"smartSearch": {
"type": "boolean",
"description": "(Legacy) Enable smart search in video. v2 sends `searchInsideVideo` — both accepted."
},
"default_speed": {
"type": "number",
"description": "Default playback speed (1, 1.1, 1.2, 1.3, 1.4, 1.5)"
},
"searchInsideVideo": {
"type": "boolean",
"description": "Enable smart search inside the video (same semantic as legacy smartSearch)."
},
"startsWithSubtitle": {
"type": "boolean",
"description": "Whether the video starts with the subtitle track visible by default."
}
},
"description": "General player + subtitle settings (speed, font size, search-in-video, defaults).",
"additionalProperties": false
},
"captions": {
"type": "object",
"properties": {
"background": {
"type": "string",
"description": "Subtitle background color as 8-char hex with alpha — `RRGGBBAA`, e.g. '000000B3' = 70% opaque black."
},
"foreground": {
"type": "string",
"description": "Subtitle text color as 8-char hex with alpha — `RRGGBBAA`, e.g. 'FFFFFFFF' = opaque white."
}
},
"description": "Per-video subtitle (caption) appearance — text and background colors (v2 dashboard).",
"additionalProperties": false
},
"controls": {
"type": "array",
"items": {
"type": "string"
},
"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\", \"pip\", \"fullscreen\", \"airplay\", \"cast\""
},
"folder_ref": {
"type": "string",
"description": "Folder name, ID, or dashboard URL"
},
"saveProgress": {
"type": "object",
"properties": {
"initQuality": {
"type": "number",
"description": "Initial video quality (e.g. 720)"
},
"saveProgress": {
"type": "boolean",
"description": "Enable resume from last position"
},
"saveProgressTitle": {
"type": "string",
"description": "Resume screen title"
},
"saveProgressScreen": {
"type": "boolean",
"description": "Show resume screen"
}
},
"description": "Save progress / resume settings",
"additionalProperties": false
},
"idempotency_key": {
"type": "string",
"description": "Reserved client-supplied retry key"
},
"hideControlsOnStart": {
"type": "boolean",
"description": "Hide controls until user interacts"
}
},
"additionalProperties": false
}| custom_html | string | Raw HTML/CSS/JS to render instead of the styled button (advanced) |
| background_color | string | Background color, hex (default: #3e50f7) |
| text_hover_color | string | Text color on hover, hex |
| background_hover_color | string | Background color on hover, hex |
| append_website_query_params | boolean | Append the page's URL query params to the button's URL |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"placement"
],
"properties": {
"url": {
"type": "string",
"description": "URL opened when the button is clicked. Required unless custom_html is set."
},
"size": {
"enum": [
"small",
"medium",
"large"
],
"type": "string",
"description": "Button size (default: small)"
},
"text": {
"type": "string",
"description": "Button label text. Required unless custom_html is set."
},
"end_time": {
"type": "number",
"description": "Seconds into the video when the button disappears. Omit to show until the end of the video."
},
"position": {
"enum": [
"topLeft",
"topCenter",
"topRight",
"midLeft",
"midCenter",
"midRight",
"bottomLeft",
"bottomCenter",
"bottomRight"
],
"type": "string",
"description": "Button position on the video overlay. Only applies to placement='inside'."
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"placement": {
"enum": [
"inside",
"outside"
],
"type": "string",
"description": "Where to place the CTA"
},
"start_time": {
"type": "number",
"description": "Seconds into the video when the button appears. Omit (with end_time) for the whole video."
},
"text_color": {
"type": "string",
"description": "Text color, hex (default: #FFFFFF)"
},
"custom_html": {
"type": "string",
"description": "Raw HTML/CSS/JS to render instead of the styled button (advanced)"
},
"background_color": {
"type": "string",
"description": "Background color, hex (default: #3e50f7)"
},
"text_hover_color": {
"type": "string",
"description": "Text color on hover, hex"
},
"background_hover_color": {
"type": "string",
"description": "Background color on hover, hex"
},
"append_website_query_params": {
"type": "boolean",
"description": "Append the page's URL query params to the button's URL"
}
},
"additionalProperties": false
}| Clip duration range in seconds (default: 30-60) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"source_type"
],
"properties": {
"contexts": {
"type": "array",
"items": {
"type": "string"
},
"description": "AI context hints: 'engajamento','educacional','humor','motivacional','personalizado'"
},
"end_time": {
"type": "number",
"description": "End time in seconds to clip to (default: full video)"
},
"video_id": {
"type": "string",
"description": "Video ID from Panda library (required when source_type=library)"
},
"source_url": {
"type": "string",
"description": "YouTube URL (required when source_type=youtube)"
},
"start_time": {
"type": "number",
"description": "Start time in seconds to clip from (default: 0)"
},
"source_type": {
"enum": [
"library",
"youtube"
],
"type": "string",
"description": "Source: 'library' for Panda video, 'youtube' for YouTube URL"
},
"video_title": {
"type": "string",
"description": "Title for the project (defaults to 'Shorts Project')"
},
"aspect_ratio": {
"enum": [
"vertical",
"horizontal",
"square"
],
"type": "string",
"description": "Output format (default: vertical)"
},
"duration_preset": {
"enum": [
"30-60",
"60-90",
"90-180"
],
"type": "string",
"description": "Clip duration range in seconds (default: 30-60)"
}
},
"additionalProperties": false
}| Seconds into the video when the button appears. Omit (with end_time) for the whole video. |
| text_color | string | Text color, hex (default: #FFFFFF) |
| custom_html | string | Raw HTML/CSS/JS to render instead of the styled button (advanced) |
| background_color | string | Background color, hex (default: #3e50f7) |
| text_hover_color | string | Text color on hover, hex |
| background_hover_color | string | Background color on hover, hex |
| append_website_query_params | boolean | Append the page's URL query params to the button's URL |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id",
"placement",
"cta_id"
],
"properties": {
"url": {
"type": "string",
"description": "URL opened when the button is clicked. Required unless custom_html is set."
},
"size": {
"enum": [
"small",
"medium",
"large"
],
"type": "string",
"description": "Button size (default: small)"
},
"text": {
"type": "string",
"description": "Button label text. Required unless custom_html is set."
},
"cta_id": {
"type": "string",
"description": "ID of the CTA to update"
},
"end_time": {
"type": "number",
"description": "Seconds into the video when the button disappears. Omit to show until the end of the video."
},
"position": {
"enum": [
"topLeft",
"topCenter",
"topRight",
"midLeft",
"midCenter",
"midRight",
"bottomLeft",
"bottomCenter",
"bottomRight"
],
"type": "string",
"description": "Button position on the video overlay. Only applies to placement='inside'."
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"placement": {
"enum": [
"inside",
"outside"
],
"type": "string",
"description": "CTA placement"
},
"start_time": {
"type": "number",
"description": "Seconds into the video when the button appears. Omit (with end_time) for the whole video."
},
"text_color": {
"type": "string",
"description": "Text color, hex (default: #FFFFFF)"
},
"custom_html": {
"type": "string",
"description": "Raw HTML/CSS/JS to render instead of the styled button (advanced)"
},
"background_color": {
"type": "string",
"description": "Background color, hex (default: #3e50f7)"
},
"text_hover_color": {
"type": "string",
"description": "Text color on hover, hex"
},
"background_hover_color": {
"type": "string",
"description": "Background color on hover, hex"
},
"append_website_query_params": {
"type": "boolean",
"description": "Append the page's URL query params to the button's URL"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"refer_ids",
"hostname",
"type",
"scope"
],
"properties": {
"type": {
"enum": [
"ALLOW",
"BLOCK"
],
"type": "string",
"description": "ALLOW = whitelist (only listed domains play); BLOCK = blacklist (listed domains are denied)"
},
"scope": {
"enum": [
"library",
"folder"
],
"type": "string",
"description": "Target scope: 'library' (whole library) or 'folder' (specific folder_ids)"
},
"hostname": {
"type": "string",
"description": "Domain hostname without protocol, e.g. 'example.com' or wildcard '*.cliente.com'"
},
"refer_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Referrer UUIDs to edit (all must be the same hostname) (max 50)"
},
"folder_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Target folder UUIDs — required when scope='folder' (max 50)"
},
"library_id": {
"type": "string",
"description": "Library UUID. Resolved from GET /library when omitted."
}
},
"additionalProperties": false
}| controls | array | 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", "pip", "fullscreen", "airplay", "cast" |
| exclusive | boolean | Dedicate/restrict the profile to a single video |
| profile_id* | string | Profile ID |
| saveProgress | object | Save progress / resume settings |
| hideControlsOnStart | boolean | Hide controls until user interacts |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"profile_id"
],
"properties": {
"vsl": {
"type": "object",
"properties": {
"refCode": {
"type": "string",
"description": "Affiliate referral code"
},
"autoplay": {
"type": "boolean",
"description": "Auto-play video"
},
"disablePause": {
"type": "boolean",
"description": "Disable pause button (VSL mode)"
},
"pandaBranding": {
"type": "boolean",
"description": "Show Panda branding in player"
},
"smartAutoplay": {
"type": "boolean",
"description": "Smart Autoplay — auto-plays muted, unmutes on interaction"
},
"disableForward": {
"type": "boolean",
"description": "Disable forward/seek (VSL mode)"
},
"defaultLanguage": {
"type": "string",
"description": "Default subtitle language"
},
"restartAfterEnd": {
"type": "boolean",
"description": "Restart video after it ends"
},
"timeDisplayType": {
"enum": [
"CURRENT_TIME",
"REMAINING_TIME"
],
"type": "string",
"description": "Time display format"
},
"mutedIndicatorIcon": {
"type": "boolean",
"description": "Show muted indicator overlay"
},
"mutedIndicatorSize": {
"enum": [
"none",
"small",
"medium",
"large"
],
"type": "string",
"description": "Muted indicator size"
},
"alternativeProgress": {
"type": "boolean",
"description": "Fake progress bar (VSL mode)"
},
"mutedIndicatorTextTop": {
"type": "string",
"description": "Muted indicator top text (max 40 chars)"
},
"mutedIndicatorFontSize": {
"type": "number",
"description": "Muted indicator font size (12-32)"
},
"mutedIndicatorAnimation": {
"type": "string",
"description": "Muted indicator animation style"
},
"mutedIndicatorTextColor": {
"type": "string",
"description": "Muted indicator text color"
},
"mutedIndicatorTextBottom": {
"type": "string",
"description": "Muted indicator bottom text (max 40 chars)"
},
"alternativeProgressHeight": {
"type": "number",
"description": "Fake progress bar height in px"
},
"alternativeProgress2xLimit": {
"type": "number",
"description": "Percentage at which fake progress accelerates"
},
"alternativeProgressVelocity": {
"type": "number",
"description": "Fake progress bar speed (1-10)"
},
"mutedIndicatorBackgroundColor": {
"type": "string",
"description": "Muted indicator background color"
},
"alternativeProgressDefaultVelocity": {
"type": "boolean",
"description": "Use recommended fake progress speed"
}
},
"description": "VSL (Video Sales Letter) settings — controls autoplay, smart autoplay, fake progress bar, muted indicator",
"additionalProperties": false
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Rename the profile (usually a video ID; 3–100 chars)"
},
"colors": {
"type": "object",
"properties": {
"background": {
"type": "string",
"description": "Player background color (hex)"
},
"primaryColor": {
"type": "string",
"description": "Primary accent color (hex)"
},
"captionsColor": {
"type": "string",
"description": "(Legacy) Subtitle text color (hex). Prefer `captions.foreground` on the modern subtitle editor."
},
"controlsColor": {
"type": "string",
"description": "Controls color (hex)"
},
"captionsBackgroundColor": {
"type": "string",
"description": "(Legacy) Subtitle background color (hex). Prefer `captions.background`."
}
},
"description": "Player color settings",
"additionalProperties": false
},
"general": {
"type": "object",
"properties": {
"fontSize": {
"enum": [
"extraSmall",
"small",
"normal",
"large",
"extraLarge"
],
"type": "string",
"description": "Subtitle font size keyword: extraSmall=10px, small=12px, normal=14px(default), large=16px, extraLarge=18px. Send fontSizePx alongside."
},
"fontSizePx": {
"type": "number",
"description": "Subtitle font size in px — must match fontSize: 10/12/14/16/18."
},
"smartSearch": {
"type": "boolean",
"description": "(Legacy) Enable smart search in video. v2 sends `searchInsideVideo` — both accepted."
},
"default_speed": {
"type": "number",
"description": "Default playback speed (1, 1.1, 1.2, 1.3, 1.4, 1.5)"
},
"searchInsideVideo": {
"type": "boolean",
"description": "Enable smart search inside the video (same semantic as legacy smartSearch)."
},
"startsWithSubtitle": {
"type": "boolean",
"description": "Whether the video starts with the subtitle track visible by default."
}
},
"description": "General player + subtitle settings (speed, font size, search-in-video, defaults).",
"additionalProperties": false
},
"captions": {
"type": "object",
"properties": {
"background": {
"type": "string",
"description": "Subtitle background color as 8-char hex with alpha — `RRGGBBAA`, e.g. '000000B3' = 70% opaque black."
},
"foreground": {
"type": "string",
"description": "Subtitle text color as 8-char hex with alpha — `RRGGBBAA`, e.g. 'FFFFFFFF' = opaque white."
}
},
"description": "Per-video subtitle (caption) appearance — text and background colors (v2 dashboard).",
"additionalProperties": false
},
"controls": {
"type": "array",
"items": {
"type": "string"
},
"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\", \"pip\", \"fullscreen\", \"airplay\", \"cast\""
},
"exclusive": {
"type": "boolean",
"description": "Dedicate/restrict the profile to a single video"
},
"profile_id": {
"type": "string",
"description": "Profile ID"
},
"saveProgress": {
"type": "object",
"properties": {
"initQuality": {
"type": "number",
"description": "Initial video quality (e.g. 720)"
},
"saveProgress": {
"type": "boolean",
"description": "Enable resume from last position"
},
"saveProgressTitle": {
"type": "string",
"description": "Resume screen title"
},
"saveProgressScreen": {
"type": "boolean",
"description": "Show resume screen"
}
},
"description": "Save progress / resume settings",
"additionalProperties": false
},
"hideControlsOnStart": {
"type": "boolean",
"description": "Hide controls until user interacts"
}
},
"additionalProperties": false
}| panda_branding | boolean | Show/hide Panda logo branding on player |
| default_subtitle | string | Default subtitle language code (e.g. 'pt-BR', 'en') or 'false' to disable |
| redirect_video_id | string | null | Video ID to redirect to at end, or null to remove redirect |
| retention_markers | array | Retention markers (pitch points) for analytics |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"video_id"
],
"properties": {
"ai": {
"type": "object",
"description": "AI configuration object (search, tutor settings)",
"additionalProperties": {}
},
"mindmap": {
"type": "boolean",
"description": "Enable/disable AI MindMap feature"
},
"abstract": {
"type": "boolean",
"description": "Enable/disable AI eBook/Abstract feature"
},
"chapters": {
"type": "array",
"items": {
"type": "object",
"required": [
"title",
"time"
],
"properties": {
"time": {
"type": "number",
"description": "Position in seconds (e.g. 0 for beginning, 60 for 1min)"
},
"title": {
"type": "string",
"description": "Chapter title"
}
},
"additionalProperties": false
},
"description": "Chapters/bookmarks. Send [] to remove all."
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"on_funnel": {
"type": "boolean",
"description": "Enable/disable funnel integration"
},
"questions": {
"type": "boolean",
"description": "Enable/disable AI Quiz feature"
},
"custom_pixels": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "Array of custom pixel objects (fbPixel, gtagIds, custom script)"
},
"panda_branding": {
"type": "boolean",
"description": "Show/hide Panda logo branding on player"
},
"default_subtitle": {
"type": "string",
"description": "Default subtitle language code (e.g. 'pt-BR', 'en') or 'false' to disable"
},
"redirect_video_id": {
"type": [
"string",
"null"
],
"description": "Video ID to redirect to at end, or null to remove redirect"
},
"retention_markers": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"time"
],
"properties": {
"time": {
"type": "number",
"description": "Position in seconds"
},
"type": {
"enum": [
"pitch",
"custom"
],
"type": "string",
"description": "Marker type"
},
"title": {
"type": "string",
"description": "Marker label"
}
},
"additionalProperties": false
},
"description": "Retention markers (pitch points) for analytics"
}
},
"additionalProperties": false
}