---
title: "Repair canvas preview media"
method: POST
path: "/v1/canvases/{canvasId}/repair"
tags: ["Canvases"]
---

# Repair canvas preview media

`POST /v1/canvases/{canvasId}/repair`

## Request

- Base URL: `https://api.masko.ai`
- URL: `https://api.masko.ai/v1/canvases/{canvasId}/repair`
- Auth: HTTP bearer

Plans or starts a narrow repair for missing base WebM/HEVC derivatives on videos already assigned to this canvas. Agent workflow: first call with `dry_run=true` or omit `dry_run` because it defaults to true. Read `status.media.preview`, `summary`, `repairs`, `in_flight`, and `skipped`. If `status.media.preview.waiting_edges > 0`, wait and poll again instead of repairing. Only call again with `dry_run=false` if the repair plan matches the intended canvas videos. This endpoint is for the specific case where `status.media.generation.ready=true`, `status.media.preview.ready=false`, and `status.media.preview.repairable=true`. It does not regenerate animations, does not run mascot-wide jobs, does not create size variants, does not expose prompt/model controls, does not force regeneration, and does not archive existing assets.

## Path parameters

- `canvasId` string, uuid, required

## Headers

- `Idempotency-Key` string

## Request body

- RepairCanvasBody
  - `target` 'video_derivatives': Repair target. Use video_derivatives when canvas status shows status.media.preview.repairable=true because completed edge videos are missing base WebM and/or HEVC child assets. If status.media.preview.waiting_edges > 0, wait and poll again instead of repairing. This target only repairs videos already assigned to the canvas graph.
  - `formats` string[]: Base derivative formats to repair. Defaults to both webm and hevc. This does not include size variants; optimized sizes must be generated through the size-variant flow.
  - `dry_run` boolean: When true, returns the exact repair plan without creating jobs or assets. Defaults to true. Agents should call dry_run=true first, inspect repairs/skipped/in_flight, then call dry_run=false only if the plan touches the intended videos.

## Response `200`

Repair plan returned

- CanvasRepairResponse
  - `data` CanvasRepairData, required
    - `target` 'video_derivatives', required
    - `dry_run` boolean, required
    - `formats` string[], required
    - `status` object, required
      - `generated_ready` boolean, required
      - `preview_ready` boolean, required
      - `media` object
        - `generation` object, required
          - `ready` boolean, required
          - `nodes` object, required
            - `total` number, required
            - `completed` number, required
            - `pending` number, required: Incomplete node count. Includes failed nodes for backward compatibility; inspect failed for the terminal subset.
            - `failed` number, required
          - `edges` object, required
            - `total` number, required
            - `completed` number, required
            - `pending` number, required
            - `failed` number, required
        - `preview` object, required
          - `ready` boolean, required
          - `repairable` boolean, required
          - `repairable_edges` number, required
          - `waiting_edges` number, required
          - `missing_edges` number, required
          - `missing_formats` string[], required
        - `variants` object, required
          - `sizes` string[], required
          - `missing` object[], required
            - `edge_id` string, required
            - `size` string, required
            - `formats` string[], required
    - `summary` object, required
      - `edges_checked` number, required
      - `videos_checked` number, required
      - `videos_ready` number, required
      - `videos_to_repair` number, required
      - `videos_in_flight` number, required
      - `videos_skipped` number, required
    - `repairs` object[], required
      - `video_asset_id` string, uuid, required
      - `edge_ids` string[], required
      - `missing` string[], required
      - `action` 'create_derivatives' | 'already_in_flight', required
      - `job_id` string, uuid
    - `in_flight` object[], required
      - `video_asset_id` string, uuid, required
      - `edge_ids` string[], required
      - `missing` string[], required
      - `action` 'create_derivatives' | 'already_in_flight', required
      - `job_id` string, uuid
    - `skipped` object[], required
      - `video_asset_id` string, uuid, required
      - `edge_ids` string[], required
      - `reason` string, required
    - `jobs` object[]
      - `job_id` string, uuid, required
      - `poll_url` string, required
      - `video_asset_id` string, uuid, required
      - `edge_ids` string[], required
      - `formats` string[], required

## Other responses

- `202`: Repair jobs started
- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `409`: Conflict

---

[API](https://skmtc.dev/masko/apis/masko-api.md) · [All operations](https://skmtc.dev/masko/apis/masko-api/llms.txt) · [OpenAPI document](https://skmtc.dev/masko/apis/masko-api/revisions/91eb3006a92f?raw)
