Skip to content
Create a key

Paste a key to use it in the examples on these pages. The key stays in this browser tab. These pages never send it anywhere.

Update a project

update_projectPATCH/v1/projects/{projectId}Beta

Renames an Auto Clip project or changes its settings, leaving every field you do not send as it was.

Beta. This endpoint is supported and can gain new fields. If a change would break your code, we tell you before it takes effect and list it in the changelog.

About

Use it to choose the settings listed in missingSettings, or to change them before the next analysis. Only the fields you send change. The source video cannot be changed: sending sourceAssetId is refused, and to analyze another video you create another project. Settings changed while an analysis is waiting to start are used by that analysis; the price depends only on the source video.

Example use

A tool shows the missing settings of a project to a person, sends their choices with update_project (PATCH /v1/projects/{projectId}), and reads the project again to see that missingSettings is empty before it calls analyze_project (POST /v1/projects/{projectId}/analyze).

Endpoint

Code
PATCH https://api.gpt-video.com/v1/projects/{projectId}
  • Scope clips:write.
  • Rate limit 60 requests a minute for each key and 120 for each account, shared by every write call. See rate limits.
  • No Idempotency-Key.

Parameters

Path

NameTypeRequiredDescription
projectIdstringRequiredThe project id. It starts with prj_. Matches ^prj_[0-9a-f]{20}$.

Body

The body is optional. Send only the fields you want to change.

NameTypeRequiredDescription
titlestringOptionalThe new name of the project. From 1 to 120 characters. Matches \S.
settingsobjectOptionalAuto Clip settings. A field you leave out is left as it is, and every one can be set later with update_project (PATCH /v1/projects/{projectId}).
settings.languagestringOptionalThe language spoken in the video: en, it, or auto to detect it. One of auto, it, en.
settings.clipCountintegerOptionalHow many clips the analysis proposes. From 1 to 100. From 1 to 100.
settings.minDurationSecnumberOptionalThe shortest clip the analysis may propose, in seconds. From 5 to 180, and not longer than maxDurationSec when the analysis starts. From 5 to 180.
settings.maxDurationSecnumberOptionalThe longest clip the analysis may propose, in seconds. From 10 to 300. From 10 to 300.
settings.objectivestringOptionalWhat the clips should be good at. get_setting_options (GET /v1/reference/setting-options) lists every objective with what it means. One of viral, educational, entertaining, emotional, controversial, howto, business.
settings.captionStylestringOptionalThe caption style of the clips. get_setting_options (GET /v1/reference/setting-options) lists every style with what it looks like. One of bold-karaoke, word-pop, boxed, outline.
settings.reframestringOptionalHow a clip follows the speaker: face follows the face of the speaker, center keeps the middle of the frame. One of face, center.
settings.instructionsstring or nullOptionalFree text that tells the analysis what to look for, such as only the moments where a given person speaks. At most 2000 characters; null removes them. At most 2000 characters.
settings.vocabularystring or nullOptionalNames, brands and jargon the transcription should spell right, separated by commas. It is used when the video is transcribed, so set it before the first analysis. At most 311 characters; null removes it. At most 311 characters.

Send only the fields listed here. Any other field is refused with UNKNOWN_PARAMETER.

Request

Choose the settings a draft is missing.

Request example
curl -X PATCH "https://api.gpt-video.com/v1/projects/prj_1d8b6e0c47a24f93b1c2" \
  -H "Authorization: Bearer $GPT_VIDEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "settings": {
      "language": "en",
      "minDurationSec": 20,
      "maxDurationSec": 45,
      "captionStyle": "bold-karaoke",
      "reframe": "face"
    }
  }'
const res = await fetch("https://api.gpt-video.com/v1/projects/prj_1d8b6e0c47a24f93b1c2", {
  method: "PATCH",
  headers: {
    "Authorization": `Bearer ${process.env.GPT_VIDEO_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "settings": {
      "language": "en",
      "minDurationSec": 20,
      "maxDurationSec": 45,
      "captionStyle": "bold-karaoke",
      "reframe": "face"
    }
  }),
});
const data = await res.json();
console.log(data);
import os

import requests

r = requests.patch(
    "https://api.gpt-video.com/v1/projects/prj_1d8b6e0c47a24f93b1c2",
    headers={
        "Authorization": f"Bearer {os.environ['GPT_VIDEO_API_KEY']}",
    },
    json={
        "settings": {
            "language": "en",
            "minDurationSec": 20,
            "maxDurationSec": 45,
            "captionStyle": "bold-karaoke",
            "reframe": "face"
        }
    },
)
data = r.json()
print(data)
{
  "method": "tools/call",
  "params": {
    "name": "update_project",
    "arguments": {
      "projectId": "prj_1d8b6e0c47a24f93b1c2",
      "settings": {
        "language": "en",
        "minDurationSec": 20,
        "maxDurationSec": 45,
        "captionStyle": "bold-karaoke",
        "reframe": "face"
      }
    }
  }
}

Response

A successful call answers HTTP 200. Returns a Project object in project.

Fields to check

NameTypeDescription
project.idstringThe project id. It starts with prj_.
project.statusstringdraft has not been analyzed yet, processing is being analyzed, ready has clips, failed means the last analysis failed and errorMessage says why.

Response example

HTTP 200
{
  "project": {
    "id": "prj_1d8b6e0c47a24f93b1c2",
    "kind": "autoclip",
    "title": "Weekly podcast",
    "status": "draft",
    "sourceAssetId": null,
    "compositionId": null,
    "settings": {
      "language": "en",
      "clipCount": 5,
      "minDurationSec": 20,
      "maxDurationSec": 45,
      "objective": "educational",
      "captionStyle": "bold-karaoke",
      "reframe": "face",
      "instructions": null,
      "vocabulary": null
    },
    "missingSettings": [],
    "splitScreen": null,
    "streamer": null,
    "redditStory": null,
    "fakeText": null,
    "vibeEdit": null,
    "errorMessage": null,
    "createdAt": "2026-09-01T09:50:00.000Z",
    "updatedAt": "2026-09-01T11:05:00.000Z"
  }
}
All response fields
NameTypeRequiredDescription
projectProject objectRequiredDescribed in Project object.
More examples

Rename a project and remove its instructions

PATCH /v1/projects/prj_7c2e9a4f1b3d4e8096a5

Request body
{
  "title": "Founder interview, part one",
  "settings": {
    "instructions": null
  }
}
HTTP 200
{
  "project": {
    "id": "prj_7c2e9a4f1b3d4e8096a5",
    "kind": "autoclip",
    "title": "Founder interview, part one",
    "status": "ready",
    "sourceAssetId": "ast_3f9a1c7e5b2d4086a1c4",
    "compositionId": null,
    "settings": {
      "language": "en",
      "clipCount": 3,
      "minDurationSec": 15,
      "maxDurationSec": 60,
      "objective": "viral",
      "captionStyle": "word-pop",
      "reframe": "face",
      "instructions": null,
      "vocabulary": null
    },
    "missingSettings": [],
    "splitScreen": null,
    "streamer": null,
    "redditStory": null,
    "fakeText": null,
    "vibeEdit": null,
    "errorMessage": null,
    "createdAt": "2026-09-01T09:10:00.000Z",
    "updatedAt": "2026-09-01T11:05:00.000Z"
  }
}

A project that does not exist

PATCH /v1/projects/prj_9f0d3b7e1c5a4d28b6f3

Request body
{
  "title": "Renamed"
}
HTTP 404
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Project prj_9f0d3b7e1c5a4d28b6f3 not found",
    "hint": "Check the id. An id that belongs to another account is not found either.",
    "requestId": "req_fc830e598aa2f3dfc22a8c1a"
  }
}

Errors

CodeStatusWhenWhat to do
NOT_FOUND404A project that does not existChange the request, then send it again.
CONFLICT409The project is not an Auto Clip project. Other kinds have their own calls, such as update_split_screen_project (PATCH /v1/projects/{projectId}/split-screen), or apply_timeline_operations (POST /v1/projects/{projectId}/timeline/operations) for a Vibe Editing edit.Read the resource again, then decide. Do not send the same request again.

Every call can also answer these errors. VALIDATION_FAILED, UNKNOWN_PARAMETER, UNAUTHORIZED, SCOPE_MISSING, PAYLOAD_TOO_LARGE, RATE_LIMITED, INTERNAL, UNAVAILABLE.

Cost

No credits are used.

Questions

How do I clear a setting?

Send null for instructions or vocabulary to remove them. The other settings cannot be cleared, only changed to another value.

Can I set minDurationSec higher than maxDurationSec?

Yes, for a moment: each change is saved as it comes, so you can raise the minimum before the maximum. analyze_project (POST /v1/projects/{projectId}/analyze) refuses while the minimum is longer than the maximum.

Why is my split screen project refused?

update_project (PATCH /v1/projects/{projectId}) changes Auto Clip projects only. Every other kind has its own operations, such as update_split_screen_project (PATCH /v1/projects/{projectId}/split-screen) for a split screen project or update_streamer_project (PATCH /v1/projects/{projectId}/streamer) for a streamer project.

View as Markdown