---
title: "Generate an automatic layout plan plus preview frames before apply"
method: POST
path: "/workspace/media/assets/{assetId}/reframe-plan/preview"
tags: ["Media Library"]
---

# Generate an automatic layout plan plus preview frames before apply

`POST /workspace/media/assets/{assetId}/reframe-plan/preview`

## Request

- Base URL: `https://blitzreels.com/api/v1`
- URL: `https://blitzreels.com/api/v1/workspace/media/assets/{assetId}/reframe-plan/preview`
- Auth: API key in header `Authorization`

Generate an automatic layout plan plus preview frames before apply.

## Path parameters

- `assetId` string, required

## Request body

- object
  - `project_id` string, required
  - `aspect_ratio` '9:16' | '16:9' | '1:1' | '4:5', nullable, required
  - `trim_start_seconds` number, required
  - `trim_end_seconds` number, required
  - `content_type_hint` 'auto' | 'podcast' | 'tutorial' | 'generic', required
  - `layout_strategy` 'auto' | 'demo' | 'letterbox' | 'split' | 'focus' | 'speaker_grid' | 'webinar' | 'webinar_stack' | 'gameplay', required
  - `preview_times_seconds` number[], nullable, required
  - `target_width` number, nullable, required
  - `image_format` 'jpeg' | 'png', nullable, required

## Response `200`

Successful response

- object
  - `asset_id` string, required
  - `project_id` string, nullable, required
  - `aspect_ratio` '9:16' | '16:9' | '1:1' | '4:5', required
  - `trim_start_seconds` number, required
  - `trim_end_seconds` number, required
  - `analysis` object, required
    - `status` 'missing' | 'pending' | 'processing' | 'completed' | 'failed', required
    - `analysis_version` number, nullable, required
    - `error_message` string, nullable, required
    - `primary_classification` 'unknown' | 'single_speaker' | 'podcast_two_up' | 'tutorial_screencast', nullable, required
    - `classification_confidence` number, nullable, required
    - `fallback_template_key` 'manual' | 'legacy' | 'portrait_landscape_letterbox' | 'portrait_dual_speaker_split' | 'portrait_dual_speaker_focus_cut' | 'portrait_tutorial_screen_focus' | 'portrait_tutorial_facecam_stack' | 'portrait_speaker_grid' | 'portrait_webinar_facecam_stack' | 'portrait_webinar_speaker_stack' | 'portrait_gameplay_facecam_stack', nullable, required
    - `dominant_speaker_side` 'left' | 'right', nullable, required
    - `frames_analyzed` number, nullable, required
    - `low_confidence` boolean, nullable, required
  - `layout_summary` object, required
    - `primary_layout` 'manual' | 'legacy' | 'portrait_landscape_letterbox' | 'portrait_dual_speaker_split' | 'portrait_dual_speaker_focus_cut' | 'portrait_tutorial_screen_focus' | 'portrait_tutorial_facecam_stack' | 'portrait_speaker_grid' | 'portrait_webinar_facecam_stack' | 'portrait_webinar_speaker_stack' | 'portrait_gameplay_facecam_stack', nullable, required
    - `layouts_used` string[], required
    - `segment_count` number, required
    - `split_segment_count` number, required
    - `focus_segment_count` number, required
    - `letterbox_segment_count` number, required
    - `fallback_segment_count` number, required
  - `segments` object[], required
    - `segment_key` string, required
    - `layout_key` 'manual' | 'legacy' | 'portrait_landscape_letterbox' | 'portrait_dual_speaker_split' | 'portrait_dual_speaker_focus_cut' | 'portrait_tutorial_screen_focus' | 'portrait_tutorial_facecam_stack' | 'portrait_speaker_grid' | 'portrait_webinar_facecam_stack' | 'portrait_webinar_speaker_stack' | 'portrait_gameplay_facecam_stack', required
    - `trim_start_seconds` number, required
    - `trim_end_seconds` number, required
    - `output_start_seconds` number, required
    - `output_duration_seconds` number, required
    - `confidence` number, nullable, required
    - `fallback_reason` string, nullable, required
    - `notes` string[], required
    - `views` object[], required
      - `sync_role` 'primary' | 'secondary' | 'tertiary' | 'quaternary', required
      - `layer_index` number, required
      - `source_crop` object, required
        - `x` number, required
        - `y` number, required
        - `width` number, required
        - `height` number, required
      - `canvas_rect` object, required
        - `x` number, required
        - `y` number, required
        - `width` number, required
        - `height` number, required
      - `fit_mode` 'contain' | 'cover' | 'stretch', required
      - `mask_shape` 'none' | 'rounded' | 'circle', required
      - `mask_radius` number, required
  - `warnings` string[], required
  - `previews` object[], required
    - `preview_url` string, required
    - `expires_at` string, required
    - `storage_key` string, required
    - `frame` number, required
    - `time_seconds` number, required
    - `width` number, required
    - `height` number, required
    - `image_format` 'jpeg' | 'png', required

## Other responses

- `400`: Invalid input data
- `401`: Authorization not provided
- `403`: Insufficient access
- `500`: Internal server error

---

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