---
title: "Update a fake text project | GPT-Video API reference"
description: "Changes the name, look, language, voices setting or background of a fake text project, leaving every field you do not send as it was."
url: "https://www.gpt-video.com/developers/api/update-fake-text-project"
operation: "update_fake_text_project"
method: "PATCH"
path: "/v1/projects/{projectId}/fake-text"
scope: "clips:write"
---

Do not assume endpoints have parameters other than the ones explicitly specified.

# Update a fake text project

Operation id `update_fake_text_project`. Request `PATCH /v1/projects/{projectId}/fake-text`.

Changes the name, look, language, voices setting or background of a fake text project, 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 change a choice made at creation. Only the fields you send change, and the video of the project is rebuilt with them. The look of the chat is written to the project and to its story. Changing the language keeps the words of the story and gives the default voice of the new language to each side whose voice is of the other language. Send backgroundAssetId null to remove the background.

## Example use

An agency that tested the WhatsApp look on a story switches the project to iMessage and a new background video, then exports again with create_export (`POST /v1/compositions/{compositionId}/exports`).

## Endpoint

```text
PATCH https://api.gpt-video.com/v1/projects/{projectId}/fake-text
```

- 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](/developers/rate-limits.md).
- 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`. |
| `theme` | string | Optional | How the chat looks: imessage or whatsapp. One of `imessage`, `whatsapp`. |
| `language` | string | Optional | The language of the story and of its voices: en or it. One of `en`, `it`. |
| `voiceover` | boolean | Optional | true to give each line a voice when you call create_fake_text_voices (`POST /v1/projects/{projectId}/story/voices`); false for a silent chat. |
| `backgroundAssetId` | string or null | Optional | The video shown behind the chat: the asset id of a video you uploaded or imported. null for no background. Matches `^ast_n?[0-9a-f]{20}$`. |

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

## Request

Show the chat as WhatsApp.

```bash title="curl"
curl -X PATCH "https://api.gpt-video.com/v1/projects/prj_ba8b07a88bfb14585459/fake-text" \
  -H "Authorization: Bearer $GPT_VIDEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "theme": "whatsapp"
  }'
```

```ts title="TypeScript"
const res = await fetch("https://api.gpt-video.com/v1/projects/prj_ba8b07a88bfb14585459/fake-text", {
  method: "PATCH",
  headers: {
    "Authorization": `Bearer ${process.env.GPT_VIDEO_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "theme": "whatsapp"
  }),
});
const data = await res.json();
console.log(data);
```

```python title="Python"
import os

import requests

r = requests.patch(
    "https://api.gpt-video.com/v1/projects/prj_ba8b07a88bfb14585459/fake-text",
    headers={
        "Authorization": f"Bearer {os.environ['GPT_VIDEO_API_KEY']}",
    },
    json={
        "theme": "whatsapp"
    },
)
data = r.json()
print(data)
```

```json title="MCP (Full)"
{
  "method": "tools/call",
  "params": {
    "name": "update_fake_text_project",
    "arguments": {
      "projectId": "prj_ba8b07a88bfb14585459",
      "theme": "whatsapp"
    }
  }
}
```

## Response

A successful call answers HTTP 200. Returns a [Project object](/developers/objects.md#project) 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

```json title="HTTP 200"
{
  "project": {
    "id": "prj_ba8b07a88bfb14585459",
    "kind": "faketext",
    "title": "The surprise party",
    "status": "ready",
    "sourceAssetId": null,
    "compositionId": "cmp_47e9069a7ece7041f213",
    "settings": null,
    "missingSettings": [],
    "splitScreen": null,
    "streamer": null,
    "redditStory": null,
    "fakeText": {
      "theme": "whatsapp",
      "language": "en",
      "voiceover": true,
      "backgroundAssetId": "ast_8ac5d8b97546145cdbf6",
      "storyId": "cnv_a744d5ef6cc005e19285"
    },
    "vibeEdit": null,
    "errorMessage": null,
    "createdAt": "2026-08-31T22:10:00.000Z",
    "updatedAt": "2026-09-01T11:05:00.000Z"
  }
}
```

**All response fields**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `project` | Project object | Required | Described in [Project object](/developers/objects.md#project). |

**More examples**

#### Remove the background

`PATCH /v1/projects/prj_ba8b07a88bfb14585459/fake-text`

```json title="Request body"
{
  "backgroundAssetId": null
}
```

```json title="HTTP 200"
{
  "project": {
    "id": "prj_ba8b07a88bfb14585459",
    "kind": "faketext",
    "title": "The surprise party",
    "status": "ready",
    "sourceAssetId": null,
    "compositionId": "cmp_47e9069a7ece7041f213",
    "settings": null,
    "missingSettings": [],
    "splitScreen": null,
    "streamer": null,
    "redditStory": null,
    "fakeText": {
      "theme": "imessage",
      "language": "en",
      "voiceover": true,
      "backgroundAssetId": null,
      "storyId": "cnv_a744d5ef6cc005e19285"
    },
    "vibeEdit": null,
    "errorMessage": null,
    "createdAt": "2026-08-31T22:10:00.000Z",
    "updatedAt": "2026-09-01T11:05:00.000Z"
  }
}
```

#### A project that is not a fake text project

`PATCH /v1/projects/prj_7c2e9a4f1b3d4e8096a5/fake-text`

```json title="Request body"
{
  "theme": "whatsapp"
}
```

```json title="HTTP 409"
{
  "error": {
    "code": "CONFLICT",
    "message": "This project is not a fake text project. Stories exist only in fake text projects.",
    "requestId": "req_8c3f1a6e2d0b47959e4a1c7b"
  }
}
```

#### A project that does not exist

`PATCH /v1/projects/prj_9f0d3b7e1c5a4d28b6f3/fake-text`

```json title="Request body"
{
  "theme": "whatsapp"
}
```

```json title="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_4b9d2e7a1c6f40388d5b2e1a"
  }
}
```

## Errors

| Code | Status | When | What to do |
| --- | --- | --- | --- |
| [`NOT_FOUND`](/developers/errors.md#NOT_FOUND) | 404 | A project that does not exist | Change the request, then send it again. |
| [`CONFLICT`](/developers/errors.md#CONFLICT) | 409 | A project that is not a fake text project | Read the resource again, then decide. Do not send the same request again. |

Every call can also answer these errors. [`VALIDATION_FAILED`](/developers/errors.md#VALIDATION_FAILED), [`UNKNOWN_PARAMETER`](/developers/errors.md#UNKNOWN_PARAMETER), [`UNAUTHORIZED`](/developers/errors.md#UNAUTHORIZED), [`SCOPE_MISSING`](/developers/errors.md#SCOPE_MISSING), [`PAYLOAD_TOO_LARGE`](/developers/errors.md#PAYLOAD_TOO_LARGE), [`RATE_LIMITED`](/developers/errors.md#RATE_LIMITED), [`INTERNAL`](/developers/errors.md#INTERNAL), [`UNAVAILABLE`](/developers/errors.md#UNAVAILABLE).

## Cost

No credits are used.

## Related operations

- [`create_fake_text_project`](/developers/api/create-fake-text-project.md) (`POST /v1/projects/fake-text`) Create a fake text project
- [`get_fake_text_story`](/developers/api/get-fake-text-story.md) (`GET /v1/projects/{projectId}/story`) Get the story of a fake text project
- [`get_project`](/developers/api/get-project.md) (`GET /v1/projects/{projectId}`) Get a project

## Questions

### What happens to the voices when I change the language?

A side whose voice is of the other language goes back to the default voice of the new language. The lines keep their old voices until create_fake_text_voices (`POST /v1/projects/{projectId}/story/voices`) makes new ones.

### Does turning voiceover off delete the voices?

No. The video stops playing them, and they come back if you turn voiceover on again.
