Update a streamer project
update_streamer_projectPATCH/v1/projects/{projectId}/streamerBeta
Changes the name, the headline, the captions, the framing or the vocabulary of a streamer project.
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
Only the fields you send change. The changes are used by the next build, which is charged; a change saved while a build waits in the queue is read by that build. The clip and its language cannot be changed: sending them is refused, and to use another clip you create another project.
Example use
An editor changes the headline and turns on face framing for a streamer project, then calls build_streamer_video (POST /v1/projects/{projectId}/streamer/build) again to get the new version.
Endpoint
PATCH https://api.gpt-video.com/v1/projects/{projectId}/streamer- Scope
clips:write. - Rate limit 60 requests a minute for each key and 120 for each account, shared by every
writecall. See rate limits. - No
Idempotency-Key.
Parameters
Path
| Name | Type | Required | Description |
|---|---|---|---|
projectId | string | Required | The 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.
| Name | Type | Required | Description |
|---|---|---|---|
title | string | Optional | The new name of the project. From 1 to 120 characters. Matches \S. |
headline | string | Optional | The line shown over the clip, up to 120 characters; "" removes it. At most 120 characters. |
captionStyle | string | Optional | The caption style. get_setting_options (GET /v1/reference/setting-options) lists every style with what it looks like. One of bold-karaoke, word-pop, boxed, outline. |
reframe | string | Optional | How the video follows the speaker: face follows the face, center keeps the middle of the frame. One of face, center. |
vocabulary | string or null | Optional | Names, brands and jargon the transcription should spell right, separated by commas. 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
Change the headline and keep the middle of the frame.
curl -X PATCH "https://api.gpt-video.com/v1/projects/prj_b9eb66e5ba20c4464f36/streamer" \
-H "Authorization: Bearer $GPT_VIDEO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"headline": "One minute, one demo",
"reframe": "center"
}'const res = await fetch("https://api.gpt-video.com/v1/projects/prj_b9eb66e5ba20c4464f36/streamer", {
method: "PATCH",
headers: {
"Authorization": `Bearer ${process.env.GPT_VIDEO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"headline": "One minute, one demo",
"reframe": "center"
}),
});
const data = await res.json();
console.log(data);import os
import requests
r = requests.patch(
"https://api.gpt-video.com/v1/projects/prj_b9eb66e5ba20c4464f36/streamer",
headers={
"Authorization": f"Bearer {os.environ['GPT_VIDEO_API_KEY']}",
},
json={
"headline": "One minute, one demo",
"reframe": "center"
},
)
data = r.json()
print(data){
"method": "tools/call",
"params": {
"name": "update_streamer_project",
"arguments": {
"projectId": "prj_b9eb66e5ba20c4464f36",
"headline": "One minute, one demo",
"reframe": "center"
}
}
}Response
A successful call answers HTTP 200. Returns a Project object in project.
Fields to check
| Name | Type | Description |
|---|---|---|
project.id | string | The project id. It starts with prj_. |
project.status | string | draft has not been analyzed yet, processing is being analyzed, ready has clips, failed means the last analysis failed and errorMessage says why. |
Response example
{
"project": {
"id": "prj_b9eb66e5ba20c4464f36",
"kind": "streamer",
"title": "The demo in one minute",
"status": "ready",
"sourceAssetId": "ast_8e21b0d94c6f4a17b358",
"compositionId": "cmp_372b3304ae7cd6327fed",
"settings": null,
"missingSettings": [],
"errorMessage": null,
"splitScreen": null,
"streamer": {
"sourceAssetId": "ast_8e21b0d94c6f4a17b358",
"headline": "One minute, one demo",
"language": "en",
"captionStyle": "word-pop",
"reframe": "center",
"vocabulary": null
},
"redditStory": null,
"fakeText": null,
"vibeEdit": null,
"createdAt": "2026-08-31T21:50:00.000Z",
"updatedAt": "2026-09-01T11:05:00.000Z"
}
}All response fields
| Name | Type | Required | Description |
|---|---|---|---|
project | Project object | Required | Described in Project object. |
More examples
A project of another kind
PATCH /v1/projects/prj_7c2e9a4f1b3d4e8096a5/streamer
{
"headline": "One minute, one demo"
}{
"error": {
"code": "CONFLICT",
"message": "This project is not a streamer project. Use the operations of its kind, or analyze_project for an Auto Clip project.",
"requestId": "req_3d8a1f6c0e4b27d95a1c6e83"
}
}Errors
| Code | Status | When | What to do |
|---|---|---|---|
NOT_FOUND | 404 | See the error reference. | Change the request, then send it again. |
CONFLICT | 409 | A project of another kind | 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. The next build is charged when you call build_streamer_video (POST /v1/projects/{projectId}/streamer/build).
Related operations
create_streamer_project(POST /v1/projects/streamer) Create a streamer projectbuild_streamer_video(POST /v1/projects/{projectId}/streamer/build) Build a streamer videoget_project(GET /v1/projects/{projectId}) Get a project
Questions
Why is sourceAssetId refused here?
The clip of a streamer project is chosen when it is created and never changes, because the price depends on it. Create another project to use another clip.
When do my changes show in the video?
At the next build. build_streamer_video (POST /v1/projects/{projectId}/streamer/build) makes the video again with the settings saved at the moment the build starts.