---
title: "Upsert a public media view for a project timeline item"
method: POST
path: "/projects/{projectId}/timeline/media-views/items/{timelineItemId}"
tags: ["Media Library"]
---

# Upsert a public media view for a project timeline item

`POST /projects/{projectId}/timeline/media-views/items/{timelineItemId}`

## Request

- Base URL: `https://blitzreels.com/api/v1`
- URL: `https://blitzreels.com/api/v1/projects/{projectId}/timeline/media-views/items/{timelineItemId}`
- Auth: API key in header `Authorization`

Upsert a public media view for a project timeline item.

## Path parameters

- `projectId` string, required
- `timelineItemId` string, required

## Request body

- object
  - `expected_revision` integer, required
  - `source_asset_id` string, required
  - `source_start_units` string, nullable, required
  - `source_end_units` string, nullable, required
  - `source_crop_x` number, required
  - `source_crop_y` number, required
  - `source_crop_width` number, required
  - `source_crop_height` number, required
  - `canvas_x` number, required
  - `canvas_y` number, required
  - `canvas_width` number, required
  - `canvas_height` number, required
  - `fit_mode` 'contain' | 'cover' | 'stretch', required
  - `mask_shape` 'none' | 'rounded' | 'circle', required
  - `mask_radius` number, required
  - `sync_group_id` string, uuid, nullable, required
  - `planner_mode` '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
  - `planner_metadata` object, required
    - `templateKey` string, nullable, required
    - `notes` string[], required
    - `analysisStatus` 'missing' | 'pending' | 'processing' | 'completed' | 'failed', required
    - `analysisVersion` number, nullable, required
    - `confidence` number, nullable, required
    - `fallbackReason` string, nullable, required
    - `repairApplied` boolean
    - `dominantSpeakerSide` 'left' | 'right', nullable, required
    - `speakerCount` number, required
    - `stylePolicy` object, nullable
      - `schemaVersion` number, required
      - `styleId` 'auto_default' | 'product_demo' | 'letterbox' | 'speaker_focus' | 'speaker_split' | 'speaker_grid' | 'webinar' | 'gameplay' | 'tutorial', required
      - `requestedContentTypeHint` 'auto' | 'podcast' | 'tutorial' | 'demo' | 'generic', required
      - `requestedLayoutStrategy` 'auto' | 'demo' | 'letterbox' | 'split' | 'focus' | 'speaker_grid' | 'webinar' | 'webinar_stack' | 'gameplay', required
      - `fillPosture` 'fill_portrait' | 'preserve_screen' | 'preserve_full_source', required
      - `fallbackPosture` 'repair_then_safe_layout' | 'preserve_screen' | 'preserve_full_source', required
      - `safetyProfile` 'speaker_subject' | 'demo_subject' | 'screen_safe' | 'full_source', required
      - `targetPriority` 'speaker' | 'demo_object' | 'screen' | 'full_source', required
      - `allowedLayouts` string[], required
    - `decisionTrace` object, nullable
      - `schemaVersion` number, required
      - `styleId` 'auto_default' | 'product_demo' | 'letterbox' | 'speaker_focus' | 'speaker_split' | 'speaker_grid' | 'webinar' | 'gameplay' | 'tutorial', required
      - `segmentKey` string, required
      - `candidateLayouts` string[], required
      - `records` object[], required
        - `stage` 'style' | 'window' | 'model_crop' | 'speaker_aware' | 'density' | 'view_build' | 'safety' | 'metadata', required
        - `action` string, required
        - `layoutKey` '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
        - `fallbackReason` string, nullable, required
        - `reason` string, required
        - `metrics` object, required

## Response `200`

Successful response

- object
  - `success` boolean, required
  - `txid` number, required
  - `base_revision` number, required
  - `revision` number, required
  - `media_view` object, required
    - `timeline_item_id` string, required
    - `source_asset_id` string, required
    - `source_start_units` string, nullable, required
    - `source_end_units` string, nullable, required
    - `source_crop_x` number, required
    - `source_crop_y` number, required
    - `source_crop_width` number, required
    - `source_crop_height` number, required
    - `canvas_x` number, required
    - `canvas_y` number, required
    - `canvas_width` number, required
    - `canvas_height` number, required
    - `fit_mode` 'contain' | 'cover' | 'stretch', required
    - `mask_shape` 'none' | 'rounded' | 'circle', required
    - `mask_radius` number, required
    - `sync_group_id` string, nullable, required
    - `planner_mode` '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
    - `planner_metadata` object, required
      - `templateKey` string, nullable, required
      - `notes` string[], required
      - `analysisStatus` 'missing' | 'pending' | 'processing' | 'completed' | 'failed', required
      - `analysisVersion` number, nullable, required
      - `confidence` number, nullable, required
      - `fallbackReason` string, nullable, required
      - `repairApplied` boolean, required
      - `dominantSpeakerSide` 'left' | 'right', nullable, required
      - `speakerCount` number, required
      - `stylePolicy` object, nullable, required
        - `schemaVersion` number, required
        - `styleId` 'auto_default' | 'product_demo' | 'letterbox' | 'speaker_focus' | 'speaker_split' | 'speaker_grid' | 'webinar' | 'gameplay' | 'tutorial', required
        - `requestedContentTypeHint` 'auto' | 'podcast' | 'tutorial' | 'demo' | 'generic', required
        - `requestedLayoutStrategy` 'auto' | 'demo' | 'letterbox' | 'split' | 'focus' | 'speaker_grid' | 'webinar' | 'webinar_stack' | 'gameplay', required
        - `fillPosture` 'fill_portrait' | 'preserve_screen' | 'preserve_full_source', required
        - `fallbackPosture` 'repair_then_safe_layout' | 'preserve_screen' | 'preserve_full_source', required
        - `safetyProfile` 'speaker_subject' | 'demo_subject' | 'screen_safe' | 'full_source', required
        - `targetPriority` 'speaker' | 'demo_object' | 'screen' | 'full_source', required
        - `allowedLayouts` string[], required
      - `decisionTrace` object, nullable, required
        - `schemaVersion` number, required
        - `styleId` 'auto_default' | 'product_demo' | 'letterbox' | 'speaker_focus' | 'speaker_split' | 'speaker_grid' | 'webinar' | 'gameplay' | 'tutorial', required
        - `segmentKey` string, required
        - `candidateLayouts` string[], required
        - `records` object[], required
          - `stage` 'style' | 'window' | 'model_crop' | 'speaker_aware' | 'density' | 'view_build' | 'safety' | 'metadata', required
          - `action` string, required
          - `layoutKey` '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
          - `fallbackReason` string, nullable, required
          - `reason` string, required
          - `metrics` object, 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)
