---
title: "save_video_analysis: Save a video beat sheet"
description: "Store your beat sheet for an analysed video."
canonical_url: "https://meetkuro.com/agents/tools/save_video_analysis/"
updated: 2026-11-03
locale: "en"
tool: "save_video_analysis"
scopes: ["generation.write"]
---

# save_video_analysis

**Save a video beat sheet**

Store your beat sheet for an analysed video. Read measure_video first.
Emit exactly one shot object per shot in the bundle, with the same index — a beat sheet whose indexes do not match the measured shots is rejected and nothing is stored.
image_prompt and motion_prompt should describe the shot for a DIFFERENT subject: that is what makes the format reusable. Costs no credits.

## Scope

- `generation.write` — Makes, edits, imports, shares and deletes media in the account.

## Behaviour

- **Writes**: Creates or changes items in the caller's own account.
- **Can delete or overwrite**: Can delete, overwrite, cancel or withdraw something the caller already has, so a host should confirm it.
- **Stays in the account**: Stays inside the caller's private Kuro account: any media provider it calls acts on Kuro's account, and the result is visible to no one else.
- **Idempotent**: Calling it again with the same arguments has no further effect.

## Credits

What the tool's description says about credits, verbatim:

- Costs no credits.

## Inputs

| Name | Type | Required | Details |
| --- | --- | --- | --- |
| `upload_id` | string | yes | uuid |
| `beat_sheet` | object | yes | fields: format_summary, hook, structure, tags, shots, beats |

## Example call

A `tools/call` request with the required arguments only, each a placeholder read off the schema. Replace them before sending.

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "save_video_analysis",
    "arguments": {
      "upload_id": "00000000-0000-4000-8000-000000000000",
      "beat_sheet": {
        "format_summary": "<format_summary>",
        "hook": "<hook>",
        "structure": "<structure>",
        "tags": [
          "<tags>"
        ],
        "shots": [
          {
            "index": 0,
            "role": "hook",
            "description": "<description>",
            "shot_size": "extreme_wide",
            "camera": "static",
            "setting": "<setting>",
            "on_screen_text": "<on_screen_text>",
            "narration": "<narration>",
            "sound": "<sound>"
          }
        ],
        "beats": [
          {
            "role": "hook",
            "shot_indexes": [
              0
            ],
            "title": "<title>",
            "intent": "<intent>"
          }
        ]
      }
    }
  }
}
```

## Input schema

As the server sends it in `tools/list`:

```json
{
  "type": "object",
  "properties": {
    "upload_id": {
      "type": "string",
      "format": "uuid"
    },
    "beat_sheet": {
      "type": "object",
      "properties": {
        "format_summary": {
          "type": "string",
          "minLength": 1,
          "maxLength": 600
        },
        "hook": {
          "type": "string",
          "minLength": 1,
          "maxLength": 400
        },
        "structure": {
          "type": "string",
          "minLength": 1,
          "maxLength": 1200
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 30
          },
          "maxItems": 12
        },
        "shots": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "index": {
                "type": "integer",
                "minimum": 0
              },
              "role": {
                "type": "string",
                "enum": [
                  "hook",
                  "setup",
                  "build",
                  "proof",
                  "payoff",
                  "cta"
                ]
              },
              "description": {
                "type": "string",
                "minLength": 1,
                "maxLength": 600
              },
              "shot_size": {
                "type": "string",
                "enum": [
                  "extreme_wide",
                  "wide",
                  "medium_wide",
                  "medium",
                  "medium_close",
                  "close",
                  "extreme_close",
                  "insert"
                ]
              },
              "camera": {
                "type": "string",
                "enum": [
                  "static",
                  "handheld",
                  "pan",
                  "tilt",
                  "push_in",
                  "pull_out",
                  "tracking",
                  "orbit",
                  "crane",
                  "whip",
                  "pov",
                  "drone"
                ]
              },
              "setting": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "on_screen_text": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 300
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "narration": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "sound": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 300
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "image_prompt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "motion_prompt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 6000
              }
            },
            "required": [
              "index",
              "role",
              "description",
              "shot_size",
              "camera",
              "setting",
              "on_screen_text",
              "narration",
              "sound"
            ],
            "additionalProperties": false
          },
          "minItems": 1,
          "maxItems": 60
        },
        "beats": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "role": {
                "$ref": "#/properties/beat_sheet/properties/shots/items/properties/role"
              },
              "shot_indexes": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "minimum": 0
                },
                "minItems": 1,
                "maxItems": 60
              },
              "title": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "intent": {
                "type": "string",
                "minLength": 1,
                "maxLength": 600
              }
            },
            "required": [
              "role",
              "shot_indexes",
              "title",
              "intent"
            ],
            "additionalProperties": false
          },
          "minItems": 1,
          "maxItems": 60
        }
      },
      "required": [
        "format_summary",
        "hook",
        "structure",
        "tags",
        "shots",
        "beats"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "upload_id",
    "beat_sheet"
  ],
  "additionalProperties": false
}
```

## Related tools

- [`measure_video`](https://meetkuro.com/agents/tools/measure_video.md): Measure an uploaded video so you can reverse-engineer its format: shot boundaries with real timestamps, one or more keyframe images per shot, a timed transcript, and pacing stats.
- [`import_video_url`](https://meetkuro.com/agents/tools/import_video_url.md): Import one public YouTube, Facebook or TikTok video (up to 10 minutes and 250 MB) into the Library.

---

## About Kuro

Kuro is an AI picture studio: prompt-driven images, clips, voice-overs and music, and storyboard-backed films with consistent characters across every scene.

Agents connect over MCP and can generate directly:

```
claude mcp add kuro https://api.meetkuro.com/mcp --transport http
```

The app is at https://app.meetkuro.com and requires an account.

Each guide, model page, comparison and free tool page on this site (not a tool's variants, and not the index pages) has a Markdown twin at its own URL plus `.md`, and so do /benchmarks/, the English /agents/ page (as /agents.md) and the MCP tool reference. Every tool: https://meetkuro.com/agents/tools/
