zvid-io · Schema

Zvid authoring project and template input

The payload accepted by render requests and stored templates, before variable substitution, conditions and scene iteration. Whole placeholders preserve the variable's type. Run authenticated validation to resolve values, enforce semantic rules and apply your account limits. Stored video templates require explicit positive scene durations.

CompanyVideoAutomationMedia

Properties

Name Type Description
type object Render type. "image" produces a still (png/jpg/webp) and forbids all time-domain fields.
name object
resolution object
width object
height object
duration object
durationMode object
frameRate object
outputFormat object
backgroundColor object
snapshotTime object
quality object
transparent object
visuals object
audios object
scenes object
thumbnail object
subtitle object
variables object Default variable values; request variables override these. Scene defaults shadow project values inside that scene.
View JSON Schema on GitHub

JSON Schema

zvid-io-render-payload-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/zvid-io/json-schema/zvid-io-render-payload-schema.json",
  "title": "Zvid authoring project and template input",
  "description": "The payload accepted by render requests and stored templates, before variable substitution, conditions and scene iteration. Whole placeholders preserve the variable's type. Run authenticated validation to resolve values, enforce semantic rules and apply your account limits. Stored video templates require explicit positive scene durations.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/zvid-io-openapi.yaml#/components/schemas/RenderPayload",
  "type": "object",
  "properties": {
    "type": {
      "enum": [
        "video",
        "image"
      ],
      "default": "video",
      "description": "Render type. \"image\" produces a still (png/jpg/webp) and forbids all time-domain fields."
    },
    "name": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[a-zA-Z0-9_\\- ]+$",
          "maxLength": 1000,
          "default": "unnamed",
          "description": "Output name. Letters, digits, space, _ and - ONLY (no punctuation)."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "resolution": {
      "anyOf": [
        {
          "enum": [
            "sd",
            "hd",
            "full-hd",
            "squared",
            "youtube-short",
            "youtube-video",
            "tiktok",
            "instagram-reel",
            "instagram-post",
            "instagram-story",
            "instagram-feed",
            "twitter-landscape",
            "twitter-portrait",
            "twitter-square",
            "facebook-video",
            "facebook-story",
            "facebook-post",
            "snapchat",
            "custom"
          ],
          "description": "Canvas preset. Any value except \"custom\" OVERRIDES width/height."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "width": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "description": "Canvas width in px (plan-limited).",
          "default": 1280,
          "x-zvid-plan-dependent": true
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "height": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "description": "Canvas height in px (plan-limited).",
          "default": 720,
          "x-zvid-plan-dependent": true
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "duration": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0.1,
          "description": "Video length in seconds (plan-limited). With durationMode auto this is an optional minimum. Scene projects always include the full scene sequence.",
          "default": 10,
          "x-zvid-plan-dependent": true
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "durationMode": {
      "anyOf": [
        {
          "enum": [
            "auto",
            "fixed"
          ],
          "description": "Auto derives length from scenes, explicit element ends and captions. Supply videoEnd/exitEnd and audioEnd/exit for API submission. Omit to preserve legacy timing."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "frameRate": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 60,
          "description": "Frames per second.",
          "default": 30
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "outputFormat": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "mp4",
            "mov",
            "avi",
            "webm",
            "png",
            "jpg",
            "jpeg",
            "webp"
          ],
          "description": "Videos: mp4 (default), mov, avi, webm. Images (type: \"image\"): png (default), jpg, jpeg, webp."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "backgroundColor": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
          "description": "Canvas background color.",
          "default": "#ffffff"
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "snapshotTime": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0,
          "maximum": 3600,
          "description": "Image renders only: second of the (virtual) timeline to snapshot."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "quality": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "description": "Image renders only: jpg/webp quality (NOT valid for png)."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "transparent": {
      "anyOf": [
        {
          "type": "boolean",
          "description": "Image renders only: transparent background (png/webp only, not jpg)."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "visuals": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Visual"
          },
          "description": "Elements shown for the whole project (outside scenes)."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "audios": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AudioItem"
          },
          "description": "Project-level audio tracks (video only, plan-limited count)."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "scenes": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Scene"
          },
          "description": "Sequential timeline segments (video only, plan-limited count).",
          "x-zvid-plan-dependent": true
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "thumbnail": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 2048,
          "pattern": "^https?://",
          "description": "Custom thumbnail image URL (video only). Must be a PUBLIC http(s) URL: no credentials, no spaces/backslashes, port 80/443 only, no localhost/.local, no private IPs."
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "subtitle": {
      "anyOf": [
        {
          "$ref": "#/$defs/Subtitle"
        },
        {
          "type": "string",
          "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
        }
      ]
    },
    "variables": {
      "type": "object",
      "additionalProperties": true,
      "description": "Default variable values; request variables override these. Scene defaults shadow project values inside that scene."
    }
  },
  "additionalProperties": false,
  "allOf": [
    {
      "if": {
        "properties": {
          "type": {
            "const": "image"
          }
        },
        "required": [
          "type"
        ]
      },
      "then": {
        "properties": {
          "duration": false,
          "durationMode": false,
          "frameRate": false,
          "audios": false,
          "scenes": false,
          "thumbnail": false,
          "subtitle": false,
          "outputFormat": {
            "anyOf": [
              {
                "enum": [
                  "png",
                  "jpg",
                  "jpeg",
                  "webp"
                ],
                "default": "png"
              },
              {
                "type": "string",
                "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
              }
            ]
          },
          "visuals": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "$ref": "#/$defs/ImageVisual"
                    },
                    {
                      "$ref": "#/$defs/TextVisual"
                    },
                    {
                      "$ref": "#/$defs/SvgVisual"
                    }
                  ]
                }
              },
              {
                "type": "string",
                "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
              }
            ]
          }
        }
      },
      "else": {
        "properties": {
          "snapshotTime": false,
          "quality": false,
          "transparent": false,
          "outputFormat": {
            "anyOf": [
              {
                "enum": [
                  "mp4",
                  "mov",
                  "avi",
                  "webm"
                ],
                "default": "mp4"
              },
              {
                "type": "string",
                "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
              }
            ]
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "image"
          },
          "outputFormat": {
            "enum": [
              "png"
            ]
          }
        },
        "required": [
          "type",
          "outputFormat"
        ]
      },
      "then": {
        "properties": {
          "quality": false
        }
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "image"
          }
        },
        "required": [
          "type"
        ],
        "not": {
          "required": [
            "outputFormat"
          ]
        }
      },
      "then": {
        "properties": {
          "quality": false
        }
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "image"
          },
          "outputFormat": {
            "enum": [
              "jpg",
              "jpeg"
            ]
          }
        },
        "required": [
          "type",
          "outputFormat"
        ]
      },
      "then": {
        "properties": {
          "transparent": {
            "anyOf": [
              {
                "const": false
              },
              {
                "type": "string",
                "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
              }
            ]
          }
        }
      }
    }
  ],
  "x-zvid-source": {
    "schemaVersion": "1.0.0",
    "source": "zvid-integrations/schema/src/zvidSchema.ts via orch/services/zvidSchema.generated.js",
    "sha256": "63b17aa2e6edc73fc25d571df058d372f1e6d51fe39f2b2b1071d9e06add7a3d"
  },
  "$defs": {
    "AudioItem": {
      "type": "object",
      "title": "Audio item",
      "description": "A soundtrack / voice-over entry for `audios` (video projects only).",
      "properties": {
        "src": {
          "anyOf": [
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 2048,
              "pattern": "^https?://",
              "description": "Audio file URL (mp3/wav/...). Must be a PUBLIC http(s) URL: no credentials, no spaces/backslashes, port 80/443 only, no localhost/.local, no private IPs."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "matchDuration": {
          "anyOf": [
            {
              "type": "boolean",
              "description": "Follow the containing scene/project length without extending automatic duration. Overrides exit."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "enter": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Timeline second the audio starts playing.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "exit": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Timeline second the audio stops. Must be >= enter.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "volume": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 2
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "speed": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0.1,
              "maximum": 10
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "audioBegin": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Trim: source second where playback starts.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "audioEnd": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Trim: source second where playback ends. Must be >= audioBegin.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "audioDuration": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Play only this many seconds of the source.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "track": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "description": "Mix track index; audio tracks mix together."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "condition": {
          "description": "A literal flag or placeholder. false, 0, an empty string, null or an absent resolved value prune this item. Expressions are not supported."
        }
      },
      "additionalProperties": false
    },
    "ChromaKey": {
      "type": "object",
      "description": "Green-screen keying.",
      "properties": {
        "color": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
              "description": "Key color to remove (required)."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "similarity": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "blend": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        }
      },
      "required": [
        "color"
      ],
      "additionalProperties": false
    },
    "CropParams": {
      "type": "object",
      "description": "Source crop rectangle in source-media pixels.",
      "properties": {
        "x": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "y": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 1,
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 1,
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        }
      },
      "required": [
        "x",
        "y",
        "width",
        "height"
      ],
      "additionalProperties": false
    },
    "CustomCode": {
      "type": "object",
      "description": "Sandboxed styling/animation code run inside the render browser (Design Studio). No network/filesystem/storage/navigation APIs — see validation notes.",
      "properties": {
        "css": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 200000
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "js": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 200000
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "animationDuration": {
          "anyOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 15,
              "description": "Seconds the customCode animation runs (max 15)."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "Designer": {
      "type": "object",
      "description": "Opaque Design Studio round-trip metadata (max 200k chars serialized). Never rendered; keeps 'edit design' working."
    },
    "Filter": {
      "type": "object",
      "description": "CSS-like color filters.",
      "properties": {
        "brightness": {
          "anyOf": [
            {
              "type": "number",
              "minimum": -100,
              "maximum": 100
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "contrast": {
          "anyOf": [
            {
              "type": "number",
              "minimum": -100,
              "maximum": 100
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "saturate": {
          "anyOf": [
            {
              "type": "number",
              "minimum": -100,
              "maximum": 100
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "hue-rotate": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:deg)?$",
              "description": "Degrees, preferably with a \"deg\" suffix (e.g. \"90deg\"). Legacy numeric strings such as \"90\" remain accepted."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "blur": {
          "anyOf": [
            {
              "description": "Unitless 0..100 amount. Numeric strings remain accepted for backward compatibility; CSS lengths such as 4px are not supported.",
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                {
                  "type": "string",
                  "pattern": "^(?:0*(?:100(?:\\.0+)?|\\d{1,2}(?:\\.\\d+)?|\\.\\d+))$"
                }
              ]
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "invert": {
          "anyOf": [
            {
              "description": "Boolean or partial inversion amount from 0 to 1.",
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                }
              ]
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "colorTint": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
              "description": "Tint color (#rgb or #rrggbb)."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "GifVisual": {
      "type": "object",
      "title": "GIF element",
      "description": "An animated GIF placed on the canvas (video projects only).",
      "properties": {
        "type": {
          "type": "string",
          "pattern": "^[Gg][Ii][Ff]$",
          "description": "\"GIF\" (case-insensitive)."
        },
        "x": {
          "anyOf": [
            {
              "type": "number",
              "description": "Anchor-point X in canvas px (may be negative). ONLY used when position is \"custom\" — every other preset OVERWRITES x/y.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "y": {
          "anyOf": [
            {
              "type": "number",
              "description": "Anchor-point Y in canvas px (may be negative). ONLY used when position is \"custom\" — every other preset OVERWRITES x/y.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 1,
              "description": "Element width in px (plan-limited).",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "height": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 1,
              "description": "Element height in px (plan-limited).",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "position": {
          "anyOf": [
            {
              "enum": [
                "top-left",
                "top-center",
                "top-right",
                "center-left",
                "center-center",
                "center-right",
                "bottom-right",
                "bottom-center",
                "bottom-left",
                "custom"
              ],
              "description": "Placement preset. Sets BOTH the canvas point AND the default anchor (e.g. \"bottom-center\" puts the element's bottom edge flush with the frame bottom — no margin). x/y are IGNORED unless \"custom\". Two elements with the same preset render exactly stacked."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "anchor": {
          "anyOf": [
            {
              "enum": [
                "top-left",
                "top-center",
                "top-right",
                "center-left",
                "center-center",
                "center-right",
                "bottom-right",
                "bottom-center",
                "bottom-left",
                "custom"
              ],
              "description": "Which point of the ELEMENT sits at the position point. Defaults to the position preset itself (\"custom\" defaults to top-left)."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "resize": {
          "anyOf": [
            {
              "enum": [
                "contain",
                "cover"
              ],
              "description": "How media fits its frame: contain (letterbox) or cover (center-crop). With explicit width/height the media fits INTO that box (CSS object-fit); without a box it is sized against the full canvas."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "enterBegin": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Seconds when the element starts appearing (enter animation start).",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "enterEnd": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Seconds when the enter animation finishes. Must be >= enterBegin.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "exitBegin": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Seconds when the exit animation starts.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "exitEnd": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "description": "Seconds when the element is fully gone. Must be >= exitBegin.",
              "x-zvid-plan-dependent": true
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "opacity": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "description": "Element opacity, 0..1."
            },
            {
              "type": "string",
              "pattern": "\\{\\{\\s*[A-Za-z][A-Za-z0-9_]*(?:\\.(?:[A-Za-z][A-Za-z0-9_]*|[0-9]+))*\\s*\\}\\}"
            }
          ]
        },
        "angle": {
          "anyOf": [
            {
              "type": "number",
              "minimum": -360,
              "maximum": 360,
              "description": "Rotation in degrees."
            },
            {
              "type": "

# --- truncated at 32 KB (148 KB total) ---
# Full source: https://artifacts.apis.io/zvid-io/json-schema/zvid-io-render-payload-schema.json

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/zvid-io-render-payload"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.