---
title: "Apply remix actions to a project"
method: POST
path: "/v1/projects/{projectId}/remix"
tags: ["Projects"]
---

# Apply remix actions to a project

`POST /v1/projects/{projectId}/remix`

Applies an ordered list of edits (background music, logo overlay, caption visibility/style) to a project. Each action runs asynchronously as its own remix action; the response returns one remix action id per action in order. Set `saveAsNewProject` to apply the edits to a copy and leave the original untouched. Poll `GET /v1/projects/{projectId}/remix-actions` for status.

## Path parameters

- `projectId` string, required

## Request body

- RemixProjectRequest
  - `remixActions` RemixAction[], required — Ordered list of edits to apply. Each runs asynchronously as its own remix action. Must contain at least one action.
    - union — A single edit applied to a project. Each array entry is exactly one of the action types below, chosen by its `type` field; the variants are mutually-exclusive options, not fields you must all provide. Include only the actions you want.
      - RemixActionSetBackgroundMusic — Set, replace, or remove the project's background music track.
        - `type` 'SET_BACKGROUND_MUSIC', required
        - `fileId` string, nullable — File id of an uploaded audio file to use as background music (e.g. `vg_file_...`). Upload it first via `POST /v1/files/upload`. Pass `null` to remove the existing background music.
        - `volume` number, nullable — Music volume from 0 (silent) to 1 (full). Omit or pass `null` to keep the current volume.
      - RemixActionSetLogo — Set, replace, or remove the logo overlay.
        - `type` 'SET_LOGO', required
        - `fileId` string, nullable — File id of an uploaded image to overlay as a logo (e.g. `vg_file_...`). Upload it first via `POST /v1/files/upload`. Pass `null` to remove the existing logo.
        - `position` 'TOP_LEFT' | 'TOP_CENTER' | 'TOP_RIGHT' | 'BOTTOM_LEFT' | 'BOTTOM_CENTER' | 'BOTTOM_RIGHT' | 'null', nullable — Position the logo is anchored to. Omit or pass `null` to keep the current position.
        - `sizePercent` number, nullable — Logo width as a percentage of the video width. Omit or pass `null` to keep the current size.
      - RemixActionEnableCaptions — Show captions on every captionable section. Optionally override the project caption style.
        - `type` 'ENABLE_CAPTIONS', required
        - `captionStyle` WorkflowCaptionStyle — Caption styling. Any omitted field falls back to the VideoGen default caption style. Provide an empty object (`{}`) to keep the default style but ensure captions are shown. Pass `null` for the whole `captionStyle` field to hide captions entirely.
          - `fontName` string — Font family name.
          - `fontSize` number — Font size in pixels at 1080p. Must be greater than 0.
          - `fontWeight` 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 — Numeric font weight (400 = regular, 700 = bold).
          - `textColor` WorkflowRgbColor — An RGB color. Each channel is an integer from 0 to 255.
            - `red` integer, required
            - `green` integer, required
            - `blue` integer, required
          - `textJustification` 'LEFT' | 'CENTER' | 'RIGHT'
          - `verticalAlignment` 'TOP' | 'MIDDLE' | 'BOTTOM' — Vertical position of the caption block in the frame.
          - `strokeColor` WorkflowRgbColor — An RGB color. Each channel is an integer from 0 to 255.
            - `red` integer, required
            - `green` integer, required
            - `blue` integer, required
          - `strokeWeight` number — Outline thickness in pixels. 0 disables the outline.
          - `backgroundStyle` WorkflowCaptionBackgroundStyle — Background drawn behind caption text.
            - `type` 'RECT' | 'WRAPPED' | 'WORD_BY_WORD', required — RECT draws one rectangle behind the whole line; WRAPPED hugs the text; WORD_BY_WORD draws a box per word.
            - `backgroundColor` WorkflowRgbColor, required — An RGB color. Each channel is an integer from 0 to 255.
              - …
            - `borderRadiusProportion` number — Corner rounding as a proportion of the background height, between 0 (square corners) and 1 (fully rounded).
            - `opacityProportion` number — Background opacity from 0 (transparent) to 1 (opaque).
          - `spokenTextColor` WorkflowRgbColor — An RGB color. Each channel is an integer from 0 to 255.
            - `red` integer, required
            - `green` integer, required
            - `blue` integer, required
          - `spokenTextStrokeColor` WorkflowRgbColor — An RGB color. Each channel is an integer from 0 to 255.
            - `red` integer, required
            - `green` integer, required
            - `blue` integer, required
          - `persistSpokenTextColor` boolean — When true, a word keeps the spoken-text color after it has been spoken instead of reverting.
      - RemixActionDisableCaptions — Hide captions on every captionable section.
        - `type` 'DISABLE_CAPTIONS', required
      - RemixActionAddTransitions — Stamp transitions across the project. Not per-boundary: each field you set is applied uniformly to every boundary in that scope, replacing any transition already there. Set the transition between sections, between base-layer assets, or both; omit or pass `null` for a scope to leave its transitions untouched.
        - `type` 'ADD_TRANSITIONS', required
        - `sectionTransition` 'DYNAMIC' | 'NONE' | 'FADE' | 'RISE' | 'PAN' | 'POP' | 'WIPE' — A transition applied at a boundary. `DYNAMIC` auto-varies the style across boundaries; `NONE` removes transitions; the rest apply that fixed style everywhere.
        - `assetTransition` 'DYNAMIC' | 'NONE' | 'FADE' | 'RISE' | 'PAN' | 'POP' | 'WIPE' — A transition applied at a boundary. `DYNAMIC` auto-varies the style across boundaries; `NONE` removes transitions; the rest apply that fixed style everywhere.
      - RemixActionAddZoom — Apply a Ken Burns zoom to every eligible still image in the project, including uploaded images. Replaces any existing still-image effect on those assets. If the project has no eligible stills, the action is skipped and completes successfully without changing anything.
        - `type` 'ADD_ZOOM', required
      - RemixActionResizeProject — Change the project's output aspect ratio (e.g. to a vertical 9:16 social format). The video is re-flowed to the new ratio.
        - `type` 'RESIZE_PROJECT', required
        - `aspectRatio` AspectRatio, required — Aspect ratio as a width:height pair (e.g. 16 and 9 for 16:9). Not pixel dimensions.
          - `width` integer, required
          - `height` integer, required
      - RemixActionCleanUpTranscript — Tighten every transcript in the project by removing silent pauses and/or filler words. Useful for polishing narration captured from raw recordings.
        - `type` 'CLEAN_UP_TRANSCRIPT', required
        - `removeFillers` boolean, nullable — Remove filler words ("um", "uh", …). Defaults to `true`.
        - `removePauses` boolean, nullable — Remove silent pauses longer than `minPauseSeconds`. Defaults to `true`.
        - `fillerWords` string[], nullable — Override the filler-word list to remove. Omit or pass `null` to use the built-in defaults.
        - `minPauseSeconds` number, nullable — Shortest pause (in seconds) to remove; pauses below this stay. Omit or pass `null` to use the default threshold.
      - RemixActionConvertImagesToVideos — Animate every eligible still image in the project into a short AI video clip (image-to-video), replacing each image in place. Eligible images are non-SVG image assets backed by an uploaded or stock file. Runs asynchronously: one clip is generated per image. If the project has no eligible images, the action is skipped and completes successfully without changing anything (for example, a project whose timeline is already all video clips).
        - `type` 'CONVERT_IMAGES_TO_VIDEOS', required
        - `motionPrompt` string, nullable — Describe the motion to apply to every image (e.g. "slow cinematic push-in"). Omit or pass `null` for automatic motion.
        - `muteOutputVideos` boolean, nullable — Mute the generated clips and suppress generated background music. Recommended when the clips sit behind a voiceover. Defaults to `true`.
        - `quality` 'LOW' | 'STANDARD' | 'HIGH' | 'MAX' — AI generation quality tier, shared across every generative feature (image, video, text, and so on). `LOW` is fastest and cheapest, `STANDARD` balances quality and cost, `HIGH` is higher quality, and `MAX` is the highest quality. When a request omits the quality field, VideoGen falls back to your account's **Default AI quality** for that feature, which you can change at [Account settings](https://app.videogen.io/settings/account). Not every feature supports every tier; unsupported tiers are rejected with an error (see each field's description).
      - RemixActionRegenerateImages — Restyle every eligible still image in the project to a new look (image-to-image), replacing each image in place. Eligible images are non-SVG image assets backed by an uploaded or generated file. Runs asynchronously: one restyled image is generated per eligible image. If the project has no eligible images, the action is skipped and completes successfully without changing anything.
        - `type` 'REGENERATE_IMAGES', required
        - `stylePrompt` string, required — Describe the visual style to apply to every image (e.g. "watercolor painting", "cinematic film still").
        - `quality` 'LOW' | 'STANDARD' | 'HIGH' | 'MAX' — AI generation quality tier, shared across every generative feature (image, video, text, and so on). `LOW` is fastest and cheapest, `STANDARD` balances quality and cost, `HIGH` is higher quality, and `MAX` is the highest quality. When a request omits the quality field, VideoGen falls back to your account's **Default AI quality** for that feature, which you can change at [Account settings](https://app.videogen.io/settings/account). Not every feature supports every tier; unsupported tiers are rejected with an error (see each field's description).
      - RemixActionUpscaleAssets — Sharpen every eligible asset in the project up to 4K, replacing each in place. Runs asynchronously: one upscaled asset is generated per eligible asset. If the project has no eligible assets, the action is skipped and completes successfully without changing anything.
        - `type` 'UPSCALE_ASSETS', required
        - `includeVideos` boolean, nullable — Also upscale video assets (billed per output second). Defaults to `true`.
        - `includeStockContent` boolean, nullable — Also upscale stock (library) assets, not just uploaded or generated ones. Defaults to `true`.
      - RemixActionChangeNarrator — Re-narrate every AI-voiceover asset in the project with a new voice and optional actor avatar, replacing each narration in place. Runs asynchronously: text-to-speech is re-fired per asset with the original narration text. If the project has no AI-narrated assets, the action is skipped and completes successfully without changing anything.
        - `type` 'CHANGE_NARRATOR', required
        - `voiceId` string, required — Catalog `displayName` (e.g. `Matilda`) or voice id from `GET /v1/resources/tts-voices` (e.g. `vg_voic_...`) to re-narrate with.
        - `actorEntityId` string, nullable — Recommended. Optional id of a built-in stock actor or an ACTOR entity (e.g. `vg_enti_...`) with an image reference. When set, narration is delivered by that actor avatar. Omit or pass `null` for voiceover without an avatar.
        - `avatarQuality` 'LOW' | 'STANDARD' | 'HIGH' | 'MAX' — AI generation quality tier, shared across every generative feature (image, video, text, and so on). `LOW` is fastest and cheapest, `STANDARD` balances quality and cost, `HIGH` is higher quality, and `MAX` is the highest quality. When a request omits the quality field, VideoGen falls back to your account's **Default AI quality** for that feature, which you can change at [Account settings](https://app.videogen.io/settings/account). Not every feature supports every tier; unsupported tiers are rejected with an error (see each field's description).
        - `voiceSpeed` number, nullable — Speech rate multiplier, between 0.5 (half speed) and 2 (double speed). Omit or pass `null` to keep each asset's current speed.
      - RemixActionShuffleStockVisuals — Replace every stock (library) visual in the project with a fresh alternative from the same search, replacing each in place. Runs asynchronously: each stock asset's original search is re-run, excluding the currently-shown result. If the project has no shuffleable stock visuals, the action is skipped and completes successfully without changing anything.
        - `type` 'SHUFFLE_STOCK_VISUALS', required
      - RemixActionGenerateMusic — Generate a background music track from a text prompt and set it as the project's background music, replacing any existing track. Runs asynchronously.
        - `type` 'GENERATE_MUSIC', required
        - `prompt` string, required — Describe the music to generate (e.g. "upbeat corporate background music with a driving beat").
      - RemixActionTranslateProject — Translate the whole project into another language: every piece of text (title, section names, on-screen text overlays, transcripts, and narration scripts) is translated, and — unless disabled — each AI voiceover is re-narrated in the new language. Runs asynchronously. Requires a Pro subscription. Retrieve the list of supported language codes from `GET /v1/resources/languages`.
        - `type` 'TRANSLATE_PROJECT', required
        - `languageCode` string, required — Target language code to translate the project into (e.g. `es`, `fr`, `ja`). Must be one of the codes returned by `GET /v1/resources/languages`.
        - `changeVoice` boolean, nullable — Swap each AI voiceover to a voice that natively matches the target language. Recommended, since keeping the original voice usually produces a foreign accent. Defaults to `true`.
        - `translateImageText` boolean, nullable — Also re-generate every eligible image so that text baked into the image is translated too (image-to-image). Billed per generated image. Defaults to `false`.
  - `saveAsNewProject` boolean — When true, the project is duplicated first and the edits are applied to the copy, leaving the original untouched. The response's `projectId` is the copy. Defaults to false (edits the project in place).

## Response `202`

Remix actions accepted.

- RemixProjectResponse — Returned when remix actions are accepted. Poll `GET /v1/projects/{projectId}/remix-actions` for status.
  - `projectId` string, required — Id of the edited project (e.g. `vg_proj_...`; the duplicate when `saveAsNewProject` was true).
  - `projectUrl` string, uri, required — Deep link to open this project in the VideoGen web editor. Not required for an API-only integration: store `projectId` and use the Projects API (export, remix, metadata). Use `projectUrl` when a person should open the project in the app to review or edit it manually. The project is visible only to members of your team and any project collaborators, the same access model as a project created in the dashboard.
  - `remixActionIds` string[], required — Opaque remix action ids (e.g. `vg_rmix_...`), one per requested action in order.

## Other responses

- `default` — Error

---

[API](https://skmtc.dev/videogen/apis/videogen-api.md) · [All operations](https://skmtc.dev/videogen/apis/videogen-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/videogen/videogen-api/revisions/33dda0455d67/schema)
