> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.videogen.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.videogen.io/_mcp/server.

# List remix actions for a project

GET https://api.videogen.io/v1/projects/{projectId}/remix-actions

Returns remix actions applied to a project (via `POST /v1/projects/{projectId}/remix` or as a post-workflow step), most recent first, with each action's status and progress. Cursor-paginated; see the [Pagination](/pagination) guide.

Reference: https://docs.videogen.io/rest-api-reference/projects/list-project-remix-actions

## Authentication

- `Authorization` header (bearer token, required) — API key from [app.videogen.io/api](https://app.videogen.io/api). The full key is only shown once when you create it.

## Request

### Path parameters

- `projectId` (string, required) — The project id (e.g. `vg_proj_...`).

### Query parameters

- `limit` (integer, optional, default: 50) — Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).
- `cursor` (string, optional) — Opaque pagination cursor returned as `nextCursor` by the previous page. Omit on the first request. Cursors are tied to the endpoint that produced them and must be passed unmodified. See [Pagination](/pagination).

## Response

### 200

Remix actions for the project.

- `remixActions` (list of RemixActionRun, required) — Remix actions for the project, most recent first.
- `hasMore` (boolean, required) — When true, there are more remix actions available. Pass `nextCursor` as the `cursor` query param to fetch the next page.
- `nextCursor` (string, required, nullable) — Opaque cursor to fetch the next page. `null` when `hasMore` is false.

## Types

### RemixActionRun

- `remixActionId` (string, required) — Opaque remix action id (e.g. `vg_rmix_...`).
- `type` (enum, required) — The kind of edit a remix action applies.
  - Allowed values: `SET_BACKGROUND_MUSIC`, `SET_LOGO`, `ENABLE_CAPTIONS`, `DISABLE_CAPTIONS`, `ADD_TRANSITIONS`, `ADD_ZOOM`, `RESIZE_PROJECT`, `CLEAN_UP_TRANSCRIPT`, `CONVERT_IMAGES_TO_VIDEOS`, `REGENERATE_IMAGES`, `UPSCALE_ASSETS`, `CHANGE_NARRATOR`, `SHUFFLE_STOCK_VISUALS`, `GENERATE_MUSIC`, `TRANSLATE_PROJECT`
- `status` (enum, required) — Lifecycle status shared by every asynchronous job (tool executions, workflow runs, remix actions, project exports, and timeline interchange jobs). `pending` and `running` are in-progress; `succeeded`, `failed`, and `cancelled` are terminal.
  - Allowed values: `pending`, `running`, `succeeded`, `failed`, `cancelled`
- `projectId` (string, required) — Id of the project this remix action edits (e.g. `vg_proj_...`).
- `projectUrl` (string, 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.
- `progressPercentage` (double, required) — Completion progress for the current attempt (0-100). Always `100` when `status` is `succeeded`.
- `attemptIndex` (integer, required) — Zero-based index of the current or most recent execution attempt.
- `error` (ApiError, required, nullable) — Error details. Always present as a field; `null` unless `status` is `failed`.

### ApiError

Standard error body returned with every non-2xx response (the `default` response of every operation). The HTTP status code conveys the error class; this body carries the details: - `400` invalid request, `401` missing or invalid API key, `403` not permitted (e.g. plan or add-on required, see `requirement`), `404` not found, `409` conflict, `429` rate limited or out of credits, `5xx` server error. Common `code` values include `invalid_request`, `invalid_api_key`, `not_authorized`, `not_found`, `insufficient_credits`, and `rate_limited`. Always branch on `code` (and `requirement.type` when present) rather than parsing `message`.

- `message` (string, required) — Human-readable error description. For display and logging only; do not branch on its exact text.
- `code` (string, optional, nullable) — Machine-readable error code in snake_case (e.g. `invalid_api_key`, `insufficient_credits`). `null` when no specific code applies.
- `requirement` (ErrorRequirement, optional, nullable) — What is needed to resolve the error. Present when the error can be fixed by fulfilling a specific requirement (e.g. purchasing an add-on); `null` otherwise.
- `internalErrorCode` (string, optional, nullable) — Opaque internal error code for debugging. Include this when contacting support. `null` when not applicable.

### ErrorRequirement

What is needed to resolve an error, when it can be fixed by fulfilling a specific requirement (e.g. purchasing an add-on or upgrading the plan).

- `type` (string, required) — Machine-readable requirement type in snake_case (e.g. `purchase_add_on`, `upgrade_plan`).
- `details` (map from string to string, optional) — Key-value pairs with requirement-specific context (e.g. the add-on id to purchase).

## Examples

**Response**

```json
{
  "remixActions": [
    {
      "remixActionId": "string",
      "type": "SET_BACKGROUND_MUSIC",
      "status": "pending",
      "projectId": "string",
      "projectUrl": "string",
      "progressPercentage": 1.1,
      "attemptIndex": 1,
      "error": {
        "message": "string",
        "code": "string",
        "requirement": {
          "type": "string",
          "details": {}
        },
        "internalErrorCode": "string"
      }
    }
  ],
  "hasMore": true,
  "nextCursor": "string"
}
```

**SDK Code**

```python
import requests

url = "https://api.videogen.io/v1/projects/projectId/remix-actions"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```