{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/vidplate-app/json-schema/vidplate-app-render-estimate-schema.json",
  "title": "RenderEstimate",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/vidplate-app-openapi.json#/components/schemas/RenderEstimate",
  "type": "object",
  "properties": {
    "object": {
      "const": "render_estimate"
    },
    "valid": {
      "type": "boolean"
    },
    "output_count": {
      "type": "integer"
    },
    "outputs": {
      "type": "array",
      "description": "Each output with its real width and height in pixels and the settings it would be made with (resolution, fps, codec, container, mime_type, quality, video_bitrate_kbps, max_video_bitrate_kbps: the bitrate ceiling worked out from max_file_size_mb, bitrate_mode, max_file_size_mb, audio; image_format and image_quality for statics), and render_preset and render_preset_applied when a 3D render preset was named.",
      "items": {
        "type": "object"
      }
    },
    "ai_credits": {
      "type": "number",
      "description": "AI credits POST /renders would charge: 1 per captioned output."
    },
    "captioned_outputs": {
      "type": "integer",
      "description": "Outputs that would have captions."
    },
    "quota": {
      "type": "object"
    },
    "video_minutes": {
      "type": "object",
      "description": "Video minutes POST /renders would reserve (requested), what is left this calendar month (remaining), the allowance (limit, null for no limit) and resets_at (null for the Sandbox, whose minutes are a one-off total)."
    },
    "static_outputs": {
      "type": [
        "object",
        "null"
      ],
      "description": "Studio Pro only (null otherwise): static outputs POST /renders would count (requested, each format x variant is 1), the monthly allowance (limit), what is left (remaining) and resets_at."
    },
    "sandbox_allowance": {
      "type": [
        "object",
        "null"
      ],
      "description": "Sandbox only (null otherwise): the one-off totals for the whole trial. renders_requested, renders_limit, renders_remaining, video_minutes_limit, video_minutes_remaining. Never reset."
    },
    "routing": {
      "type": "object",
      "description": "renderer, nodes_online, and capable_nodes_online (online nodes that can make every output's size, frame rate and codec) when outputs ask for them. For video, requires_3d_capable_node is true when the template's 3D settings, or its 3D render preset, need a render node that supports advanced 3D; capable_3d_nodes_online then counts those online."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Plain sentences, for example when no render node online can make an output (the render would wait for one)."
    }
  }
}