{"openapi":"3.1.0","info":{"title":"Endpoints","version":"1.0.0"},"paths":{"/v1/workflows/script-to-video":{"post":{"operationId":"workflows_scriptToVideo","summary":"Script to video","description":"Creates a project and generates a narrated video from a prompt or script. Returns immediately with a workflow run id; poll or subscribe to webhooks for completion.","tags":["workflows"],"responses":{"202":{"description":"Workflow run accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartWorkflowRunResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptToVideoRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/workflows/voiceover-to-video":{"post":{"operationId":"workflows_voiceoverToVideo","summary":"Voiceover to video","description":"Creates a project from an uploaded voiceover file and generates a video with matching b-roll. Upload the voiceover via the files API first.","tags":["workflows"],"responses":{"202":{"description":"Workflow run accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartWorkflowRunResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceoverToVideoRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/workflows/slideshow-to-video":{"post":{"operationId":"workflows_slideshowToVideo","summary":"Slideshow to video","description":"Creates a project from an uploaded PDF or PowerPoint file and generates an AI-narrated video walking through each slide. Upload the file via `POST /v1/files/upload` first.","tags":["workflows"],"responses":{"202":{"description":"Workflow run accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartWorkflowRunResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlideshowToVideoRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/workflows/prompt-to-video-clip":{"post":{"operationId":"workflows_promptToVideoClip","summary":"Prompt to video clip","description":"Creates a project from a text prompt and generates one short AI video clip (up to 30 seconds). VideoGen first generates an opening frame from the prompt (optionally guided by reference images), then animates that frame into a video. Returns immediately with a workflow run id; poll or subscribe to webhooks for completion. For a standalone clip without an editable project, use `POST /v1/tools/generate-video-clip` instead. For longer narrated multi-scene videos, use `POST /v1/workflows/script-to-video`. The generated clip is clamped to the selected quality's supported range.","tags":["workflows"],"responses":{"202":{"description":"Workflow run accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartWorkflowRunResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptToVideoClipRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/workflows/video-to-video":{"post":{"operationId":"workflows_videoToVideo","summary":"Video to video","description":"Creates a project from a video and restyles it from a text prompt. The output keeps the restyled part's length and timing. Pass an uploaded video as `videoFileId`, or a public link as `videoUrl` and the run imports it for you. Up to 120 seconds of the video is restyled per run: choose the part with `trimStartSeconds` and `trimEndSeconds`, or omit them to restyle the first 120 seconds. Returns immediately with a workflow run id; poll or subscribe to webhooks for completion.","tags":["workflows"],"responses":{"202":{"description":"Workflow run accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartWorkflowRunResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoToVideoRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/workflows/runs":{"get":{"operationId":"workflows_listWorkflowRuns","summary":"List workflow runs","description":"List workflow runs started via the API, most recently created first. Use `selfOnly=true` to restrict results to the calling API key's user; otherwise all runs for the team are returned. Cursor-paginated; see the [Pagination](/pagination) guide.","tags":["workflows"],"parameters":[{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}},{"name":"selfOnly","in":"query","description":"When true, returns only items created by the API key's owner. When false (default), returns all items accessible to the team.","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Paginated list of workflow runs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunListResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/workflows/runs/{workflowRunId}":{"get":{"operationId":"workflows_getWorkflowRun","summary":"Get workflow run status","tags":["workflows"],"parameters":[{"name":"workflowRunId","in":"path","description":"The workflow run id returned when the workflow was started.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Current workflow run state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRun"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/workflows/runs/{workflowRunId}/cancel":{"post":{"operationId":"workflows_cancelWorkflowRun","summary":"Cancel a workflow run","tags":["workflows"],"parameters":[{"name":"workflowRunId","in":"path","description":"The workflow run id returned when the workflow was started.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Cancellation request accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartWorkflowRunResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects":{"get":{"operationId":"projects_listProjects","summary":"List projects","description":"Returns projects, most recently updated first, including projects created in the dashboard. Use `selfOnly=true` to restrict results to the calling API key's user; otherwise all matching projects for the team are returned. Cursor-paginated; see the [Pagination](/pagination) guide.","tags":["projects"],"parameters":[{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}},{"name":"selfOnly","in":"query","description":"When true, returns only items created by the API key's owner. When false (default), returns all items accessible to the team.","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Paginated list of projects.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListProjectsResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects/{projectId}":{"get":{"operationId":"projects_getProject","summary":"Get project metadata","description":"Returns a simplified view of a project including its title, aspect ratio, status, and URL.","tags":["projects"],"parameters":[{"name":"projectId","in":"path","description":"The project id (e.g. `vg_proj_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Project metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects/{projectId}/export":{"post":{"operationId":"projects_exportProject","summary":"Export a project as MP4","description":"Starts an export of a project to MP4. Returns immediately with an export id; the file becomes available when the export task completes. Exporting requires a paid plan in the app, but the API lets you export for free with a VideoGen watermark and a short 'Made with VideoGen' end screen appended to the video. A Pro plan lets you remove both by setting `watermarkMode` and `endScreenMode` to `NONE`.","tags":["projects"],"parameters":[{"name":"projectId","in":"path","description":"The project id (e.g. `vg_proj_...`).","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Export accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportProjectResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportProjectRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects/{projectId}/exports":{"get":{"operationId":"projects_listProjectExports","summary":"List project exports","description":"Returns a project's exports, newest first, as fully hydrated `ProjectExport` objects (status, signed download/thumbnail URLs, and the embedded `file`). Signed URLs are re-signed when within an hour of expiring, so they are always valid long enough to use. Cursor-paginated; see the [Pagination](/pagination) guide.","tags":["projects"],"parameters":[{"name":"projectId","in":"path","description":"The project id (e.g. `vg_proj_...`).","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Project exports.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListProjectExportsResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects/{projectId}/exports/{exportId}":{"get":{"operationId":"projects_getProjectExport","summary":"Get project export","description":"Returns the current status of a project export started via `POST /v1/projects/{projectId}/export`, and — once `status` is `succeeded` — the signed download/thumbnail URLs and the hydrated export `file`. Poll this endpoint until `status` is `succeeded`, `failed`, or `cancelled`. The signed URLs are private and valid for 7 days; this endpoint automatically re-signs them when they are within an hour of expiring, so a caller always receives a URL valid long enough to use. Every endpoint that returns hydrated files auto-rehydrates this way — only the file endpoints (`GET /v1/files/{fileId}` and `POST /v1/files/{fileId}/hydrate`) are the explicit, on-demand hydration paths. Use `exportFileId` with `POST /v1/files/{fileId}/hydrate` if you need to re-sign the export file directly later.","tags":["projects"],"parameters":[{"name":"projectId","in":"path","description":"The project id (e.g. `vg_proj_...`).","required":true,"schema":{"type":"string"}},{"name":"exportId","in":"path","description":"The export id (e.g. `vg_expo_...`) returned by `POST /v1/projects/{projectId}/export`.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Export status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectExport"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects/{projectId}/timeline-interchange":{"post":{"operationId":"projects_createTimelineInterchange","summary":"Create a timeline interchange","description":"Starts a timeline interchange job that converts a project into an editor interchange document (Final Cut Pro FCPXML, Adobe Premiere Pro XML, OpenTimelineIO, or an SRT caption sidecar). Returns immediately with an interchange job id; the file becomes available when the job completes. Unlike `POST /v1/projects/{projectId}/export` (which renders a flattened MP4), this preserves the project as an editable timeline of separate clips, tracks, and captions so you can keep editing it in a desktop video editor. Choose `mediaDelivery` to control how the document references media: `REMOTE_URLS` produces a single document that links to signed media URLs, while `BUNDLE` produces a zip containing the document plus every referenced media file for durable offline relinking.","tags":["projects"],"parameters":[{"name":"projectId","in":"path","description":"The project id (e.g. `vg_proj_...`).","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Timeline interchange accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTimelineInterchangeResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTimelineInterchangeRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/timeline-interchange/{interchangeJobId}":{"get":{"operationId":"projects_getTimelineInterchange","summary":"Get timeline interchange job","description":"Returns the current status of a timeline interchange job started via `POST /v1/projects/{projectId}/timeline-interchange`, and, once `status` is `succeeded`, the signed download URL and the hydrated interchange `file`. Poll this endpoint until `status` is `succeeded`, `failed`, or `cancelled`. The signed URL is private and valid for 7 days; this endpoint automatically re-signs it when it is within an hour of expiring. Use `interchangeFileId` with `POST /v1/files/{fileId}/hydrate` if you need to re-sign the file directly later.","tags":["projects"],"parameters":[{"name":"interchangeJobId","in":"path","description":"The timeline interchange job id (e.g. `vg_inte_...`) returned by `POST /v1/projects/{projectId}/timeline-interchange`.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Timeline interchange status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimelineInterchange"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects/{projectId}/remix":{"post":{"operationId":"projects_remixProject","summary":"Apply remix actions to a project","description":"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.","tags":["projects"],"parameters":[{"name":"projectId","in":"path","description":"The project id (e.g. `vg_proj_...`).","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Remix actions accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemixProjectResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemixProjectRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/projects/{projectId}/remix-actions":{"get":{"operationId":"projects_listProjectRemixActions","summary":"List remix actions for a project","description":"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.","tags":["projects"],"parameters":[{"name":"projectId","in":"path","description":"The project id (e.g. `vg_proj_...`).","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Remix actions for the project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRemixActionsResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistants":{"post":{"operationId":"assistant_startAssistantChat","summary":"Start an assistant chat","description":"Creates a new project and sends the first message to the VideoGen AI assistant, exactly like typing into the assistant on a new project in the app. Asynchronous: the response contains the `messageId` of the assistant's pending reply (e.g. `vg_mesg_...`). Poll `GET /v1/assistant-messages/{messageId}` until `status` is `succeeded`, `failed`, or `cancelled`, or subscribe to `assistant_message.*` webhooks. Fetch the parent assistant with `GET /v1/assistants/{assistantId}` to list all messages in the chat.","tags":["assistant"],"responses":{"202":{"description":"Assistant message accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAssistantChatResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAssistantChatRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistants/{assistantId}":{"get":{"operationId":"assistant_getAssistant","summary":"Get an assistant chat","description":"Returns the assistant chat identified by `assistantId`, including every message in it (user and assistant turns) in chronological order.","tags":["assistant"],"parameters":[{"name":"assistantId","in":"path","description":"The assistant chat id (e.g. `vg_asst_...`). Every API project has one assistant chat; find it on `ProjectResponse.assistantId`.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The assistant chat and its messages.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetAssistantResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistants/{assistantId}/messages":{"post":{"operationId":"assistant_sendAssistantMessage","summary":"Send an assistant message","description":"Sends a follow-up message to an existing assistant chat started with `POST /v1/assistants`. Asynchronous: the response contains the `messageId` of the assistant's pending reply. Poll `GET /v1/assistant-messages/{messageId}` until `status` is terminal, or subscribe to `assistant_message.*` webhooks.","tags":["assistant"],"parameters":[{"name":"assistantId","in":"path","description":"The assistant chat id (e.g. `vg_asst_...`). Every API project has one assistant chat; find it on `ProjectResponse.assistantId`.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Assistant message accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendAssistantMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendAssistantMessageRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistants/{assistantId}/actions/{actionId}":{"post":{"operationId":"assistant_actOnAssistantAction","summary":"Act on an assistant action","description":"Acts on an actionable widget the assistant offered on a prior turn. Reference the action by its `actionId` from a prior assistant message. `APPROVE` (the default) completes the action; `REJECT` records the rejection. Two kinds are actionable via the API: accepting a workflow suggestion (`APPROVE` applies the suggested workflow and immediately starts generating; the returned assistant message carries the workflow run in `generation`), and applying an assistant edit (an `APPLY_EDIT` action with `requiresApp` false, which applies the edit to the project). Actions with `requiresApp` set to true (plans, tools, and other app-only widgets) can only be completed in the web app: open the assistant's `projectUrl` instead. Asynchronous: the response contains the `messageId` of the resulting assistant message. Poll `GET /v1/assistant-messages/{messageId}` for its terminal state.","tags":["assistant"],"parameters":[{"name":"assistantId","in":"path","description":"The assistant chat id (e.g. `vg_asst_...`). Every API project has one assistant chat; find it on `ProjectResponse.assistantId`.","required":true,"schema":{"type":"string"}},{"name":"actionId","in":"path","description":"The `actionId` of the action to act on, from a prior assistant message.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Assistant action accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActOnAssistantActionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActOnAssistantActionRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/assistant-messages/{messageId}":{"get":{"operationId":"assistant_getAssistantMessage","summary":"Get an assistant message","description":"Returns a single assistant chat message by id. Poll after a POST that returned `messageId` until `status` is `succeeded`, `failed`, or `cancelled`. Also supported for `USER` messages (which reach terminal state as soon as they're accepted).","tags":["assistant"],"parameters":[{"name":"messageId","in":"path","description":"The assistant message id (e.g. `vg_mesg_...`) returned by an assistant POST.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The assistant chat message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantMessage"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/generate-image":{"post":{"operationId":"tools_generateImage","summary":"Generate image","description":"Generate an image from a text prompt, optionally guided by reference images and actor, product, or visual-style entity ids. When reference images are provided, the prompt describes the desired transformation. VideoGen automatically routes each request to the most effective state-of-the-art image model for your prompt, reference images, entities, and quality tier, so you don't pick a model.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/generate-video-clip":{"post":{"operationId":"tools_generateVideoClip","summary":"Generate video clip","description":"Generate a single short video clip (up to 30 seconds) from a text prompt, optionally guided by an opening-frame still, reference images, videos, and audio. At least one of `prompt`, `startFrameFileId`, `imageFileIds`, `videoFileIds`, `audioFileIds`, or `spokenDialogue` must be provided. VideoGen automatically routes each request to the most effective state-of-the-art video model for your inputs and settings, so you don't pick a model. This endpoint returns one standalone clip. For longer, higher-quality, professionally edited videos with narration, captions, music, and multiple scenes, use a video workflow such as [Script to video](/workflows) (`POST /v1/workflows/script-to-video`) instead.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVideoClipRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/generate-motion-graphic":{"post":{"operationId":"tools_generateMotionGraphic","summary":"Generate motion graphic","description":"Generate an animated motion graphic video from a text prompt. This is an experimental, fully agentic alternative to a video workflow: VideoGen plans the animation, optionally generates or fetches supporting media, and renders a self-contained animated clip. It is especially well suited to precise text animations (e.g. a typing effect, animated captions, kinetic typography, lower thirds) that are hard to express with stock or generated footage. Optionally pass uploaded `fileIds` for reference media and `entityIds` for actors, products, or visual styles the animation should use. This endpoint returns one standalone video. For longer, narrated, multi-scene videos, use a video workflow such as [Script to video](/workflows) (`POST /v1/workflows/script-to-video`) instead.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateMotionGraphicRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/text-to-speech":{"post":{"operationId":"tools_textToSpeech","summary":"Text to speech","description":"Convert text into a spoken audio file. Only voices with `supportsDirectToolExecution` set to true can be used. Optionally choose a voice, language, speed, and pronunciation overrides.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextToSpeechRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/generate-sound-effect":{"post":{"operationId":"tools_generateSoundEffect","summary":"Generate sound effect","description":"Generate a sound effect from a text description. Optionally control the duration and prompt influence. VideoGen automatically routes each request to the most effective state-of-the-art sound effect model for your prompt and settings, so you don't pick a model.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSoundEffectRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/generate-music":{"post":{"operationId":"tools_generateMusic","summary":"Generate music","description":"Generate an instrumental music track from a text description. The returned track is approximately 30 seconds long. VideoGen automatically routes each request to the most effective state-of-the-art music model for your prompt, so you don't pick a model.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateMusicRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/generate-avatar":{"post":{"operationId":"tools_generateAvatar","summary":"Generate avatar clip","description":"Generate a talking-head avatar video by pairing an ACTOR entity with an audio file, typically from a prior text-to-speech result.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAvatarRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/vectorize-image":{"post":{"operationId":"tools_vectorizeImage","summary":"Vectorize image","description":"Convert any raster image into a scalable vector graphic (SVG). The output traces the shapes and colors of the input image.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageAssetRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/remove-image-background":{"post":{"operationId":"tools_removeImageBackground","summary":"Remove background from an image","description":"Remove the background from an image, returning a transparent-background PNG of the foreground subject.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageAssetRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/remove-video-background":{"post":{"operationId":"tools_removeVideoBackground","summary":"Remove background from a video","description":"Remove the background from a video, producing a transparent-background video of the foreground subject.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoAssetRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/upscale-image":{"post":{"operationId":"tools_upscaleImage","summary":"Upscale an image","description":"Increase the resolution of an image while preserving detail and sharpness.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageAssetRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/upscale-video":{"post":{"operationId":"tools_upscaleVideo","summary":"Upscale a video","description":"Increase the resolution of a video while preserving detail and sharpness.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoAssetRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/image-3d-effect":{"post":{"operationId":"tools_image3dEffect","summary":"Add 3D motion to an image","description":"Turn a still image into a short video clip with a 3D parallax motion effect, simulating camera movement through the scene.","tags":["tools"],"responses":{"202":{"description":"Execution accepted; poll until complete.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageAssetRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/executions/{toolExecutionId}/cancel":{"post":{"operationId":"tools_cancelToolExecution","summary":"Cancel tool execution","description":"Request cancellation of a running tool execution. The execution transitions to `cancelled` if it has not already completed.","tags":["tools"],"parameters":[{"name":"toolExecutionId","in":"path","description":"The tool execution id returned when the tool was started.","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Cancellation request accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartToolExecutionResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/executions":{"get":{"operationId":"tools_listToolExecutions","summary":"List tool executions","description":"List tool executions started via the API, most recently created first. Use `selfOnly=true` to restrict results to the calling API key's user; otherwise all executions for the team are returned. Cursor-paginated; see the [Pagination](/pagination) guide. Executions remain listable indefinitely (including those older than 7 days). For efficiency this list does not re-sign result download URLs, so `downloadUrl`/`thumbnailUrl` reflect the last time they were signed and may be expired (always check `downloadUrlExpiresAt`). To obtain a fresh signed URL, GET the individual execution (`GET /v1/tools/executions/{toolExecutionId}`) or hydrate the file (`GET /v1/files/{fileId}` / `POST /v1/files/{fileId}/hydrate`).","tags":["tools"],"parameters":[{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}},{"name":"selfOnly","in":"query","description":"When true, returns only items created by the API key's owner. When false (default), returns all items accessible to the team.","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Paginated list of tool executions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolExecutionListResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/tools/executions/{toolExecutionId}":{"get":{"operationId":"tools_getToolExecutionInfo","summary":"Get tool execution info","description":"Retrieve the current status and result of a tool execution. Poll this endpoint until `status` is `succeeded`, `failed`, or `cancelled`. Each succeeded result carries signed `downloadUrl`/`thumbnailUrl` (with matching `*ExpiresAt` timestamps) alongside the full hydrated `file`. The signed URLs are private and valid for 7 days; this single-execution endpoint automatically re-signs them when they are within an hour of expiring, so a caller always receives a URL valid long enough to use. Results remain retrievable indefinitely, including executions older than 7 days. Note that list endpoints (e.g. `GET /v1/tools/executions`) do not re-sign URLs: they return the last-signed URL, which may already be expired (check `downloadUrlExpiresAt`). To refresh a URL, GET the individual execution here, or hydrate the file directly via `GET /v1/files/{fileId}` / `POST /v1/files/{fileId}/hydrate`.","tags":["tools"],"parameters":[{"name":"toolExecutionId","in":"path","description":"The tool execution id returned when the tool was started.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Current execution state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutedTool"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/text/generate":{"post":{"operationId":"text_generateText","summary":"Generate text","description":"Generate text from a prompt using a general-purpose language model. Choose a quality tier with `quality` (`LOW`, `STANDARD`, `HIGH`, or `MAX`). Synchronous: the response includes the generated text. Useful for drafting scripts, titles, descriptions, and other short copy before generating a video.","tags":["text"],"responses":{"200":{"description":"Generated text.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTextResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTextRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/files":{"get":{"operationId":"files_getFiles","summary":"List files","description":"List files accessible to your team. By default this returns standalone files (direct tool-call outputs and uploads) and omits two categories: export files (the raw output files of your exports) and project files (the generative files created within a project, e.g. each AI image and text-to-speech file in a script-to-video workflow output). Set `includeExportFiles` and/or `includeProjectFiles` to true to include them. Use `selfOnly=true` to restrict results to files created by the calling API key's user. Files are returned most recently updated first. Cursor-paginated; see the [Pagination](/pagination) guide.","tags":["files"],"parameters":[{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}},{"name":"selfOnly","in":"query","description":"When true, returns only items created by the API key's owner. When false (default), returns all items accessible to the team.","required":false,"schema":{"type":"boolean","default":false}},{"name":"includeExportFiles","in":"query","description":"When true, includes export files: the raw output files of your exports (the rendered MP4 you download from an export). When false (default), they are omitted.","required":false,"schema":{"type":"boolean","default":false}},{"name":"includeProjectFiles","in":"query","description":"When true, includes project files: the generative files created within a project (e.g. each AI image and text-to-speech file produced inside a script-to-video workflow output). When false (default), they are omitted.","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"File list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFilesResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/search":{"post":{"operationId":"files_searchFiles","summary":"Search files","description":"Semantic vector search over your files. Embeds the query text and returns the closest matching files ranked by cosine similarity. Only files with indexed descriptions are searchable.","tags":["files"],"responses":{"200":{"description":"Search results ordered by descending similarity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFilesResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFilesRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/{fileId}":{"get":{"operationId":"files_getFile","summary":"Get file","description":"Retrieve metadata for a single file by its id.","tags":["files"],"parameters":[{"name":"fileId","in":"path","description":"The file id (e.g. `vg_file_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileInfo"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/upload":{"post":{"operationId":"files_createFileUpload","summary":"Create file upload","description":"Create a new file and receive a pre-signed upload URL. PUT the file bytes to the returned URL, then poll `GET /v1/files/{fileId}` until the file is ready.","tags":["files"],"responses":{"200":{"description":"Upload instructions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUploadResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFileUploadRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/import-url":{"post":{"operationId":"files_createFileUrlImport","summary":"Import a file from a link","description":"Starts importing a video from a public link (a video page or a direct video URL) into your files. Returns immediately with a file import id. Poll `GET /v1/files/imports/{fileImportId}` until `status` is `succeeded`, then use `fileId` anywhere a video file id is accepted, such as `POST /v1/workflows/video-to-video`. Videos up to 10 minutes long can be imported. Only import media you have the rights to use.","tags":["files"],"responses":{"202":{"description":"File import accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFileUrlImportResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFileUrlImportRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/imports/{fileImportId}":{"get":{"operationId":"files_getFileUrlImport","summary":"Get file import","description":"Returns the current status of a file import started via `POST /v1/files/import-url`, and, once `status` is `succeeded`, the imported file. Poll this endpoint until `status` is `succeeded`, `failed`, or `cancelled`.","tags":["files"],"parameters":[{"name":"fileImportId","in":"path","description":"The file import id (e.g. `vg_fimp_...`) returned by `POST /v1/files/import-url`.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File import status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUrlImport"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/{fileId}/hydrate":{"post":{"operationId":"files_hydrateFile","summary":"Hydrate file","description":"Generate fresh signed URLs for all available renditions of a file. Call this when source URLs are missing or expired. Returns the full file object with populated `downloadSource`, `thumbnailSource`, and `previewSource` (and the convenience root-level `downloadUrl` / `thumbnailUrl`).","tags":["files"],"parameters":[{"name":"fileId","in":"path","description":"The file id (e.g. `vg_file_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File with hydrated sources","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileInfo"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/{fileId}/archive":{"post":{"operationId":"files_archiveFile","summary":"Archive file","description":"Archive a file by setting its archived timestamp. Archived files are excluded from list results. Returns the updated file object.","tags":["files"],"parameters":[{"name":"fileId","in":"path","description":"The file id (e.g. `vg_file_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Archived file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileInfo"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/{fileId}/enable-public-preview":{"post":{"operationId":"files_enablePublicPreview","summary":"Enable public preview","description":"Enable public preview for a file. Works for any file type. Copies the file to a permanent public URL (`staticPublicPreviewSource`) and, for video and audio, registers a public embed playback id (`publicPlaybackId`) for use with `@videogen/player`. If streaming playback is still processing, the endpoint polls briefly and background processing finishes creating the embed playback id. Returns the updated file.","tags":["files"],"parameters":[{"name":"fileId","in":"path","description":"The file id (e.g. `vg_file_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File with public preview enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileInfo"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/files/{fileId}/disable-public-preview":{"post":{"operationId":"files_disablePublicPreview","summary":"Disable public preview","description":"Disable public preview for a file. Removes the permanent public URL copy and revokes unauthenticated embed streaming access. Authenticated signed URLs remain functional. Returns the updated file.","tags":["files"],"parameters":[{"name":"fileId","in":"path","description":"The file id (e.g. `vg_file_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File with public preview disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileInfo"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/entities":{"get":{"operationId":"entities_listEntities","summary":"List entities","description":"List built-in actors, products, visual styles, and slideshow themes, followed by the entities available to your team. Built-in entities have `isBuiltIn: true` and cannot be updated or archived. Cursor-paginated; see the [Pagination](/pagination) guide.","tags":["entities"],"parameters":[{"name":"entityType","in":"query","description":"When provided, returns only entities of this type. Omit to return all entities.","required":false,"schema":{"$ref":"#/components/schemas/V1EntitiesGetParametersEntityType"}},{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Entity list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListEntitiesResponse"}}}}},"security":[{"bearerAuth":[]}]},"post":{"operationId":"entities_createEntity","summary":"Create entity","description":"Create a reusable entity. Attach reference images with `POST /v1/entities/{entityId}/references`.","tags":["entities"],"responses":{"200":{"description":"The created entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEntityRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/entities/{entityId}":{"get":{"operationId":"entities_getEntity","summary":"Get entity","description":"Retrieve a single entity by its id, including its reference images. Built-in catalog entities are included.","tags":["entities"],"parameters":[{"name":"entityId","in":"path","description":"The entity id (e.g. `vg_enti_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/entities/{entityId}/update":{"post":{"operationId":"entities_updateEntity","summary":"Update entity","description":"Update an entity's name, description, or brand configuration. Provide at least one field. Built-in entities (`isBuiltIn: true`) cannot be updated.","tags":["entities"],"parameters":[{"name":"entityId","in":"path","description":"The entity id (e.g. `vg_enti_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEntityRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/entities/{entityId}/archive":{"post":{"operationId":"entities_archiveEntity","summary":"Archive entity","description":"Archive an entity. Archived entities no longer appear in `GET /v1/entities` and can't be attached to new workflows. Built-in entities (`isBuiltIn: true`) cannot be archived.","tags":["entities"],"parameters":[{"name":"entityId","in":"path","description":"The entity id (e.g. `vg_enti_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Archive acknowledged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityArchiveResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/entities/{entityId}/references":{"post":{"operationId":"entities_addEntityReference","summary":"Add entity reference","description":"Attach an image file as a reference for the entity. Upload the image first via `POST /v1/files/upload`. Returns the updated entity. Built-in entities (`isBuiltIn: true`) cannot have references added.","tags":["entities"],"parameters":[{"name":"entityId","in":"path","description":"The entity id (e.g. `vg_enti_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddEntityReferenceRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/entities/{entityId}/references/remove":{"post":{"operationId":"entities_removeEntityReference","summary":"Remove entity reference","description":"Detach a reference image from the entity. Returns the updated entity. Built-in entities (`isBuiltIn: true`) cannot have references removed.","tags":["entities"],"parameters":[{"name":"entityId","in":"path","description":"The entity id (e.g. `vg_enti_...`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveEntityReferenceRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/resources/tts-voices":{"get":{"operationId":"resources_listTtsVoices","summary":"List TTS voices","description":"List available text-to-speech voices. Pass a `voiceId` or `displayName` from the response to the text-to-speech endpoint. Cursor-paginated; see the [Pagination](/pagination) guide. Pass `query` to filter by voice id, display name, language, accent, or description.","tags":["resources"],"parameters":[{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}},{"name":"includeDeprecatedVoices","in":"query","description":"When true, includes voices that are deprecated but still callable. Defaults to false.","required":false,"schema":{"type":"boolean","default":false}},{"name":"query","in":"query","description":"Optional case-insensitive substring filter across each item's searchable text fields. Omit to return the unfiltered catalogue.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of TTS voices. Pass a `voiceId` or `displayName` to `POST /v1/tools/text-to-speech`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TtsVoiceListResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/resources/languages":{"get":{"operationId":"resources_listLanguages","summary":"List supported languages","description":"List the languages a project can be translated into. Pass a `languageCode` from the response to the `TRANSLATE_PROJECT` remix action. Returns the full catalogue in a single response (not paginated). Pass `query` to filter by language code or English name.","tags":["resources"],"parameters":[{"name":"query","in":"query","description":"Optional case-insensitive substring filter across each item's searchable text fields. Omit to return the unfiltered catalogue.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of supported languages. Pass a `languageCode` to a `TRANSLATE_PROJECT` remix action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageListResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/v1/webhooks/endpoints":{"get":{"operationId":"webhooks_listWebhookEndpoints","summary":"List webhooks","description":"List configured webhook endpoints for your account. Cursor-paginated; see the [Pagination](/pagination) guide.","tags":["webhooks"],"parameters":[{"name":"limit","in":"query","description":"Maximum number of items to return in the page. Defaults to 50; capped at 200. See [Pagination](/pagination).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"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).","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Configured endpoints","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointListResponse"}}}}},"security":[{"bearerAuth":[]}]},"post":{"operationId":"webhooks_createWebhookEndpoint","summary":"Create webhook","description":"Register a new webhook endpoint to receive `tool_execution.*`, `workflow_run.*`, and `file.*` events. The signing secret is only returned in this response. Store it securely.","tags":["webhooks"],"responses":{"201":{"description":"Created; `signingSecret` is only returned in this response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}}}},"security":[{"bearerAuth":[]}]}},"/v1/webhooks/endpoints/{endpointId}":{"delete":{"operationId":"webhooks_deleteWebhookEndpoint","summary":"Delete webhook","description":"Remove a webhook endpoint. It will stop receiving events immediately.","tags":["webhooks"],"parameters":[{"name":"endpointId","in":"path","description":"The webhook endpoint id (e.g. `ep_...`) returned by `POST /v1/webhooks/endpoints`.","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Removed","content":{"application/json":{"schema":{"type":"object","properties":{}}}}}},"security":[{"bearerAuth":[]}]}},"/v1/me":{"get":{"operationId":"account_getMe","summary":"Get current account","description":"Return the account and team behind the API key making the request. Takes no parameters. Call it as a connection test to confirm a key is valid and to discover the `teamId` and account `email` a key belongs to.","tags":["account"],"responses":{"200":{"description":"The account and team for the authenticated API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}},"security":[{"bearerAuth":[]}]}}},"tags":[{"name":"workflows"},{"name":"projects"},{"name":"assistant"},{"name":"tools"},{"name":"text"},{"name":"files"},{"name":"entities"},{"name":"resources"},{"name":"webhooks"},{"name":"account"}],"servers":[{"url":"https://api.videogen.io","description":"Production"}],"components":{"schemas":{"AspectRatio":{"type":"object","properties":{"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}},"required":["width","height"],"description":"Aspect ratio as a width:height pair (e.g. 16 and 9 for 16:9). Not pixel dimensions.","title":"AspectRatio"},"WorkflowVisualStyleType":{"type":"string","enum":["STOCK","AI_IMAGE"],"description":"STOCK pulls stock footage and images. AI_IMAGE generates a styled image for each section. Pass `entityId` to match a saved visual-style entity, or `aiStyle` for a free-form look.","title":"WorkflowVisualStyleType"},"WorkflowVisualStyle":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/WorkflowVisualStyleType","description":"STOCK pulls stock footage and images. AI_IMAGE generates a styled image for each section. Pass `entityId` to match a saved visual-style entity, or `aiStyle` for a free-form look."},"aiStyle":{"type":"string","description":"Only applies when type is AI_IMAGE and `entityId` is omitted. A full, strict paragraph for the look of every generated image (medium, texture, palette, then composition). Do not pass a short label such as `watercolor`. Image models pack the frame with text, charts, diagrams, and extra objects unless the style forbids that. Keep the picture simple: one uncluttered subject in the middle half of the frame, empty margins, and no on-image text or diagrams unless you asked for one specific word or number. Copy a full description from the AI styles reference. Example: `Loose watercolor illustration, visible brushstrokes, soft color bleeds, paper texture, muted palette. A clear uncluttered subject centered in the frame, occupying only the middle half of the image, with generous empty margins on all four sides, no background clutter. No on-image text, letters, labels, captions, charts, diagrams, tables, legends, or infographic layout.` Required when type is AI_IMAGE and `entityId` is omitted."},"entityId":{"type":"string","description":"Only applies when type is AI_IMAGE. The id of a VISUAL_STYLE entity (e.g. `vg_enti_...`) whose reference images guide every generated image. When set, generated images match that entity instead of `aiStyle`."},"restyleFeaturedBRollWithAiStyle":{"type":"boolean","default":true,"description":"Only applies when type is AI_IMAGE. When true, featured b-roll images you provide are re-rendered in the chosen style so they match the generated look (no effect on featured b-roll videos). Defaults to true."}},"required":["type"],"description":"Visual style for the generated b-roll.","title":"WorkflowVisualStyle"},"VisualPacing":{"type":"string","enum":["FAST","MEDIUM","SLOW"],"default":"MEDIUM","description":"How quickly visuals change. FAST shows more, shorter shots; SLOW holds each visual longer. Defaults to MEDIUM.","title":"VisualPacing"},"ModelQuality":{"type":"string","enum":["LOW","STANDARD","HIGH","MAX"],"description":"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.\n\nWhen 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).\n","title":"ModelQuality"},"SceneDescriptionRange":{"type":"object","properties":{"startSeconds":{"type":"number","format":"double","minimum":0,"description":"Start time of the range in seconds from the beginning of the video."},"endSeconds":{"type":"number","format":"double","description":"End time of the range in seconds from the beginning of the video. Must be greater than `startSeconds`."},"description":{"type":"string","description":"What should be shown on screen during this range (e.g. the b-roll subject, on-screen text, or staging)."}},"required":["startSeconds","endSeconds","description"],"description":"A description of the visuals to show during an absolute time range of the finished video.","title":"SceneDescriptionRange"},"RemixActionDiscriminatorMappingSetLogoPosition":{"type":"string","enum":["TOP_LEFT","TOP_CENTER","TOP_RIGHT","BOTTOM_LEFT","BOTTOM_CENTER","BOTTOM_RIGHT"],"description":"Position the logo is anchored to. Omit or pass `null` to keep the current position.","title":"RemixActionDiscriminatorMappingSetLogoPosition"},"WorkflowCaptionStyleFontWeight":{"type":"string","enum":["100","200","300","400","500","600","700","800","900"],"description":"Numeric font weight (400 = regular, 700 = bold).","title":"WorkflowCaptionStyleFontWeight"},"WorkflowRgbColor":{"type":"object","properties":{"red":{"type":"integer","minimum":0,"maximum":255},"green":{"type":"integer","minimum":0,"maximum":255},"blue":{"type":"integer","minimum":0,"maximum":255}},"required":["red","green","blue"],"description":"An RGB color. Each channel is an integer from 0 to 255.","title":"WorkflowRgbColor"},"WorkflowCaptionStyleTextJustification":{"type":"string","enum":["LEFT","CENTER","RIGHT"],"title":"WorkflowCaptionStyleTextJustification"},"WorkflowCaptionStyleVerticalAlignment":{"type":"string","enum":["TOP","MIDDLE","BOTTOM"],"description":"Vertical position of the caption block in the frame.","title":"WorkflowCaptionStyleVerticalAlignment"},"WorkflowCaptionBackgroundStyleType":{"type":"string","enum":["RECT","WRAPPED","WORD_BY_WORD"],"description":"RECT draws one rectangle behind the whole line; WRAPPED hugs the text; WORD_BY_WORD draws a box per word.","title":"WorkflowCaptionBackgroundStyleType"},"WorkflowCaptionBackgroundStyle":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/WorkflowCaptionBackgroundStyleType","description":"RECT draws one rectangle behind the whole line; WRAPPED hugs the text; WORD_BY_WORD draws a box per word."},"backgroundColor":{"$ref":"#/components/schemas/WorkflowRgbColor"},"borderRadiusProportion":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Corner rounding as a proportion of the background height, between 0 (square corners) and 1 (fully rounded)."},"opacityProportion":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Background opacity from 0 (transparent) to 1 (opaque)."}},"required":["type","backgroundColor"],"description":"Background drawn behind caption text.","title":"WorkflowCaptionBackgroundStyle"},"WorkflowCaptionStyle":{"type":"object","properties":{"fontName":{"type":"string","description":"Font family name."},"fontSize":{"type":"number","format":"double","minimum":1,"description":"Font size in pixels at 1080p. Must be greater than 0."},"fontWeight":{"$ref":"#/components/schemas/WorkflowCaptionStyleFontWeight","description":"Numeric font weight (400 = regular, 700 = bold)."},"textColor":{"$ref":"#/components/schemas/WorkflowRgbColor"},"textJustification":{"$ref":"#/components/schemas/WorkflowCaptionStyleTextJustification"},"verticalAlignment":{"$ref":"#/components/schemas/WorkflowCaptionStyleVerticalAlignment","description":"Vertical position of the caption block in the frame."},"strokeColor":{"oneOf":[{"$ref":"#/components/schemas/WorkflowRgbColor"},{"type":"null"}],"description":"Outline color around glyphs, or null for no outline."},"strokeWeight":{"type":"number","format":"double","minimum":0,"description":"Outline thickness in pixels. 0 disables the outline."},"backgroundStyle":{"oneOf":[{"$ref":"#/components/schemas/WorkflowCaptionBackgroundStyle"},{"type":"null"}],"description":"Background drawn behind the text, or null for no background."},"spokenTextColor":{"oneOf":[{"$ref":"#/components/schemas/WorkflowRgbColor"},{"type":"null"}],"description":"Color applied to the currently spoken word for karaoke-style highlighting, or null to keep the base text color."},"spokenTextStrokeColor":{"oneOf":[{"$ref":"#/components/schemas/WorkflowRgbColor"},{"type":"null"}],"description":"Outline color applied to the currently spoken word, or null."},"persistSpokenTextColor":{"type":"boolean","description":"When true, a word keeps the spoken-text color after it has been spoken instead of reverting."}},"description":"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.","title":"WorkflowCaptionStyle"},"RemixTransitionStyle":{"type":"string","enum":["DYNAMIC","NONE","FADE","RISE","PAN","POP","WIPE"],"description":"A transition applied at a boundary. `DYNAMIC` auto-varies the style across boundaries; `NONE` removes transitions; the rest apply that fixed style everywhere.","title":"RemixTransitionStyle"},"RemixAction":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["SET_BACKGROUND_MUSIC"],"description":"Discriminator value: SET_BACKGROUND_MUSIC"},"fileId":{"type":["string","null"],"description":"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":{"type":["number","null"],"format":"double","minimum":0,"maximum":1,"description":"Music volume from 0 (silent) to 1 (full). Omit or pass `null` to keep the current volume."}},"required":["type"],"description":"Set, replace, or remove the project's background music track."},{"type":"object","properties":{"type":{"type":"string","enum":["SET_LOGO"],"description":"Discriminator value: SET_LOGO"},"fileId":{"type":["string","null"],"description":"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":{"$ref":"#/components/schemas/RemixActionDiscriminatorMappingSetLogoPosition","description":"Position the logo is anchored to. Omit or pass `null` to keep the current position."},"sizePercent":{"type":["number","null"],"format":"double","description":"Logo width as a percentage of the video width. Omit or pass `null` to keep the current size."}},"required":["type"],"description":"Set, replace, or remove the logo overlay."},{"type":"object","properties":{"type":{"type":"string","enum":["ENABLE_CAPTIONS"],"description":"Discriminator value: ENABLE_CAPTIONS"},"captionStyle":{"oneOf":[{"$ref":"#/components/schemas/WorkflowCaptionStyle"},{"type":"null"}],"description":"Caption styling to apply. Omit or pass `null` to show captions with the current style. Any provided field overrides that field; omitted fields keep their current value."}},"required":["type"],"description":"Show captions on every captionable section. Optionally override the project caption style."},{"type":"object","properties":{"type":{"type":"string","enum":["DISABLE_CAPTIONS"],"description":"Discriminator value: DISABLE_CAPTIONS"}},"required":["type"],"description":"Hide captions on every captionable section."},{"type":"object","properties":{"type":{"type":"string","enum":["ADD_TRANSITIONS"],"description":"Discriminator value: ADD_TRANSITIONS"},"sectionTransition":{"oneOf":[{"$ref":"#/components/schemas/RemixTransitionStyle"},{"type":"null"}],"description":"Transition applied at every boundary between sections, replacing any existing section transitions. Omit or pass `null` to leave section transitions untouched."},"assetTransition":{"oneOf":[{"$ref":"#/components/schemas/RemixTransitionStyle"},{"type":"null"}],"description":"Transition applied at every boundary between base-layer assets within sections, replacing any existing asset transitions. Omit or pass `null` to leave asset transitions untouched."}},"required":["type"],"description":"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":"object","properties":{"type":{"type":"string","enum":["ADD_ZOOM"],"description":"Discriminator value: ADD_ZOOM"}},"required":["type"],"description":"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":"object","properties":{"type":{"type":"string","enum":["RESIZE_PROJECT"],"description":"Discriminator value: RESIZE_PROJECT"},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio"}},"required":["type","aspectRatio"],"description":"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":"object","properties":{"type":{"type":"string","enum":["CLEAN_UP_TRANSCRIPT"],"description":"Discriminator value: CLEAN_UP_TRANSCRIPT"},"removeFillers":{"type":["boolean","null"],"description":"Remove filler words (\"um\", \"uh\", …). Defaults to `true`."},"removePauses":{"type":["boolean","null"],"description":"Remove silent pauses longer than `minPauseSeconds`. Defaults to `true`."},"fillerWords":{"type":["array","null"],"items":{"type":"string"},"description":"Override the filler-word list to remove. Omit or pass `null` to use the built-in defaults."},"minPauseSeconds":{"type":["number","null"],"format":"double","minimum":0,"description":"Shortest pause (in seconds) to remove; pauses below this stay. Omit or pass `null` to use the default threshold."}},"required":["type"],"description":"Tighten every transcript in the project by removing silent pauses and/or filler words. Useful for polishing narration captured from raw recordings."},{"type":"object","properties":{"type":{"type":"string","enum":["CONVERT_IMAGES_TO_VIDEOS"],"description":"Discriminator value: CONVERT_IMAGES_TO_VIDEOS"},"motionPrompt":{"type":["string","null"],"description":"Describe the motion to apply to every image (e.g. \"slow cinematic push-in\"). Omit or pass `null` for automatic motion."},"muteOutputVideos":{"type":["boolean","null"],"description":"Mute the generated clips and suppress generated background music. Recommended when the clips sit behind a voiceover. Defaults to `true`."},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Video generation quality tier for the image-to-video conversions (`LOW`, `STANDARD`, `HIGH`, or `MAX`). Optional; when omitted, your account's Default AI quality for video is used (change it at https://app.videogen.io/settings/account)."}},"required":["type"],"description":"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":"object","properties":{"type":{"type":"string","enum":["REGENERATE_IMAGES"],"description":"Discriminator value: REGENERATE_IMAGES"},"stylePrompt":{"type":"string","description":"A full, strict paragraph for the look of every image (medium, texture, palette, then composition). Do not pass a short label such as `watercolor painting`. Image models pack the frame with text, charts, diagrams, and extra objects unless the style forbids that. Keep the picture simple: one uncluttered subject in the middle half of the frame, empty margins, and no on-image text or diagrams unless you asked for one specific word or number."},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Image generation quality tier for the restyled images. Optional; when omitted, your account's Default AI quality for images is used (change it at https://app.videogen.io/settings/account)."}},"required":["type","stylePrompt"],"description":"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":"object","properties":{"type":{"type":"string","enum":["UPSCALE_ASSETS"],"description":"Discriminator value: UPSCALE_ASSETS"},"includeVideos":{"type":["boolean","null"],"description":"Also upscale video assets (billed per output second). Defaults to `true`."},"includeStockContent":{"type":["boolean","null"],"description":"Also upscale stock (library) assets, not just uploaded or generated ones. Defaults to `true`."}},"required":["type"],"description":"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":"object","properties":{"type":{"type":"string","enum":["CHANGE_NARRATOR"],"description":"Discriminator value: CHANGE_NARRATOR"},"voiceId":{"type":"string","description":"Catalog `displayName` (e.g. `Matilda`) or voice id from `GET /v1/resources/tts-voices` (e.g. `vg_voic_...`) to re-narrate with."},"actorEntityId":{"type":["string","null"],"description":"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":{"$ref":"#/components/schemas/ModelQuality","description":"Avatar generation quality tier. Applies when `actorEntityId` is provided. Optional; when omitted, your account's Default AI quality for avatars is used."},"voiceSpeed":{"type":["number","null"],"format":"double","minimum":0.5,"maximum":2,"description":"Speech rate multiplier, between 0.5 (half speed) and 2 (double speed). Omit or pass `null` to keep each asset's current speed."}},"required":["type","voiceId"],"description":"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":"object","properties":{"type":{"type":"string","enum":["SHUFFLE_STOCK_VISUALS"],"description":"Discriminator value: SHUFFLE_STOCK_VISUALS"}},"required":["type"],"description":"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":"object","properties":{"type":{"type":"string","enum":["GENERATE_MUSIC"],"description":"Discriminator value: GENERATE_MUSIC"},"prompt":{"type":"string","description":"Describe the music to generate (e.g. \"upbeat corporate background music with a driving beat\")."}},"required":["type","prompt"],"description":"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":"object","properties":{"type":{"type":"string","enum":["TRANSLATE_PROJECT"],"description":"Discriminator value: TRANSLATE_PROJECT"},"languageCode":{"type":"string","description":"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":{"type":["boolean","null"],"description":"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":{"type":["boolean","null"],"description":"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`."}},"required":["type","languageCode"],"description":"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`."}],"discriminator":{"propertyName":"type"},"description":"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.","title":"RemixAction"},"ExportProjectQuality":{"type":"string","enum":["STANDARD","HIGH","FULL_HIGH","ULTRA_HIGH"],"description":"Vertical resolution tier for the rendered MP4.","title":"ExportProjectQuality"},"WatermarkMode":{"type":"string","enum":["NONE","VIDEO_GEN","AUTO"],"default":"AUTO","description":"Controls whether the VideoGen watermark is applied to the output. `AUTO` applies the watermark unless you have a Pro plan. `VIDEO_GEN` always applies it. `NONE` removes the watermark (requires Pro; returns an error if you don't have it).","title":"WatermarkMode"},"EndScreenMode":{"type":"string","enum":["NONE","VIDEO_GEN","AUTO"],"default":"AUTO","description":"Controls whether a short 'Made with VideoGen' end screen is appended to the output. `AUTO` appends it unless you have a Pro plan. `VIDEO_GEN` always appends it. `NONE` removes it (requires Pro; returns an error if you don't have it).","title":"EndScreenMode"},"ExportDeliveryDestinationType":{"type":"string","enum":["SLACK_CHANNEL","GOOGLE_DRIVE_FOLDER"],"description":"Where to deliver the export within the connected integration.","title":"ExportDeliveryDestinationType"},"ExportDeliveryDestination":{"type":"object","properties":{"integrationConnectionId":{"type":"string","description":"Id of the connected integration that will receive this export."},"type":{"$ref":"#/components/schemas/ExportDeliveryDestinationType","description":"Where to deliver the export within the connected integration."},"slackChannelId":{"type":["string","null"],"description":"Target channel id. Required when `type` is `SLACK_CHANNEL`."},"googleDriveFolderId":{"type":["string","null"],"description":"Target folder id. Required when `type` is `GOOGLE_DRIVE_FOLDER`."}},"required":["integrationConnectionId","type"],"title":"ExportDeliveryDestination"},"ExportProjectRequest":{"type":"object","properties":{"quality":{"$ref":"#/components/schemas/ExportProjectQuality"},"watermarkMode":{"$ref":"#/components/schemas/WatermarkMode","default":"AUTO"},"endScreenMode":{"$ref":"#/components/schemas/EndScreenMode","default":"AUTO"},"deliveryDestinations":{"type":"array","items":{"$ref":"#/components/schemas/ExportDeliveryDestination"},"description":"Destinations to deliver the finished export to when it completes, in addition to any delivery destinations already saved for the team. Each destination references a connected integration."}},"title":"ExportProjectRequest"},"ScriptToVideoRequest":{"type":"object","properties":{"script":{"type":"string","description":"The narration script, used verbatim. This exact text is narrated and turned into a video — it is not rewritten or expanded."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio"},"visualStyle":{"$ref":"#/components/schemas/WorkflowVisualStyle"},"visualPacing":{"$ref":"#/components/schemas/VisualPacing","default":"MEDIUM"},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Image generation quality tier for AI-generated visuals. Optional; when omitted, your account's Default AI quality for images is used (change it at https://app.videogen.io/settings/account). Only applies when `visualStyle.type` is AI_IMAGE; STOCK pulls existing footage and is unaffected."},"language":{"type":"string","description":"Output language as a BCP-47 code (e.g. `en`, `es`, `fr`). Defaults to English."},"voiceId":{"type":["string","null"],"description":"Catalog `displayName` (e.g. `Matilda`) or voice id from `GET /v1/resources/tts-voices` (e.g. `vg_voic_...`). A default voice is used when omitted. Any voice may be used here, including voices where `supportsDirectToolExecution` is false."},"voiceSpeed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"description":"Speech rate multiplier, between 0.5 (half speed) and 2 (double speed). Defaults to the voice's default speed."},"actorEntityId":{"type":["string","null"],"description":"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":{"$ref":"#/components/schemas/ModelQuality","description":"Avatar generation quality tier. Applies when `actorEntityId` is provided. Optional; when omitted, your account's Default AI quality for avatars is used."},"featuredBRollFileIds":{"type":"array","items":{"type":"string"},"description":"Optional file ids of images or videos to feature as b-roll (e.g. `[\"vg_file_...\"]`). Upload files first via `POST /v1/files/upload`. Only image and video files are accepted."},"workflowAgentContext":{"type":"string","description":"Optional production notes for the AI that builds the video — visual direction that should not appear in the spoken narration (e.g. on-screen code or text to display, specific b-roll to feature, or scene-by-scene staging). Never spoken; keep the narration itself in `script`."},"scenes":{"type":"array","items":{"$ref":"#/components/schemas/SceneDescriptionRange"},"description":"Optional timed scene descriptions guiding what to show on screen during each absolute time range of the video. Ranges must be sorted by `startSeconds` and non-overlapping. Omit to let the workflow choose visuals automatically."},"remixActions":{"type":"array","items":{"$ref":"#/components/schemas/RemixAction"},"description":"Optional edits applied to the project after the video is built, in order. Each action runs asynchronously; the response returns one remix action id per action. Recommended for script-to-video: `ENABLE_CAPTIONS` to show and style captions, `CONVERT_IMAGES_TO_VIDEOS` to animate still images into clips, `ADD_TRANSITIONS` to stamp transitions between sections, and `SET_LOGO` to overlay a logo (this workflow has no native caption-style or logo fields). See the [Remix actions](/remix-actions) guide."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, the video's generated OUTPUT files (AI images, video clips, voiceover audio, avatars) are created as temporary: guaranteed available for 24 hours, after which they may be archived and later deleted. This also covers files produced by post-build remix actions (e.g. generated background music, image-to-video conversions). Use this when your integration downloads or re-hosts the results itself and does not need VideoGen to retain them. The project and its metadata are unaffected. Defaults to false."},"autoExport":{"type":"boolean","default":false,"description":"When true, VideoGen exports an MP4 after the video is built (and after any `remixActions` on this request finish). The workflow run stays `running` until that export succeeds or fails. On success, poll `GET /v1/workflows/runs/{workflowRunId}` and use `downloadUrl`. Defaults to false."},"exportOptions":{"$ref":"#/components/schemas/ExportProjectRequest","description":"Export settings used when `autoExport` is true. Ignored when `autoExport` is false. Omitted fields use the same defaults as `POST /v1/projects/{projectId}/export`."}},"required":["script","visualStyle"],"title":"ScriptToVideoRequest"},"StartWorkflowRunResponse":{"type":"object","properties":{"workflowRunId":{"type":"string","description":"Opaque workflow run id (e.g. `vg_work_...`)."},"projectId":{"type":"string","description":"Id of the project created for this workflow run (e.g. `vg_proj_...`)."},"projectUrl":{"type":"string","format":"uri","description":"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":{"type":"array","items":{"type":"string"},"description":"Opaque remix action ids (e.g. `vg_rmix_...`), one per `remixActions` entry in request order. Empty when no remix actions were requested. Each runs after the video is built; poll `GET /v1/projects/{projectId}/remix-actions`."}},"required":["workflowRunId","projectId","projectUrl","remixActionIds"],"description":"Returned when a workflow run is accepted. Poll `GET /v1/workflows/runs/{workflowRunId}` or subscribe to webhooks for completion. When the start request set `autoExport: true`, wait until `status` is `succeeded` and use `downloadUrl`.","title":"StartWorkflowRunResponse"},"VoiceoverToVideoRequest":{"type":"object","properties":{"fileId":{"type":"string","description":"Opaque file id of an uploaded voiceover audio file (e.g. `vg_file_...`). Upload the file first via `POST /v1/files/upload`. Attach a pre-computed transcript at upload time (via the `transcript` field on `POST /v1/files/upload`) to skip re-transcription."},"scenes":{"type":"array","items":{"$ref":"#/components/schemas/SceneDescriptionRange"},"description":"Optional timed scene descriptions guiding what to show on screen during each absolute time range of the video. Ranges must be sorted by `startSeconds` and non-overlapping. Omit to let the workflow choose visuals automatically."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio"},"visualStyle":{"$ref":"#/components/schemas/WorkflowVisualStyle"},"visualPacing":{"$ref":"#/components/schemas/VisualPacing","default":"MEDIUM"},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Image generation quality tier for AI-generated visuals. Optional; when omitted, your account's Default AI quality for images is used (change it at https://app.videogen.io/settings/account). Only applies when `visualStyle.type` is AI_IMAGE; STOCK pulls existing footage and is unaffected."},"language":{"type":"string","description":"Output language as a BCP-47 code (e.g. `en`, `es`, `fr`). Defaults to English."},"actorEntityId":{"type":["string","null"],"description":"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":{"$ref":"#/components/schemas/ModelQuality","description":"Avatar generation quality tier. Applies when `actorEntityId` is provided. Optional; when omitted, your account's Default AI quality for avatars is used."},"captionStyle":{"oneOf":[{"$ref":"#/components/schemas/WorkflowCaptionStyle"},{"type":"null"}],"description":"Caption styling. Omit to use the default style with captions shown. Pass an object to override individual style fields (any omitted field uses the default). Pass `null` to hide captions entirely."},"logoFileId":{"type":["string","null"],"description":"Optional file id of an uploaded logo image to overlay on the video (e.g. `vg_file_...`). Upload the image first via `POST /v1/files/upload`. Only image files are accepted."},"workflowAgentContext":{"type":"string","description":"Optional production notes for the AI that builds the video — visual direction for how to illustrate the voiceover (e.g. on-screen code or text to display, specific b-roll to feature, or scene-by-scene staging). Never spoken; does not change the uploaded voiceover audio or its transcript."},"remixActions":{"type":"array","items":{"$ref":"#/components/schemas/RemixAction"},"description":"Optional edits applied to the project after the video is built, in order. Each action runs asynchronously; the response returns one remix action id per action. Captions and a logo are set with the `captionStyle` and `logoFileId` request fields above; recommended remix actions here are `CONVERT_IMAGES_TO_VIDEOS` to animate still images into clips, and `ADD_TRANSITIONS` to stamp transitions between sections and assets. See the [Remix actions](/remix-actions) guide."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, the video's generated OUTPUT files (AI images, video clips, voiceover audio, avatars) are created as temporary: guaranteed available for 24 hours, after which they may be archived and later deleted. This also covers files produced by post-build remix actions (e.g. generated background music, image-to-video conversions). Use this when your integration downloads or re-hosts the results itself and does not need VideoGen to retain them. The project and its metadata are unaffected. Defaults to false."},"autoExport":{"type":"boolean","default":false,"description":"When true, VideoGen exports an MP4 after the video is built (and after any `remixActions` on this request finish). The workflow run stays `running` until that export succeeds or fails. On success, poll `GET /v1/workflows/runs/{workflowRunId}` and use `downloadUrl`. Defaults to false."},"exportOptions":{"$ref":"#/components/schemas/ExportProjectRequest","description":"Export settings used when `autoExport` is true. Ignored when `autoExport` is false. Omitted fields use the same defaults as `POST /v1/projects/{projectId}/export`."}},"required":["fileId","visualStyle"],"title":"VoiceoverToVideoRequest"},"SlideshowToVideoRequest":{"type":"object","properties":{"fileId":{"type":"string","description":"Opaque file id of an uploaded PDF or PowerPoint file (e.g. `vg_file_...`). Upload the file first via `POST /v1/files/upload`."},"slideScripts":{"type":"array","items":{"type":"string"},"description":"Optional per-slide narration, in slide order, applied by index: each slide uses its matching entry, and an empty string makes that slide silent. If you provide fewer entries than slides, the remaining slides are silent; extra entries are ignored. Omit this field entirely to narrate each slide from its speaker notes in the uploaded file. To guarantee no narration on any slide, pass an empty array."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio"},"language":{"type":"string","description":"Output language as a BCP-47 code (e.g. `en`, `es`, `fr`). Defaults to English."},"voiceId":{"type":["string","null"],"description":"Catalog `displayName` (e.g. `Matilda`) or voice id from `GET /v1/resources/tts-voices` (e.g. `vg_voic_...`). A default voice is used when omitted. Any voice may be used here, including voices where `supportsDirectToolExecution` is false."},"voiceSpeed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"description":"Speech rate multiplier, between 0.5 (half speed) and 2 (double speed). Defaults to the voice's default speed."},"actorEntityId":{"type":["string","null"],"description":"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":{"$ref":"#/components/schemas/ModelQuality","description":"Avatar generation quality tier. Applies when `actorEntityId` is provided. Optional; when omitted, your account's Default AI quality for avatars is used."},"slideshowThemeEntityId":{"type":"string","description":"Optional id of a SLIDESHOW_THEME entity (e.g. `vg_enti_...`) whose reference board defines the shared slide design system (fonts, colors, layout) applied to generated or edited slides. Create one via `POST /v1/entities` with `entityType` SLIDESHOW_THEME and attach a reference image or a PDF / PowerPoint. Omit when converting an uploaded deck's original pages into a video; VideoGen derives a theme from those pages in the background so later edits can match the original slides."},"captionStyle":{"oneOf":[{"$ref":"#/components/schemas/WorkflowCaptionStyle"},{"type":"null"}],"description":"Caption styling. Omit to use the default style with captions shown. Pass an object to override individual style fields (any omitted field uses the default). Pass `null` to hide captions entirely."},"logoFileId":{"type":["string","null"],"description":"Optional file id of an uploaded logo image to overlay on the video (e.g. `vg_file_...`). Upload the image first via `POST /v1/files/upload`. Only image files are accepted."},"remixActions":{"type":"array","items":{"$ref":"#/components/schemas/RemixAction"},"description":"Optional edits applied to the project after the video is built, in order. Each action runs asynchronously; the response returns one remix action id per action. Captions and a logo are set with the `captionStyle` and `logoFileId` request fields above; recommended remix actions here are `CONVERT_IMAGES_TO_VIDEOS` to animate still images into clips, and `ADD_TRANSITIONS` to stamp transitions between sections and assets. See the [Remix actions](/remix-actions) guide."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, the video's generated OUTPUT files (AI images, video clips, voiceover audio, avatars) are created as temporary: guaranteed available for 24 hours, after which they may be archived and later deleted. This also covers files produced by post-build remix actions (e.g. generated background music, image-to-video conversions). Use this when your integration downloads or re-hosts the results itself and does not need VideoGen to retain them. The project and its metadata are unaffected. Defaults to false."},"autoExport":{"type":"boolean","default":false,"description":"When true, VideoGen exports an MP4 after the video is built (and after any `remixActions` on this request finish). The workflow run stays `running` until that export succeeds or fails. On success, poll `GET /v1/workflows/runs/{workflowRunId}` and use `downloadUrl`. Defaults to false."},"exportOptions":{"$ref":"#/components/schemas/ExportProjectRequest","description":"Export settings used when `autoExport` is true. Ignored when `autoExport` is false. Omitted fields use the same defaults as `POST /v1/projects/{projectId}/export`."}},"required":["fileId"],"title":"SlideshowToVideoRequest"},"PromptToVideoClipRequest":{"type":"object","properties":{"prompt":{"type":"string","description":"Text prompt describing the video to generate (e.g. `A golden retriever running through a sunlit meadow in slow motion, cinematic`)."},"imageFileIds":{"type":"array","items":{"type":"string"},"description":"Optional ids of previously uploaded reference images (e.g. `vg_file_...`) that guide the opening frame. Upload files via `POST /v1/files/upload` first."},"durationSeconds":{"type":"integer","minimum":1,"maximum":30,"description":"Desired clip length in whole seconds (1 to 30). Defaults to 10. The generated clip is clamped to the selected quality's supported range."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio","description":"Aspect ratio for the generated video. Defaults to 16:9 when omitted."},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Video generation quality tier (`LOW`, `STANDARD`, `HIGH`, or `MAX`). Also used for the opening-frame image. Optional; when omitted, your account's Default AI quality for video is used (change it at https://app.videogen.io/settings/account)."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, the generated OUTPUT files (the opening-frame image and the video clip) are created as temporary: guaranteed available for 24 hours, after which they may be archived and later deleted. Use this when your integration downloads or re-hosts the results itself and does not need VideoGen to retain them. The project and its metadata are unaffected. Defaults to false."},"autoExport":{"type":"boolean","default":false,"description":"When true, VideoGen exports an MP4 after the video is built (and after any `remixActions` on this request finish). The workflow run stays `running` until that export succeeds or fails. On success, poll `GET /v1/workflows/runs/{workflowRunId}` and use `downloadUrl`. Defaults to false."},"exportOptions":{"$ref":"#/components/schemas/ExportProjectRequest","description":"Export settings used when `autoExport` is true. Ignored when `autoExport` is false. Omitted fields use the same defaults as `POST /v1/projects/{projectId}/export`."}},"required":["prompt"],"description":"Creates a project from a text prompt and generates one short AI video clip. VideoGen generates an opening frame from the prompt (optionally guided by reference images), then animates that frame into a video inside an editable project. This workflow does not accept `remixActions`. For a standalone clip without a project, use `POST /v1/tools/generate-video-clip`. For longer narrated multi-scene videos, use `POST /v1/workflows/script-to-video`.","title":"PromptToVideoClipRequest"},"VideoToVideoRequestQuality":{"type":"string","enum":["LOW","STANDARD","HIGH","MAX"],"description":"Restyle quality (`LOW`, `STANDARD`, `HIGH`, or `MAX`). Higher tiers cost more and follow the source more faithfully. Optional; defaults to `HIGH`.","title":"VideoToVideoRequestQuality"},"VideoToVideoRequestAudio":{"type":"string","enum":["KEEP_ORIGINAL","GENERATE"],"description":"`KEEP_ORIGINAL` keeps the source video's audio under the restyled picture. `GENERATE` uses newly generated audio instead. Optional; defaults to `KEEP_ORIGINAL`.","title":"VideoToVideoRequestAudio"},"VideoToVideoRequest":{"type":"object","properties":{"videoFileId":{"type":"string","description":"Id of the video to restyle (e.g. `vg_file_...`), uploaded via `POST /v1/files/upload`. Provide exactly one of `videoFileId` or `videoUrl`."},"videoUrl":{"type":"string","maxLength":2048,"description":"Public `http://` or `https://` link to a video page or a video file to restyle. The run imports it before restyling, so you do not need to import it first. Private, login-only, and DRM-protected videos cannot be imported, and an unusable link fails the run. Provide exactly one of `videoFileId` or `videoUrl`."},"trimStartSeconds":{"type":"number","format":"double","minimum":0,"description":"Second of the video where the restyled part starts. Optional; defaults to `0`. Must leave at least 2 seconds before the end of the video."},"trimEndSeconds":{"type":"number","format":"double","minimum":0,"description":"Second of the video where the restyled part ends. Optional; defaults to `trimStartSeconds` plus 120, capped at the end of the video. The restyled part must be between 2 and 120 seconds long."},"prompt":{"type":"string","description":"Text prompt describing how the restyled video should look (e.g. `Hand-made claymation with soft studio lighting`). Must be non-empty."},"imageFileIds":{"type":"array","items":{"type":"string"},"description":"Optional ids of up to 10 previously uploaded reference images (e.g. `vg_file_...`) that guide the look of the restyle."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio","description":"Aspect ratio for the output video. With `videoFileId`, defaults to the supported aspect ratio (16:9, 9:16, or 1:1) closest to the source video when omitted. With `videoUrl`, defaults to 16:9, so pass it for vertical or square videos."},"quality":{"$ref":"#/components/schemas/VideoToVideoRequestQuality","description":"Restyle quality (`LOW`, `STANDARD`, `HIGH`, or `MAX`). Higher tiers cost more and follow the source more faithfully. Optional; defaults to `HIGH`."},"audio":{"$ref":"#/components/schemas/VideoToVideoRequestAudio","description":"`KEEP_ORIGINAL` keeps the source video's audio under the restyled picture. `GENERATE` uses newly generated audio instead. Optional; defaults to `KEEP_ORIGINAL`."},"remixActions":{"type":"array","items":{"$ref":"#/components/schemas/RemixAction"},"description":"Optional edits applied to the project after the video is built, in order. Each action runs asynchronously; the response returns one remix action id per action. See the [Remix actions](/remix-actions) guide."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, the generated OUTPUT files (the restyled video clips) are created as temporary: guaranteed available for 24 hours, after which they may be archived and later deleted. Use this when your integration downloads or re-hosts the results itself and does not need VideoGen to retain them. The project and its metadata are unaffected. Defaults to false."},"autoExport":{"type":"boolean","default":false,"description":"When true, VideoGen exports an MP4 after the video is built (and after any `remixActions` on this request finish). The workflow run stays `running` until that export succeeds or fails. On success, poll `GET /v1/workflows/runs/{workflowRunId}` and use `downloadUrl`. Defaults to false."},"exportOptions":{"$ref":"#/components/schemas/ExportProjectRequest","description":"Export settings used when `autoExport` is true. Ignored when `autoExport` is false. Omitted fields use the same defaults as `POST /v1/projects/{projectId}/export`."}},"required":["prompt"],"description":"Creates a project from a video and restyles it from a text prompt. Pass the video as exactly one of `videoFileId` or `videoUrl`. Long videos are split at shot changes and each part is restyled with the same settings, so the output keeps the restyled part's length and timing.","title":"VideoToVideoRequest"},"JobStatus":{"type":"string","enum":["pending","running","succeeded","failed","cancelled"],"description":"Base lifecycle status for asynchronous jobs. `pending` and `running` are in-progress; `succeeded`, `failed`, and `cancelled` are terminal. Workflows and tools additionally support `awaiting_approval` through their specific status schemas.","title":"JobStatus"},"WorkflowRunStatus":{"oneOf":[{"$ref":"#/components/schemas/JobStatus"},{"description":"Reference to WorkflowRunStatus1"}],"description":"Workflow run status. `awaiting_approval` means a retained result needs explicit approval because project content changed. Stop polling and return control to the caller. Approval reuses the result; success is reported only after the requested application and any requested export complete.","title":"WorkflowRunStatus"},"WorkflowType":{"type":"string","enum":["SCRIPT_TO_VIDEO","VOICEOVER_TO_VIDEO","SLIDESHOW_TO_VIDEO","STORYBOARD_TO_VIDEO","PROMPT_TO_VIDEO_CLIP","VIDEO_TO_VIDEO"],"description":"Workflow type identifier.","title":"WorkflowType"},"ErrorRequirement":{"type":"object","properties":{"type":{"type":"string","description":"Machine-readable requirement type in snake_case (e.g. `purchase_add_on`, `upgrade_plan`)."},"details":{"type":"object","additionalProperties":{"type":"string"},"description":"Key-value pairs with requirement-specific context (e.g. the add-on id to purchase)."}},"required":["type"],"description":"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).","title":"ErrorRequirement"},"ApiError":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable error description. For display and logging only; do not branch on its exact text."},"code":{"type":["string","null"],"description":"Machine-readable error code in snake_case (e.g. `invalid_api_key`, `insufficient_credits`). `null` when no specific code applies."},"requirement":{"oneOf":[{"$ref":"#/components/schemas/ErrorRequirement"},{"type":"null"}],"description":"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":{"type":["string","null"],"description":"Opaque internal error code for debugging. Include this when contacting support. `null` when not applicable."}},"required":["message"],"description":"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:\n\n- `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.\n\nCommon `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`.\n","title":"ApiError"},"WorkflowRun":{"type":"object","properties":{"workflowRunId":{"type":"string","description":"Opaque workflow run id."},"status":{"$ref":"#/components/schemas/WorkflowRunStatus"},"workflowType":{"$ref":"#/components/schemas/WorkflowType"},"progressPercentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Completion progress for the current attempt (0-100). Always `100` when `status` is `succeeded`."},"attemptIndex":{"type":"integer","minimum":0,"description":"Zero-based index of the current or most recent execution attempt."},"projectId":{"type":"string","description":"Id of the project created for this workflow run (e.g. `vg_proj_...`)."},"projectUrl":{"type":"string","format":"uri","description":"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."},"error":{"oneOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}],"description":"Error details. Always present as a field; `null` unless `status` is `failed`."},"exportId":{"type":["string","null"],"description":"Opaque export id (e.g. `vg_expo_...`) when this run was started with `autoExport: true` and the export succeeded. Always present as a field; `null` otherwise."},"downloadUrl":{"type":["string","null"],"format":"uri","description":"Private signed MP4 download URL when `autoExport` succeeded. Always present as a field; `null` otherwise. Valid for 7 days from when it was signed. This endpoint re-signs the URL when it is within an hour of expiring."},"downloadUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `downloadUrl` expires. `null` while `downloadUrl` is null."},"thumbnailUrl":{"type":["string","null"],"format":"uri","description":"Private signed thumbnail URL when `autoExport` succeeded. Always present as a field; `null` otherwise (and when no thumbnail is available). Re-signed automatically on the same terms as `downloadUrl`."},"thumbnailUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `thumbnailUrl` expires. `null` while `thumbnailUrl` is null."},"exportFileId":{"type":["string","null"],"description":"File id (e.g. `vg_file_...`) of the rendered MP4 when `autoExport` succeeded. Always present as a field; `null` otherwise. Pass it to `POST /v1/files/{fileId}/hydrate` for a fresh signed URL."}},"required":["workflowRunId","status","workflowType","progressPercentage","attemptIndex","projectId","projectUrl","error","exportId","downloadUrl","downloadUrlExpiresAt","thumbnailUrl","thumbnailUrlExpiresAt","exportFileId"],"title":"WorkflowRun"},"WorkflowRunListResponse":{"type":"object","properties":{"workflowRuns":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowRun"}},"hasMore":{"type":"boolean","description":"When true, there are more runs available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["workflowRuns","hasMore","nextCursor"],"description":"Paginated list of API-started workflow runs, most recently created first.","title":"WorkflowRunListResponse"},"ProjectResponseStatus":{"type":"string","enum":["generating","ready"],"description":"High-level project status.","title":"ProjectResponseStatus"},"ProjectResponse":{"type":"object","properties":{"projectId":{"type":"string","description":"Opaque project id (e.g. `vg_proj_...`)."},"assistantId":{"type":["string","null"],"description":"Opaque id of this project's assistant conversation (e.g. `vg_asst_...`). Use with the Assistant API to send follow-up messages or list the assistant's prior messages for this project. `null` for older projects created before assistant chats were attached at creation time."},"title":{"type":"string"},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio"},"status":{"$ref":"#/components/schemas/ProjectResponseStatus","description":"High-level project status."},"createdAt":{"type":"integer","description":"Seconds since epoch (Unix timestamp) when the project was created."},"updatedAt":{"type":"integer","description":"Seconds since epoch (Unix timestamp) when the project was last updated."},"projectUrl":{"type":"string","format":"uri","description":"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."}},"required":["projectId","assistantId","title","aspectRatio","status","createdAt","updatedAt","projectUrl"],"description":"Simplified project metadata.","title":"ProjectResponse"},"ListProjectsResponse":{"type":"object","properties":{"projects":{"type":"array","items":{"$ref":"#/components/schemas/ProjectResponse"}},"hasMore":{"type":"boolean","description":"When true, there are more projects available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["projects","hasMore","nextCursor"],"description":"Paginated list of projects, most recently updated first, including projects created in the dashboard.","title":"ListProjectsResponse"},"ExportProjectResponse":{"type":"object","properties":{"exportId":{"type":"string","description":"Opaque export id (e.g. `vg_expo_...`). Poll `GET /v1/projects/{projectId}/exports/{exportId}` or subscribe to webhooks for completion."}},"required":["exportId"],"title":"ExportProjectResponse"},"FileType":{"type":"string","enum":["IMAGE","VIDEO","AUDIO","PDF","SLIDESHOW","TEXT","LOTTIE"],"description":"File type. `TEXT` covers plain-text and editor-interchange documents; `LOTTIE` is a JSON animation.","title":"FileType"},"FileInfoScope":{"type":"string","enum":["GLOBAL","PROJECT","EXPORT","TEMPORARY","ENTITY"],"description":"File scope.\n\n- `GLOBAL`: user-uploaded or standalone generated files that persist indefinitely.\n- `PROJECT`: project-specific files (e.g. text-to-speech clips in a generated project).\n- `EXPORT`: project exports.\n- `TEMPORARY`: short-lived files guaranteed to be available for 24 hours, after which they may be archived at any time. Not analyzed (no description, transcript, or embedding).\n- `ENTITY`: files attached to a reusable entity (e.g. a voice sample for an actor), shared across your team.\n","title":"FileInfoScope"},"TranscriptWord":{"type":"object","properties":{"startSeconds":{"type":"number","format":"double","minimum":0,"description":"Start time of the word in seconds from the beginning of the audio."},"endSeconds":{"type":"number","format":"double","description":"End time of the word in seconds from the beginning of the audio. Must be greater than `startSeconds`."},"word":{"type":"string","description":"The spoken word, used verbatim for narration timing and captions."}},"required":["startSeconds","endSeconds","word"],"description":"A single timed word of a transcript.","title":"TranscriptWord"},"Transcript":{"type":"object","properties":{"languageCode":{"type":["string","null"],"description":"Optional BCP-47 language code of the spoken audio (e.g. `en`, `es`). Used to tag the transcript's language; omit if unknown."},"words":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptWord"},"description":"The transcript words, sorted by `startSeconds` and non-overlapping. Must contain at least one word."}},"required":["words"],"description":"A transcript of an audio file, as timed words in order.","title":"Transcript"},"FileSourceStatus":{"type":"string","enum":["pending","ready","failed","skipped"],"description":"`pending`: asset is still processing or has not been hydrated yet. `ready`: signed URL is available. `failed`: rendition generation failed. `skipped`: rendition does not apply to this file type (e.g. thumbnail for audio).","title":"FileSourceStatus"},"FileSource":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/FileSourceStatus","description":"`pending`: asset is still processing or has not been hydrated yet. `ready`: signed URL is available. `failed`: rendition generation failed. `skipped`: rendition does not apply to this file type (e.g. thumbnail for audio)."},"url":{"type":["string","null"],"description":"Signed URL. Present when status is `ready` and file has been recently hydrated. If missing, call the hydrate endpoint."},"expiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when the signed URL expires."},"width":{"type":["integer","null"],"description":"Rendition width in pixels, when known."},"height":{"type":["integer","null"],"description":"Rendition height in pixels, when known."},"fileBytes":{"type":["integer","null"],"description":"File size in bytes, when known."}},"required":["status"],"description":"A rendition source for a file (e.g. thumbnail, preview, download). Contains a signed URL and metadata.","title":"FileSource"},"FileAnalysisMetadataAnalysisLoadingState":{"type":"string","enum":["UNATTEMPTED","LOADING","FULFILLED","REJECTED"],"description":"Coarse-grained analysis state.\n\n- `UNATTEMPTED`: analysis has not started yet.\n- `LOADING`: analysis is in progress.\n- `FULFILLED`: analysis completed successfully. `description`, `transcript`, and `durationSeconds` are now populated where applicable for the file's type.\n- `REJECTED`: analysis failed permanently and will not be retried.\n","title":"FileAnalysisMetadataAnalysisLoadingState"},"FileAnalysisMetadata":{"type":"object","properties":{"analysisLoadingState":{"$ref":"#/components/schemas/FileAnalysisMetadataAnalysisLoadingState","description":"Coarse-grained analysis state.\n\n- `UNATTEMPTED`: analysis has not started yet.\n- `LOADING`: analysis is in progress.\n- `FULFILLED`: analysis completed successfully. `description`, `transcript`, and `durationSeconds` are now populated where applicable for the file's type.\n- `REJECTED`: analysis failed permanently and will not be retried.\n"},"analysisProgressPercentage":{"type":"number","format":"double","description":"Progress in `[0, 100]`. Always `100` when `analysisLoadingState` is `FULFILLED`. Otherwise the most recent in-flight progress reported by the analysis task (or `0` if no progress has been reported yet)."},"analysisAttemptIndex":{"type":"integer","description":"Zero-based index of the current analysis task attempt. Only present while analysis is still loading (`UNATTEMPTED` or `LOADING`); omitted once analysis reaches a terminal state."}},"required":["analysisLoadingState","analysisProgressPercentage"],"description":"Background analysis state for a file. Background analysis populates `description`, `transcript`, `durationSeconds`, and the search embedding after a file is uploaded or generated; this object lets you render a progress indicator while it runs (and skip rendering once it's done).\n","title":"FileAnalysisMetadata"},"FileInfo":{"type":"object","properties":{"fileId":{"type":"string","description":"File id (e.g. `vg_file_...`)."},"type":{"oneOf":[{"$ref":"#/components/schemas/FileType"},{"type":"null"}],"description":"File type. Null when the file is still being processed and the type has not yet been determined."},"scope":{"$ref":"#/components/schemas/FileInfoScope","description":"File scope.\n\n- `GLOBAL`: user-uploaded or standalone generated files that persist indefinitely.\n- `PROJECT`: project-specific files (e.g. text-to-speech clips in a generated project).\n- `EXPORT`: project exports.\n- `TEMPORARY`: short-lived files guaranteed to be available for 24 hours, after which they may be archived at any time. Not analyzed (no description, transcript, or embedding).\n- `ENTITY`: files attached to a reusable entity (e.g. a voice sample for an actor), shared across your team.\n"},"displayName":{"type":"string","description":"Display name for the file. For an uploaded file, analysis may replace the original filename with a short name based on the content."},"description":{"type":["string","null"]},"durationSeconds":{"type":["number","null"],"format":"double","description":"Duration in seconds for video and audio files. Null for images."},"transcript":{"oneOf":[{"$ref":"#/components/schemas/Transcript"},{"type":"null"}],"description":"Timed transcript for video and audio files, when available, as a `Transcript` object with timed `words`. Null for images or when no transcript has been generated. For plain transcript text, use `transcriptText`."},"transcriptText":{"type":["string","null"],"description":"Plain transcript text for video and audio files, when available. Null for images or when no transcript has been generated."},"downloadUrl":{"type":["string","null"],"format":"uri","description":"Private signed URL for the highest-quality downloadable rendition, provided at the top level for convenience. Valid for 7 days from when it was signed. `null` when the rendition is still processing or the URL has not been signed yet. See `downloadUrlExpiresAt` for the exact expiry and `downloadSource` for the full rendition metadata; call `POST /v1/files/{fileId}/hydrate` to refresh it."},"downloadUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `downloadUrl` expires. `null` when `downloadUrl` is null."},"thumbnailUrl":{"type":["string","null"],"format":"uri","description":"Private signed URL for the thumbnail rendition, provided at the top level for convenience. Valid for 7 days from when it was signed. `null` for file types that have no thumbnail (e.g. audio) or when it has not been signed yet. See `thumbnailSource` for the full rendition metadata."},"thumbnailUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `thumbnailUrl` expires. `null` when `thumbnailUrl` is null."},"thumbnailSource":{"oneOf":[{"$ref":"#/components/schemas/FileSource"},{"type":"null"}],"description":"Thumbnail image source. Populated after hydration."},"previewSource":{"oneOf":[{"$ref":"#/components/schemas/FileSource"},{"type":"null"}],"description":"Preview rendition source (720p for video, resized for images). Populated after hydration."},"downloadSource":{"oneOf":[{"$ref":"#/components/schemas/FileSource"},{"type":"null"}],"description":"Highest-quality downloadable rendition. Populated after hydration."},"hlsSource":{"oneOf":[{"$ref":"#/components/schemas/FileSource"},{"type":"null"}],"description":"Private HLS streaming source. Populated for video and audio files once streaming renditions are ready. Uses a signed token; treat like other signed sources."},"isPublicPreviewEnabled":{"type":"boolean","description":"Whether public preview is enabled for this file. When true, `staticPublicPreviewSource` is populated for all file types. For video and audio, `publicHlsUrl` and `publicPlaybackId` are also populated once embed streaming is ready."},"staticPublicPreviewSource":{"oneOf":[{"$ref":"#/components/schemas/FileSource"},{"type":"null"}],"description":"Permanent public URL for the file's highest-quality rendition. Populated when `isPublicPreviewEnabled` is true. Does not expire (`expiresAt` is null). Use for direct links to images, downloads, or any file type. For embedded video or audio players, prefer `publicPlaybackId`."},"publicHlsUrl":{"type":["string","null"],"description":"Public HLS streaming URL for video and audio. Only present when `isPublicPreviewEnabled` is true and embed streaming is ready. Prefer `publicPlaybackId` with `@videogen/player` for embeds."},"publicPlaybackId":{"type":["string","null"],"description":"Encoded public playback id (e.g. `vg_play_...`) for video and audio embeds. Pass this to `@videogen/player` or `@videogen/player-react`. Only present when `isPublicPreviewEnabled` is true and embed streaming is ready. For a permanent direct file URL (any type), use `staticPublicPreviewSource` instead."},"sourceToolType":{"type":"string","description":"Tool type that generated this file (e.g. `GENERATE_IMAGE`, `TEXT_TO_SPEECH`). Only present when the file was created by a tool execution."},"sourceToolExecutionId":{"type":"string","description":"Execution id of the tool call that generated this file (e.g. `vg_tool_...`). Only present when the file was created by a tool execution."},"fileAnalysisMetadata":{"$ref":"#/components/schemas/FileAnalysisMetadata","description":"Background analysis state for the file (used to populate `description`, `transcript`, `durationSeconds`, and the search embedding). Omitted when the file was returned via a path that does not check analysis progress (e.g. tool-result inline files and webhook payloads)."}},"required":["fileId","scope"],"description":"Metadata for a generated file. Obtain ids from tool results or `GET /v1/files`.","title":"FileInfo"},"ProjectExport":{"type":"object","properties":{"exportId":{"type":"string","description":"Opaque export id (e.g. `vg_expo_...`) matching the original request."},"projectId":{"type":"string","description":"Id of the exported project (e.g. `vg_proj_...`)."},"status":{"$ref":"#/components/schemas/JobStatus"},"progressPercentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Completion progress for the current attempt (0-100). Always `100` when `status` is `succeeded`."},"attemptIndex":{"type":"integer","minimum":0,"description":"Zero-based index of the current or most recent export attempt."},"downloadUrl":{"type":["string","null"],"format":"uri","description":"Private signed MP4 download URL, valid for 7 days from when it was signed. Always present as a field; `null` until `status` is `succeeded`. This endpoint automatically re-signs the URL when it is within an hour of expiring, so a fresh call to get the export always returns a URL valid long enough to use. See `downloadUrlExpiresAt` for the exact expiry. To fetch a fresh URL directly from the underlying file at any time, use `exportFileId` with the hydrate-file endpoint."},"downloadUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `downloadUrl` expires. `null` while `downloadUrl` is null."},"thumbnailUrl":{"type":["string","null"],"format":"uri","description":"Private signed thumbnail URL, valid for 7 days from when it was signed. Always present as a field; `null` until `status` is `succeeded` (and when no thumbnail is available). Re-signed automatically on the same terms as `downloadUrl`."},"thumbnailUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `thumbnailUrl` expires. `null` while `thumbnailUrl` is null."},"exportFileId":{"type":["string","null"],"description":"File id (e.g. `vg_file_...`) of the exported MP4. Always present as a field; `null` until `status` is `succeeded`. Pass it to `POST /v1/files/{fileId}/hydrate` to fetch fresh signed URLs directly from the file at any time, which is useful once the 24-hour URLs above have expired."},"file":{"oneOf":[{"$ref":"#/components/schemas/FileInfo"},{"type":"null"}],"description":"Hydrated export file metadata with signed download URLs. Always present as a field; `null` until `status` is `succeeded`. Its signed URLs follow the same 24-hour validity and automatic re-signing as `downloadUrl`."},"error":{"oneOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}],"description":"Error details. Always present as a field; `null` unless `status` is `failed`. An export whose file was deleted after it finished also reports `failed`, with `code` `export_file_unavailable`, because it can no longer return a download URL. Start a new export to get one."}},"required":["exportId","projectId","status","progressPercentage","attemptIndex","downloadUrl","downloadUrlExpiresAt","thumbnailUrl","thumbnailUrlExpiresAt","exportFileId","file","error"],"title":"ProjectExport"},"ListProjectExportsResponse":{"type":"object","properties":{"exports":{"type":"array","items":{"$ref":"#/components/schemas/ProjectExport"},"description":"Fully hydrated exports for this project, newest first. Each includes status, signed download/thumbnail URLs, and the embedded `file`."},"hasMore":{"type":"boolean","description":"When true, there are more exports available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["exports","hasMore","nextCursor"],"title":"ListProjectExportsResponse"},"TimelineInterchangeFormat":{"type":"string","enum":["FCPXML","PREMIERE_XML","OTIO","SRT"],"description":"Editor interchange document format. `FCPXML` is Final Cut Pro (also imported by DaVinci Resolve and others). `PREMIERE_XML` is the Final Cut 7 `xmeml` XML that Adobe Premiere Pro imports natively. `OTIO` is OpenTimelineIO, the vendor-neutral format. `SRT` is a SubRip caption sidecar.","title":"TimelineInterchangeFormat"},"TimelineInterchangeMediaDelivery":{"type":"string","enum":["REMOTE_URLS","BUNDLE"],"description":"How the interchange document references media. `REMOTE_URLS` produces a single document that links to signed media URLs. `BUNDLE` produces a zip containing the document plus every referenced media file, referenced by relative path, for durable offline relinking.","title":"TimelineInterchangeMediaDelivery"},"CreateTimelineInterchangeRequest":{"type":"object","properties":{"format":{"$ref":"#/components/schemas/TimelineInterchangeFormat"},"mediaDelivery":{"$ref":"#/components/schemas/TimelineInterchangeMediaDelivery"}},"title":"CreateTimelineInterchangeRequest"},"CreateTimelineInterchangeResponse":{"type":"object","properties":{"interchangeJobId":{"type":"string","description":"Opaque timeline interchange job id (e.g. `vg_inte_...`). Poll `GET /v1/timeline-interchange/{interchangeJobId}` for completion."}},"required":["interchangeJobId"],"title":"CreateTimelineInterchangeResponse"},"TimelineInterchange":{"type":"object","properties":{"interchangeJobId":{"type":"string","description":"Opaque timeline interchange job id (e.g. `vg_inte_...`) matching the original request."},"projectId":{"type":"string","description":"Id of the source project (e.g. `vg_proj_...`)."},"format":{"$ref":"#/components/schemas/TimelineInterchangeFormat"},"mediaDelivery":{"$ref":"#/components/schemas/TimelineInterchangeMediaDelivery"},"status":{"$ref":"#/components/schemas/JobStatus"},"progressPercentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Completion progress for the current attempt (0-100). Always `100` when `status` is `succeeded`."},"attemptIndex":{"type":"integer","minimum":0,"description":"Zero-based index of the current or most recent job attempt."},"downloadUrl":{"type":["string","null"],"format":"uri","description":"Private signed download URL for the interchange document (or the media bundle zip when `mediaDelivery` is `BUNDLE`), valid for 7 days from when it was signed. Always present as a field; `null` until `status` is `succeeded`. This endpoint automatically re-signs the URL when it is within an hour of expiring. To fetch a fresh URL directly from the underlying file at any time, use `interchangeFileId` with the hydrate-file endpoint."},"downloadUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `downloadUrl` expires. `null` while `downloadUrl` is null."},"interchangeFileId":{"type":["string","null"],"description":"File id (e.g. `vg_file_...`) of the interchange document or bundle zip. Always present as a field; `null` until `status` is `succeeded`. Pass it to `POST /v1/files/{fileId}/hydrate` to fetch fresh signed URLs directly from the file at any time."},"file":{"oneOf":[{"$ref":"#/components/schemas/FileInfo"},{"type":"null"}],"description":"Hydrated interchange file metadata with a signed download URL. Always present as a field; `null` until `status` is `succeeded`. Its signed URL follows the same 24-hour validity and automatic re-signing as `downloadUrl`."},"error":{"oneOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}],"description":"Error details. Always present as a field; `null` unless `status` is `failed`."}},"required":["interchangeJobId","projectId","format","mediaDelivery","status","progressPercentage","attemptIndex","downloadUrl","downloadUrlExpiresAt","interchangeFileId","file","error"],"title":"TimelineInterchange"},"RemixProjectRequest":{"type":"object","properties":{"remixActions":{"type":"array","items":{"$ref":"#/components/schemas/RemixAction"},"description":"Ordered list of edits to apply. Each runs asynchronously as its own remix action. Must contain at least one action."},"saveAsNewProject":{"type":"boolean","description":"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)."}},"required":["remixActions"],"title":"RemixProjectRequest"},"RemixProjectResponse":{"type":"object","properties":{"projectId":{"type":"string","description":"Id of the edited project (e.g. `vg_proj_...`; the duplicate when `saveAsNewProject` was true)."},"projectUrl":{"type":"string","format":"uri","description":"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":{"type":"array","items":{"type":"string"},"description":"Opaque remix action ids (e.g. `vg_rmix_...`), one per requested action in order."}},"required":["projectId","projectUrl","remixActionIds"],"description":"Returned when remix actions are accepted. Poll `GET /v1/projects/{projectId}/remix-actions` for status.","title":"RemixProjectResponse"},"RemixActionType":{"type":"string","enum":["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"],"description":"The kind of edit a remix action applies.","title":"RemixActionType"},"RemixActionRun":{"type":"object","properties":{"remixActionId":{"type":"string","description":"Opaque remix action id (e.g. `vg_rmix_...`)."},"type":{"$ref":"#/components/schemas/RemixActionType"},"status":{"$ref":"#/components/schemas/JobStatus"},"projectId":{"type":"string","description":"Id of the project this remix action edits (e.g. `vg_proj_...`)."},"projectUrl":{"type":"string","format":"uri","description":"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":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Completion progress for the current attempt (0-100). Always `100` when `status` is `succeeded`."},"attemptIndex":{"type":"integer","minimum":0,"description":"Zero-based index of the current or most recent execution attempt."},"error":{"oneOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}],"description":"Error details. Always present as a field; `null` unless `status` is `failed`."}},"required":["remixActionId","type","status","projectId","projectUrl","progressPercentage","attemptIndex","error"],"title":"RemixActionRun"},"ListRemixActionsResponse":{"type":"object","properties":{"remixActions":{"type":"array","items":{"$ref":"#/components/schemas/RemixActionRun"},"description":"Remix actions for the project, most recent first."},"hasMore":{"type":"boolean","description":"When true, there are more remix actions available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["remixActions","hasMore","nextCursor"],"title":"ListRemixActionsResponse"},"StartAssistantChatRequest":{"type":"object","properties":{"message":{"type":"string","description":"The first message to send to the assistant, exactly as a person would type it into the assistant on a new project."},"autoGenerate":{"type":"boolean","default":false,"description":"When true, the assistant picks the best workflow for the message and immediately starts generating, skipping the suggestion step. When the assistant message reaches `succeeded`, its `generation` carries the workflow run to poll."}},"required":["message"],"title":"StartAssistantChatRequest"},"StartAssistantChatResponse":{"type":"object","properties":{"messageId":{"type":"string","description":"Opaque assistant message id for the pending assistant reply (e.g. `vg_mesg_...`). Poll `GET /v1/assistant-messages/{messageId}`."},"assistantId":{"type":"string","description":"Opaque assistant chat id (e.g. `vg_asst_...`). Pass to `GET /v1/assistants/{assistantId}` and follow-up message/action calls."},"projectId":{"type":"string","description":"Opaque project id for the new chat (e.g. `vg_proj_...`)."},"projectUrl":{"type":"string","format":"uri","description":"Deep link to open this project in the VideoGen web app."}},"required":["messageId","assistantId","projectId","projectUrl"],"description":"Returned when a `POST /v1/assistants` call is accepted. Poll `messageId` for the pending assistant reply; keep `assistantId` / `projectId` to continue the chat and address the project.","title":"StartAssistantChatResponse"},"AssistantMessageStatus":{"type":"string","enum":["pending","running","succeeded","failed","cancelled"],"description":"Lifecycle status of an assistant chat message. `pending` and `running` are in-progress; `succeeded`, `failed`, and `cancelled` are terminal.","title":"AssistantMessageStatus"},"AssistantMessageAttachment":{"type":"object","properties":{"fileId":{"type":["string","null"],"description":"File id (e.g. `vg_file_...`) when the attachment is a storage file. `null` for attachments that are not resolvable storage files."},"displayName":{"type":"string","description":"Human-readable name of the attachment."}},"required":["displayName"],"description":"A file linked to an assistant chat message.","title":"AssistantMessageAttachment"},"AssistantWorkflowSuggestion":{"type":"object","properties":{"actionId":{"type":"string","description":"Opaque id to pass to the act-on-action endpoint to select this workflow."},"workflowType":{"$ref":"#/components/schemas/WorkflowType","description":"Identifier of the suggested workflow."},"title":{"type":"string","description":"Short human-readable name of the suggested workflow."},"description":{"type":"string","description":"One-line explanation of what this workflow will do."}},"required":["actionId","workflowType","title","description"],"description":"A starting-point workflow the assistant suggests for the conversation. Act on it with `POST /v1/assistants/{assistantId}/actions/{actionId}` to select the workflow and continue.","title":"AssistantWorkflowSuggestion"},"AssistantActionKind":{"type":"string","enum":["APPROVE_PLAN","APPLY_EDIT","RUN_TOOL","GENERATE","OPEN_IN_APP"],"description":"Normalized category of an actionable widget the assistant offered. `APPROVE_PLAN` accepts a proposed generation plan; `APPLY_EDIT` applies a proposed edit (e.g. a rewritten script); `RUN_TOOL` runs an inline tool; `GENERATE` starts building the video; `OPEN_IN_APP` requires the full web app — open the assistant's `projectUrl` instead of acting via the API.","title":"AssistantActionKind"},"AssistantActionDetail":{"type":"object","properties":{"summary":{"type":["string","null"],"description":"Human-readable summary of the proposed plan or edit (for `APPROVE_PLAN` and `APPLY_EDIT` actions)."},"creditsRemaining":{"type":["integer","null"],"description":"Credits currently remaining on your team (for the usage/credits widget). A whole number of credits."},"estimatedCredits":{"type":["integer","null"],"description":"Estimated credit cost of the current workflow (for the cost-estimate widget). A whole number of credits."}},"description":"Extra data for rendering this action inline (in a chat surface or integration) without opening the web app. Fields are populated only when relevant to the action's kind; all are optional.","title":"AssistantActionDetail"},"AssistantAction":{"type":"object","properties":{"actionId":{"type":"string","description":"Opaque id to pass to the act-on-action endpoint."},"kind":{"$ref":"#/components/schemas/AssistantActionKind"},"label":{"type":"string","description":"Human-readable label describing what acting on this will do."},"requiresApp":{"type":"boolean","description":"When true, this action can only be completed in the web app; open the assistant's `projectUrl` instead of calling the API."},"detail":{"$ref":"#/components/schemas/AssistantActionDetail","description":"Optional extra data for rendering this action inline without opening the app."}},"required":["actionId","kind","label","requiresApp"],"description":"An actionable widget the assistant offered on this turn. Act on it with `POST /v1/assistants/{assistantId}/actions/{actionId}` unless `requiresApp` is true.","title":"AssistantAction"},"AssistantMessage":{"oneOf":[{"type":"object","properties":{"role":{"type":"string","enum":["user"],"description":"Discriminator value: user"},"messageId":{"type":"string","description":"Opaque assistant message id (e.g. `vg_mesg_...`)."},"status":{"$ref":"#/components/schemas/AssistantMessageStatus"},"content":{"type":"string","description":"The user's message text."},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/AssistantMessageAttachment"},"description":"Files attached to this message."},"createdAt":{"type":"integer","description":"Seconds since epoch (Unix timestamp) when the message was created."}},"required":["role","messageId","status","content","attachments","createdAt"],"description":"A user-authored message in an assistant chat."},{"type":"object","properties":{"role":{"type":"string","enum":["assistant"],"description":"Discriminator value: assistant"},"messageId":{"type":"string","description":"Opaque assistant message id (e.g. `vg_mesg_...`)."},"status":{"$ref":"#/components/schemas/AssistantMessageStatus"},"content":{"type":["string","null"],"description":"The assistant's text reply. `null` while `status` is `pending` or `running`; may be empty when the assistant only offered widgets."},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/AssistantMessageAttachment"},"description":"Files attached to this message."},"workflowSuggestions":{"type":"array","items":{"$ref":"#/components/schemas/AssistantWorkflowSuggestion"},"description":"Workflow starting points the assistant suggested on this message. Empty when none were offered."},"actions":{"type":"array","items":{"$ref":"#/components/schemas/AssistantAction"},"description":"Actionable widgets the assistant offered on this message (plans, edits, tools, generate). Empty when none were offered."},"generation":{"oneOf":[{"$ref":"#/components/schemas/StartWorkflowRunResponse"},{"type":"null"}],"description":"Present when this message kicked off a workflow run (via `autoGenerate` on start, or acting on a workflow suggestion): the workflow run to poll via `GET /v1/workflows/runs/{workflowRunId}`."},"error":{"oneOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}],"description":"Error details. `null` unless `status` is `failed`."},"createdAt":{"type":"integer","description":"Seconds since epoch (Unix timestamp) when the message was created."}},"required":["role","messageId","status","content","attachments","workflowSuggestions","actions","generation","error","createdAt"],"description":"An assistant-authored message in an assistant chat, including any suggestions or actions it offered."}],"discriminator":{"propertyName":"role"},"description":"A single message in an assistant chat. Discriminated by `role`.","title":"AssistantMessage"},"GetAssistantResponse":{"type":"object","properties":{"assistantId":{"type":"string","description":"Opaque assistant chat id (e.g. `vg_asst_...`)."},"projectId":{"type":"string","description":"Opaque project id of the project this chat belongs to (e.g. `vg_proj_...`)."},"projectUrl":{"type":"string","format":"uri","description":"Deep link to open this chat's project in the VideoGen web app. Visible only to members of your team and project collaborators."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/AssistantMessage"},"description":"Every message in the chat in chronological order (oldest first)."}},"required":["assistantId","projectId","projectUrl","messages"],"description":"An assistant chat and every message it currently contains.","title":"GetAssistantResponse"},"SendAssistantMessageRequest":{"type":"object","properties":{"message":{"type":"string","description":"The message to send to the assistant in this project chat."}},"required":["message"],"title":"SendAssistantMessageRequest"},"SendAssistantMessageResponse":{"type":"object","properties":{"messageId":{"type":"string","description":"Opaque assistant message id for the pending assistant reply (e.g. `vg_mesg_...`). Poll `GET /v1/assistant-messages/{messageId}`."}},"required":["messageId"],"description":"Returned when a `POST /v1/assistants/{assistantId}/messages` call is accepted. Use `messageId` to poll the pending assistant reply.","title":"SendAssistantMessageResponse"},"ActOnAssistantActionRequestDecision":{"type":"string","enum":["APPROVE","REJECT"],"default":"APPROVE","description":"Whether to approve (apply) or reject the action. Defaults to `APPROVE`.","title":"ActOnAssistantActionRequestDecision"},"ActOnAssistantActionRequest":{"type":"object","properties":{"decision":{"$ref":"#/components/schemas/ActOnAssistantActionRequestDecision","default":"APPROVE","description":"Whether to approve (apply) or reject the action. Defaults to `APPROVE`."}},"title":"ActOnAssistantActionRequest"},"ActOnAssistantActionResponse":{"type":"object","properties":{"messageId":{"type":"string","description":"Opaque assistant message id for the assistant reply produced by acting on the action (e.g. `vg_mesg_...`). Poll `GET /v1/assistant-messages/{messageId}`."}},"required":["messageId"],"description":"Returned when a `POST /v1/assistants/{assistantId}/actions/{actionId}` call is accepted. Use `messageId` to poll the resulting assistant message.","title":"ActOnAssistantActionResponse"},"ContentPolicyConfig":{"type":"object","properties":{"maxPromptRewrites":{"type":"integer","minimum":0,"maximum":4,"default":0,"description":"Maximum number of automatic prompt rewrites to attempt after a content-policy rejection before failing. Must be an integer between 0 and 4. 0 (the default) fails on the first rejection and returns the moderation error so you can revise the prompt yourself. Higher values let the request automatically rephrase and retry the prompt."}},"description":"Controls how content-policy rejections are handled during generation.","title":"ContentPolicyConfig"},"GenerateImageRequest":{"type":"object","properties":{"prompt":{"type":"string","description":"Text prompt describing the image to generate. When reference images are provided, the prompt describes the desired transformation."},"imageFileIds":{"type":"array","items":{"type":"string"},"description":"Optional file ids of reference images (e.g. `[\"vg_file_...\"]`). Upload files first via `POST /v1/files/upload`, then pass the returned ids here. Maximum 4 images. When provided, the model uses these as guidance for generation."},"entityIds":{"type":"array","items":{"type":"string"},"description":"Optional actor, product, or visual-style entity ids (e.g. `[\"vg_enti_...\"]`). The model uses each entity as identity/reference the same way in-app image generation does. Can be combined with `imageFileIds`. A missing id returns not found; an inaccessible id returns a permission error."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio","description":"Aspect ratio for the generated image. Defaults to 16:9 when omitted."},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Image generation quality tier. Optional; when omitted, your account's Default AI quality for images is used (change it at https://app.videogen.io/settings/account)."},"contentPolicyConfig":{"$ref":"#/components/schemas/ContentPolicyConfig"},"watermarkMode":{"$ref":"#/components/schemas/WatermarkMode","default":"AUTO"},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["prompt"],"title":"GenerateImageRequest"},"StartToolExecutionResponse":{"type":"object","properties":{"toolExecutionId":{"type":"string","description":"Execution id (e.g. `vg_tool_...`)."}},"required":["toolExecutionId"],"description":"Returned when a tool execution is started. Use `toolExecutionId` to poll for results or cancel.","title":"StartToolExecutionResponse"},"GenerateVideoClipRequest":{"type":"object","properties":{"prompt":{"type":"string","description":"Text prompt describing the video to generate. Optional when reference media, `startFrameFileId`, or `spokenDialogue` is provided. Describe the video in plain language; any reference media you provide is incorporated automatically."},"startFrameFileId":{"type":"string","description":"Optional file id of the opening-frame still (e.g. `vg_file_...`). Upload first via `POST /v1/files/upload`. When set, this image is the first frame of the clip. If the same id also appears in `imageFileIds`, it is used only as the opening frame and dropped from the reference list. Can be the only input (prompt optional). Combining this with `videoFileIds` requires `quality: HIGH` or `quality: MAX`."},"imageFileIds":{"type":"array","items":{"type":"string"},"description":"Optional file ids of reference images (e.g. `[\"vg_file_...\"]`). Upload files first via `POST /v1/files/upload`, then pass the returned ids here. When provided, the images are used as visual guidance. To animate a specific still as the opening frame, pass it as `startFrameFileId` instead. Combining these with `videoFileIds` requires `quality: HIGH` or `quality: MAX`."},"videoFileIds":{"type":"array","items":{"type":"string"},"description":"Optional file ids of reference videos (e.g. `[\"vg_file_...\"]`). Upload files first via `POST /v1/files/upload`, then pass the returned ids here. They are used as motion or style guidance for the generated video, without guaranteeing exact reproduction. Combining these with `startFrameFileId` or `imageFileIds` requires `quality: HIGH` or `quality: MAX`."},"audioFileIds":{"type":"array","items":{"type":"string"},"description":"Optional file ids of reference audio clips (e.g. `[\"vg_file_...\"]`) used for lip-sync from that recording. Upload files first via `POST /v1/files/upload`, then pass the returned ids here. To have the model speak a line it generates itself, pass `spokenDialogue` instead (or in addition)."},"spokenDialogue":{"type":"string","description":"Optional exact line the subject should speak as native, lip-synced speech in the generated clip. The model synthesizes the voice from this text. Can be the only input. Combine with a visual `prompt`, `startFrameFileId`, or reference media. Combine with `audioFileIds` when you also have a reference recording."},"voiceDescription":{"type":"string","description":"Optional natural-language description of the voice that speaks `spokenDialogue` (for example, a warm, confident young man's voice). Used when `spokenDialogue` is set. When omitted, a clear natural voice is used."},"generateAudio":{"type":"boolean","default":false,"description":"When true, the generated video is guaranteed to include audio. When false, audio may still be present. Defaults to false."},"suppressBackgroundMusic":{"type":"boolean","default":false,"description":"When true, the generated clip will not include a musical soundtrack. Spoken dialogue and environmental sound are still allowed. Use this when you will add background music separately (for example at the project level). Defaults to false."},"durationSeconds":{"type":["integer","null"],"minimum":1,"maximum":30,"description":"Optional clip length in whole seconds (1 to 30). Omit or pass null for Auto (duration is estimated at generate time so spoken text or the visual beat fits, clamped to the selected quality's supported range). When set, that length is used as-is. This endpoint produces a single short clip. For longer, multi-scene, professionally edited videos, use a video workflow such as `POST /v1/workflows/script-to-video`."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio","description":"Aspect ratio for the generated video. Defaults to 16:9 when omitted."},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Video generation quality tier (`LOW`, `STANDARD`, `HIGH`, or `MAX`). Optional; when omitted, your account's Default AI quality for video is used (change it at https://app.videogen.io/settings/account)."},"contentPolicyConfig":{"$ref":"#/components/schemas/ContentPolicyConfig"},"watermarkMode":{"$ref":"#/components/schemas/WatermarkMode","default":"AUTO"},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"description":"At least one of `prompt`, `startFrameFileId`, `imageFileIds`, `videoFileIds`, `audioFileIds`, or `spokenDialogue` must be provided.","title":"GenerateVideoClipRequest"},"MotionGraphicSubToolMode":{"type":"string","enum":["AUTO","ENABLED","DISABLED"],"description":"Access mode for a motion graphic capability. AUTO uses the capability only when it is available on your plan (generated video clips require a paid plan). ENABLED forces the capability on and returns an upgrade error if your plan lacks it. DISABLED prevents the motion graphic from using the capability.","title":"MotionGraphicSubToolMode"},"MotionGraphicSubToolModes":{"type":"object","properties":{"generateImages":{"$ref":"#/components/schemas/MotionGraphicSubToolMode","description":"Whether the motion graphic may generate images. Defaults to AUTO."},"generateVideoClips":{"$ref":"#/components/schemas/MotionGraphicSubToolMode","description":"Whether the motion graphic may generate video clips. Requires a paid plan. Defaults to AUTO."},"generateVoiceover":{"$ref":"#/components/schemas/MotionGraphicSubToolMode","description":"Whether the motion graphic may generate voiceover audio. Defaults to AUTO."},"searchStockMedia":{"$ref":"#/components/schemas/MotionGraphicSubToolMode","description":"Whether the motion graphic may search stock media. Defaults to AUTO."}},"description":"Per-capability access modes for a motion graphic. Any omitted capability defaults to AUTO.","title":"MotionGraphicSubToolModes"},"GenerateMotionGraphicRequest":{"type":"object","properties":{"prompt":{"type":"string","description":"Text prompt describing the animated motion graphic to generate. Describe the on-screen elements, any text and how it should animate, and the overall motion in plain language."},"fileIds":{"type":"array","items":{"type":"string"},"description":"Optional file ids of uploaded reference media (images, videos, or audio) the motion graphic may display or animate (e.g. `[\"vg_file_...\"]`). Upload files first via `POST /v1/files/upload`, then pass the returned ids here."},"entityIds":{"type":"array","items":{"type":"string"},"description":"Optional actor, product, or visual-style entity ids (e.g. `[\"vg_enti_...\"]`). The motion graphic uses each entity as identity/reference the same way in-app motion graphic generation does. Can be combined with `fileIds`. Mentions in `prompt` are also collected. A missing id returns not found; an inaccessible id returns a permission error."},"durationSeconds":{"type":["integer","null"],"minimum":1,"maximum":300,"description":"Desired length of the motion graphic in seconds, a whole number between 1 and 300. When omitted, the duration is chosen automatically to fit the prompt (recommended)."},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio","description":"Aspect ratio for the generated motion graphic. Defaults to 16:9 when omitted."},"transparentBackground":{"type":"boolean","default":true,"description":"When true, renders the motion graphic with a transparent background as a WebM video suitable for overlaying on other video or images. Set to false for an opaque MP4. Defaults to true."},"subToolModes":{"$ref":"#/components/schemas/MotionGraphicSubToolModes","description":"Optional per-capability controls for the media the motion graphic may generate or fetch (generated images, generated video clips, generated voiceover, and stock media search). Each capability is AUTO, ENABLED, or DISABLED. Omit to use AUTO for every capability."},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["prompt"],"title":"GenerateMotionGraphicRequest"},"PronunciationReplacement":{"type":"object","properties":{"original":{"type":"string"},"replacement":{"type":"string"}},"required":["original","replacement"],"title":"PronunciationReplacement"},"TextToSpeechRequest":{"type":"object","properties":{"ttsText":{"type":"string"},"voiceId":{"type":"string","description":"Catalog `displayName` (e.g. `Matilda`) or voice id from `GET /v1/resources/tts-voices` (e.g. `vg_voic_...`). Only voices with `supportsDirectToolExecution` set to true are accepted."},"speechLanguageCode":{"type":["string","null"],"description":"ISO-639-1 language hint for pronunciation (e.g. `en`, `es`, `zh`)."},"pronunciationReplacements":{"type":"array","items":{"$ref":"#/components/schemas/PronunciationReplacement"}},"autoExpandPronunciationReplacements":{"type":"boolean","description":"When true, automatically expands numbers, symbols, acronyms, and other non-word tokens into their spoken forms before synthesis so the voice pronounces them correctly (e.g. `$100` → `one hundred dollars`, `NASA` → `nasa`, `3rd` → `third`). Defaults to false when omitted."},"voiceSpeed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"description":"Speech rate multiplier, between 0.5 (half speed) and 2 (double speed). Defaults to the voice's default speed."},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["ttsText","voiceId"],"title":"TextToSpeechRequest"},"GenerateSoundEffectRequest":{"type":"object","properties":{"prompt":{"type":"string","description":"A text description of the sound effect to generate."},"durationSeconds":{"type":["number","null"],"format":"double","minimum":1,"maximum":30,"description":"Desired length of the sound effect in seconds, between 1 and 30. Defaults to about 10 seconds when omitted."},"promptInfluence":{"type":["number","null"],"format":"double","minimum":0,"maximum":1,"description":"How closely the generated sound effect follows the prompt, between 0 (more creative, more variation) and 1 (more literal, less variation). Defaults to a balanced value when omitted."},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["prompt"],"title":"GenerateSoundEffectRequest"},"GenerateMusicRequest":{"type":"object","properties":{"prompt":{"type":"string","description":"A text description of the music to generate. Include genre, mood, instrumentation, and tempo for best results."},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["prompt"],"title":"GenerateMusicRequest"},"GenerateAvatarRequest":{"type":"object","properties":{"actorEntityId":{"type":"string","description":"The id of a built-in stock actor or an ACTOR entity (e.g. `vg_enti_...`) with an image reference."},"avatarQuality":{"$ref":"#/components/schemas/ModelQuality","description":"Avatar generation quality tier. Optional; when omitted, your account's Default AI quality for avatars is used."},"audioFileId":{"type":"string","description":"File id of an AUDIO file (e.g. `vg_file_...`), typically from a prior text-to-speech result. Upload a file first via `POST /v1/files/upload` or generate one with `POST /v1/tools/text-to-speech`, then pass the returned id here."},"watermarkMode":{"$ref":"#/components/schemas/WatermarkMode","default":"AUTO"},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["actorEntityId","audioFileId"],"description":"Generate a talking-head avatar from an ACTOR entity and audio.","title":"GenerateAvatarRequest"},"ImageAssetRequest":{"type":"object","properties":{"imageFileId":{"type":"string","description":"File id of the source image (e.g. `vg_file_...`). Upload a file first via `POST /v1/files/upload`, then pass the returned id here."},"watermarkMode":{"$ref":"#/components/schemas/WatermarkMode","default":"AUTO"},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["imageFileId"],"title":"ImageAssetRequest"},"VideoAssetRequest":{"type":"object","properties":{"videoFileId":{"type":"string","description":"File id of the source video (e.g. `vg_file_...`). Upload a file first via `POST /v1/files/upload`, then pass the returned id here."},"watermarkMode":{"$ref":"#/components/schemas/WatermarkMode","default":"AUTO"},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Number of output results to generate. Defaults to 1."},"isOutputTemporary":{"type":"boolean","default":false,"description":"When true, generated files are temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."}},"required":["videoFileId"],"title":"VideoAssetRequest"},"ToolExecutionStatus":{"oneOf":[{"$ref":"#/components/schemas/JobStatus"},{"description":"Reference to ToolExecutionStatus1"}],"description":"Tool execution status. `awaiting_approval` means generation completed but applying its retained result would overwrite newer project edits. Review it in the project's Tasks drawer. Stop polling and return control to the caller; this is not success or failure. Standalone asset generation does not require approval.","title":"ToolExecutionStatus"},"ToolSuccessResult":{"type":"object","properties":{"fileId":{"type":"string","description":"File id for the generated asset."},"type":{"$ref":"#/components/schemas/FileType","description":"File type."},"downloadUrl":{"type":["string","null"],"format":"uri","description":"Private signed download URL for the generated file, valid for 7 days from when it was signed. Provided at the top level for convenience so you don't have to read it out of `file`. When you GET a single execution it is automatically re-signed if within an hour of expiring; list endpoints do not re-sign, so there it may be expired (check `downloadUrlExpiresAt`). See `downloadUrlExpiresAt` for the exact expiry. Null only in the rare case that the highest-quality rendition is still finalizing."},"downloadUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `downloadUrl` expires. Null only when `downloadUrl` is null."},"thumbnailUrl":{"type":["string","null"],"format":"uri","description":"Private signed thumbnail URL for the generated file, valid for 7 days from when it was signed. Provided at the top level for convenience so you don't have to read it out of `file`. Re-signed on the same terms as `downloadUrl` (single-execution GET re-signs when near expiry; list endpoints do not). Null for file types that have no thumbnail (e.g. audio)."},"thumbnailUrlExpiresAt":{"type":["integer","null"],"description":"Seconds since epoch (Unix timestamp) when `thumbnailUrl` expires. Null when there is no thumbnail URL."},"file":{"$ref":"#/components/schemas/FileInfo","description":"Hydrated file metadata with signed download URLs (always present and hydrated for a succeeded result). Its signed URLs follow the same 24-hour validity and automatic re-signing as `downloadUrl`."}},"required":["fileId","type","downloadUrl","downloadUrlExpiresAt","thumbnailUrl","thumbnailUrlExpiresAt","file"],"description":"Result for a single generated file, including a retained result awaiting approval to apply to a project. Every field below is always present.","title":"ToolSuccessResult"},"ExecutedTool":{"type":"object","properties":{"toolExecutionId":{"type":"string","description":"Execution id matching the original request."},"status":{"$ref":"#/components/schemas/ToolExecutionStatus"},"toolType":{"type":"string","description":"Tool name (e.g. `GENERATE_IMAGE`, `TEXT_TO_SPEECH`)."},"progressPercentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Completion progress for the current attempt (0-100). Always `100` when `status` is `succeeded`."},"attemptIndex":{"type":"integer","minimum":0,"description":"Zero-based index of the current or most recent execution attempt."},"results":{"type":"array","items":{"$ref":"#/components/schemas/ToolSuccessResult"},"description":"One entry per retained generated file (each with signed URLs and a hydrated `file`) when `status` is `succeeded` or `awaiting_approval`. Always present; empty while generation is pending. Asset availability does not mean it has been applied to the project."},"error":{"oneOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}],"description":"Error details. Always present; `null` unless `status` is `failed`."}},"required":["toolExecutionId","status","toolType","progressPercentage","attemptIndex","results","error"],"title":"ExecutedTool"},"ToolExecutionListResponse":{"type":"object","properties":{"toolExecutions":{"type":"array","items":{"$ref":"#/components/schemas/ExecutedTool"}},"hasMore":{"type":"boolean","description":"When true, there are more executions available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["toolExecutions","hasMore","nextCursor"],"description":"Paginated list of API-started tool executions, most recently created first.","title":"ToolExecutionListResponse"},"GenerateTextRequest":{"type":"object","properties":{"prompt":{"type":"string","description":"The instruction or content to generate text from."},"system":{"type":["string","null"],"description":"Optional system instructions that steer the model's role, tone, and constraints."},"quality":{"$ref":"#/components/schemas/ModelQuality","description":"Text generation quality tier. Optional; when omitted, your account's Default AI quality for text is used (change it at https://app.videogen.io/settings/account)."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"Sampling temperature. Higher values produce more varied output. Defaults to the model's default."},"maxOutputTokens":{"type":"integer","minimum":1,"maximum":2000,"default":512,"description":"Maximum number of tokens to generate. Defaults to 512."}},"required":["prompt"],"title":"GenerateTextRequest"},"GenerateTextResponse":{"type":"object","properties":{"text":{"type":"string","description":"The generated text."}},"required":["text"],"title":"GenerateTextResponse"},"GetFilesResponse":{"type":"object","properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/FileInfo"}},"hasMore":{"type":"boolean","description":"When true, there are more files available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["files","hasMore","nextCursor"],"title":"GetFilesResponse"},"SearchFilesRequest":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language search query. The text is embedded and compared against file description vectors using cosine similarity."},"numResults":{"type":"integer","minimum":1,"maximum":100,"default":10,"description":"Number of results to return (1-100). Defaults to 10."},"selfOnly":{"type":"boolean","default":false,"description":"When true, only files created by the calling API key's user are returned. When false (default), all files accessible to the team are included."}},"required":["query"],"title":"SearchFilesRequest"},"SearchFilesResult":{"type":"object","properties":{"similarity":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Cosine similarity between the query embedding and the file description embedding. Ranges from 0 (no match) to 1 (identical). Values above 0.7 typically indicate strong relevance."},"file":{"$ref":"#/components/schemas/FileInfo"}},"required":["similarity","file"],"title":"SearchFilesResult"},"SearchFilesResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilesResult"}}},"required":["results"],"title":"SearchFilesResponse"},"CreateFileUploadRequest":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/FileType","description":"The type of file to upload. Optional; when omitted, the type is inferred after upload processing completes."},"displayName":{"type":"string","description":"Display name for the uploaded file. Analysis may replace this with a short name based on the file content and this original name."},"isTemporary":{"type":"boolean","default":false,"description":"When true, the file is temporary. Temporary files are guaranteed to be available for 24 hours, after which they may be archived at any time. Temporary files are not analyzed (no description, transcript, or embedding will be generated), so they will not appear in search results. Defaults to false."},"transcript":{"oneOf":[{"$ref":"#/components/schemas/Transcript"},{"type":"null"}],"description":"Optional pre-computed transcript for an audio or video upload, as timed `words`. When provided, transcription is skipped and caption timing matches your transcript. Ignored for non-audio/video files."}},"required":["displayName"],"title":"CreateFileUploadRequest"},"FileUploadResponse":{"type":"object","properties":{"fileId":{"type":"string","description":"The file id to use in subsequent API calls (e.g. `vg_file_...`)."},"uploadUrl":{"type":"string","description":"Pre-signed URL. PUT the raw file bytes to this URL to complete the upload."}},"required":["fileId","uploadUrl"],"title":"FileUploadResponse"},"CreateFileUrlImportRequest":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"description":"Public `http://` or `https://` link to a video page or a video file. Private, login-only, and DRM-protected videos cannot be imported."}},"required":["url"],"title":"CreateFileUrlImportRequest"},"CreateFileUrlImportResponse":{"type":"object","properties":{"fileImportId":{"type":"string","description":"Opaque file import id (e.g. `vg_fimp_...`). Poll `GET /v1/files/imports/{fileImportId}` for completion."}},"required":["fileImportId"],"title":"CreateFileUrlImportResponse"},"FileUrlImport":{"type":"object","properties":{"fileImportId":{"type":"string","description":"Opaque file import id (e.g. `vg_fimp_...`) matching the original request."},"status":{"$ref":"#/components/schemas/JobStatus"},"progressPercentage":{"type":"number","format":"double","minimum":0,"maximum":100,"description":"Completion progress for the current attempt (0-100). Always `100` when `status` is `succeeded`."},"attemptIndex":{"type":"integer","minimum":0,"description":"Zero-based index of the current or most recent import attempt."},"fileId":{"type":["string","null"],"description":"Id of the imported video file (e.g. `vg_file_...`). Always present as a field; `null` until `status` is `succeeded`."},"file":{"oneOf":[{"$ref":"#/components/schemas/FileInfo"},{"type":"null"}],"description":"Imported file metadata. Always present as a field; `null` until `status` is `succeeded`."},"error":{"oneOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}],"description":"Error details. Always present as a field; `null` unless `status` is `failed`."}},"required":["fileImportId","status","progressPercentage","attemptIndex","fileId","file","error"],"title":"FileUrlImport"},"V1EntitiesGetParametersEntityType":{"type":"string","enum":["ACTOR","PRODUCT","VISUAL_STYLE","SLIDESHOW_THEME","BRAND","LOCATION","PROP"],"title":"V1EntitiesGetParametersEntityType"},"EntityEntityType":{"type":"string","enum":["ACTOR","PRODUCT","VISUAL_STYLE","SLIDESHOW_THEME","BRAND","LOCATION","PROP"],"description":"ACTOR features a consistent character; PRODUCT features a consistent product you sell or promote; VISUAL_STYLE guides the look of generated images; SLIDESHOW_THEME is a shared slide design system (fonts, colors, layout) applied to every slide of a slideshow-to-video deck; BRAND holds a logo, a style guide image, and a writing style; LOCATION features a consistent place or set; PROP features a consistent background object that is not a product.","title":"EntityEntityType"},"EntityActorConfig":{"type":"object","properties":{"voiceDisplayName":{"type":["string","null"],"description":"Display name of the actor's voice when one is configured. Null otherwise."},"hasVoice":{"type":"boolean","description":"True when the actor has a configured voice."},"hasAvatarPresenter":{"type":"boolean","description":"True when the actor has a built-in presenter or image reference that can be used with `actorEntityId` for avatar generation."}},"required":["hasVoice","hasAvatarPresenter"],"description":"Read-only voice and avatar summary for an ACTOR entity. Always null for non-ACTOR entities.","title":"EntityActorConfig"},"EntityBrandConfig":{"type":"object","properties":{"fonts":{"type":"string","maxLength":1000,"description":"Font guidance, such as heading and body font names."},"colors":{"type":"string","maxLength":1000,"description":"Color guidance, including hex codes when available."},"writingStyle":{"type":"string","maxLength":1500,"description":"Voice and tone for spoken and on-screen copy."}},"required":["fonts","colors","writingStyle"],"description":"Visual and writing guidance for a BRAND entity. API requests store these fields but do not generate a style guide; upload and attach a guide with role `BRAND_STYLE_GUIDE` for visual generation. writingStyle guides assistant copy.","title":"EntityBrandConfig"},"EntityReferenceRole":{"type":"string","enum":["REFERENCE","BRAND_LOGO","BRAND_STYLE_GUIDE"],"description":"What the file is used for. REFERENCE is a regular reference image. BRAND_LOGO is a brand's overlay logo and is never used as a generation reference. BRAND_STYLE_GUIDE is a brand's visual style guide.","title":"EntityReferenceRole"},"EntityReference":{"type":"object","properties":{"fileId":{"type":"string","description":"The reference image file id (e.g. `vg_file_...`). Hydrate it via `GET /v1/files/{fileId}` to fetch a viewable URL."},"description":{"type":"string","description":"Optional description of the reference. Empty string when not set."},"role":{"$ref":"#/components/schemas/EntityReferenceRole","description":"What the file is used for. REFERENCE is a regular reference image. BRAND_LOGO is a brand's overlay logo and is never used as a generation reference. BRAND_STYLE_GUIDE is a brand's visual style guide."},"isDefault":{"type":"boolean","description":"When true, this is the entity's primary reference (used for its thumbnail)."}},"required":["fileId","description","role","isDefault"],"description":"A file attached to an entity as a reference image.","title":"EntityReference"},"Entity":{"type":"object","properties":{"entityId":{"type":"string","description":"The entity id (e.g. `vg_enti_...`)."},"entityType":{"$ref":"#/components/schemas/EntityEntityType","description":"ACTOR features a consistent character; PRODUCT features a consistent product you sell or promote; VISUAL_STYLE guides the look of generated images; SLIDESHOW_THEME is a shared slide design system (fonts, colors, layout) applied to every slide of a slideshow-to-video deck; BRAND holds a logo, a style guide image, and a writing style; LOCATION features a consistent place or set; PROP features a consistent background object that is not a product."},"name":{"type":"string","description":"Display name."},"description":{"type":"string","description":"Optional description. Empty string when not set."},"actorConfig":{"oneOf":[{"$ref":"#/components/schemas/EntityActorConfig"},{"type":"null"}],"description":"Voice and presenter summary for ACTOR entities. Null for non-ACTOR entities."},"brandConfig":{"oneOf":[{"$ref":"#/components/schemas/EntityBrandConfig"},{"type":"null"}],"description":"Brand guidance for BRAND entities. Null for other entity types."},"references":{"type":"array","items":{"$ref":"#/components/schemas/EntityReference"},"description":"Reference images attached to the entity."},"createdAt":{"type":"integer","description":"Seconds since epoch (Unix timestamp) when the entity was created."},"updatedAt":{"type":"integer","description":"Seconds since epoch (Unix timestamp) when the entity was last updated."},"isBuiltIn":{"type":"boolean","description":"When true, this is a VideoGen catalog entity. Built-in entities cannot be updated, archived, or have references added or removed."}},"required":["entityId","entityType","name","description","references","createdAt","updatedAt"],"description":"A reusable actor, product, visual style, slideshow theme, brand, location, or prop. Attach its reference images to workflows for consistent characters, looks, places, and slide designs.","title":"Entity"},"ListEntitiesResponse":{"type":"object","properties":{"entities":{"type":"array","items":{"$ref":"#/components/schemas/Entity"}},"hasMore":{"type":"boolean","description":"When true, there are more entities available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["entities","hasMore","nextCursor"],"title":"ListEntitiesResponse"},"CreateEntityRequestEntityType":{"type":"string","enum":["ACTOR","PRODUCT","VISUAL_STYLE","SLIDESHOW_THEME","BRAND","LOCATION","PROP"],"description":"ACTOR features a consistent character; PRODUCT features a consistent product you sell or promote; VISUAL_STYLE guides the look of generated images; SLIDESHOW_THEME is a shared slide design system (fonts, colors, layout) applied to every slide of a slideshow-to-video deck; BRAND holds a logo, a style guide image, and a writing style; LOCATION features a consistent place or set; PROP features a consistent background object that is not a product.","title":"CreateEntityRequestEntityType"},"CreateEntityRequest":{"type":"object","properties":{"entityType":{"$ref":"#/components/schemas/CreateEntityRequestEntityType","description":"ACTOR features a consistent character; PRODUCT features a consistent product you sell or promote; VISUAL_STYLE guides the look of generated images; SLIDESHOW_THEME is a shared slide design system (fonts, colors, layout) applied to every slide of a slideshow-to-video deck; BRAND holds a logo, a style guide image, and a writing style; LOCATION features a consistent place or set; PROP features a consistent background object that is not a product."},"name":{"type":"string","description":"Display name."},"description":{"type":"string","description":"Optional description."},"brandConfig":{"$ref":"#/components/schemas/EntityBrandConfig","description":"Optional configuration for BRAND entities. Omit to create a blank brand."}},"required":["entityType","name"],"title":"CreateEntityRequest"},"UpdateEntityRequest":{"type":"object","properties":{"name":{"type":["string","null"],"description":"New display name. Omit to leave unchanged."},"description":{"type":["string","null"],"description":"New description. Omit to leave unchanged."},"brandConfig":{"$ref":"#/components/schemas/EntityBrandConfig","description":"Complete replacement configuration for a BRAND entity. Omit to leave unchanged."}},"description":"At least one field must be provided.","title":"UpdateEntityRequest"},"EntityArchiveResponse":{"type":"object","properties":{"entityId":{"type":"string","description":"The id of the archived entity."},"archived":{"type":"boolean","description":"Always true on success."}},"required":["entityId","archived"],"title":"EntityArchiveResponse"},"AddEntityReferenceRequestRole":{"type":"string","enum":["REFERENCE","BRAND_LOGO","BRAND_STYLE_GUIDE"],"default":"REFERENCE","description":"What the file is used for. BRAND_LOGO and BRAND_STYLE_GUIDE are only allowed on BRAND entities, and attaching one replaces the brand's previous logo or style guide. BRAND_LOGO is applied as the video logo overlay and is never used as a generation reference.","title":"AddEntityReferenceRequestRole"},"AddEntityReferenceRequest":{"type":"object","properties":{"fileId":{"type":"string","description":"The file id (e.g. `vg_file_...`) of an image to attach as a reference."},"description":{"type":"string","description":"Optional description of the reference."},"role":{"$ref":"#/components/schemas/AddEntityReferenceRequestRole","default":"REFERENCE","description":"What the file is used for. BRAND_LOGO and BRAND_STYLE_GUIDE are only allowed on BRAND entities, and attaching one replaces the brand's previous logo or style guide. BRAND_LOGO is applied as the video logo overlay and is never used as a generation reference."},"isDefault":{"type":"boolean","default":false,"description":"When true, make this the entity's primary reference (used for its thumbnail)."}},"required":["fileId"],"title":"AddEntityReferenceRequest"},"RemoveEntityReferenceRequest":{"type":"object","properties":{"fileId":{"type":"string","description":"The file id (e.g. `vg_file_...`) of the reference to remove."}},"required":["fileId"],"title":"RemoveEntityReferenceRequest"},"TtsVoiceDisplayGender":{"type":"string","enum":["MALE","FEMALE","NEUTRAL"],"description":"Voice gender.","title":"TtsVoiceDisplayGender"},"TtsVoice":{"type":"object","properties":{"voiceId":{"type":"string","description":"Voice id (e.g. `vg_voic_...`). Pass this or `displayName` as `voiceId` to `POST /v1/tools/text-to-speech`."},"languageCode":{"type":"string","description":"Locale tag for the voice (e.g. `en-US`, `es-ES`)."},"displayName":{"type":"string","description":"Human-readable voice name."},"displayGender":{"$ref":"#/components/schemas/TtsVoiceDisplayGender","description":"Voice gender."},"accent":{"type":["string","null"],"description":"Accent (e.g. `american`, `british`)."},"description":{"type":["string","null"],"description":"Description of the voice."},"supportsDirectToolExecution":{"type":"boolean","description":"When false, this voice cannot be used directly with `POST /v1/tools/text-to-speech`. All voices, regardless of this field, can be used in full video generation workflows such as script-to-video."},"supportsAllLanguages":{"type":"boolean","description":"When true, this voice can synthesize text in any language regardless of its `languageCode`. When false, the voice only supports its listed language."},"isDeprecated":{"type":"boolean","description":"When true, this voice is deprecated and may be removed in a future API version. Prefer non-deprecated voices for new integrations."}},"required":["voiceId","languageCode","displayName","displayGender","supportsDirectToolExecution","supportsAllLanguages","isDeprecated"],"description":"A text-to-speech voice.","title":"TtsVoice"},"TtsVoiceListResponse":{"type":"object","properties":{"ttsVoices":{"type":"array","items":{"$ref":"#/components/schemas/TtsVoice"}},"hasMore":{"type":"boolean","description":"When true, there are more voices available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["ttsVoices","hasMore","nextCursor"],"title":"TtsVoiceListResponse"},"Language":{"type":"object","properties":{"languageCode":{"type":"string","description":"The language code to pass to a `TRANSLATE_PROJECT` remix action (e.g. `es`, `fr`, `ja`)."},"name":{"type":"string","description":"Human-readable English name of the language (e.g. `Spanish`)."}},"required":["languageCode","name"],"description":"A language a project can be translated into.","title":"Language"},"LanguageListResponse":{"type":"object","properties":{"languages":{"type":"array","items":{"$ref":"#/components/schemas/Language"}}},"required":["languages"],"title":"LanguageListResponse"},"WebhookEventName":{"type":"string","enum":["tool_execution.awaiting_approval","tool_execution.succeeded","tool_execution.failed","tool_execution.cancelled","workflow_run.awaiting_approval","workflow_run.succeeded","workflow_run.failed","workflow_run.cancelled","project_export.succeeded","project_export.failed","project_export.cancelled","assistant_message.succeeded","assistant_message.failed","assistant_message.cancelled","file.upload.completed","file.upload.failed","file.playback_ready","file.download_ready","file.analysis_completed","file.analysis_failed"],"description":"All webhook event types. Use when creating or listing webhook endpoints.","title":"WebhookEventName"},"WebhookEndpoint":{"type":"object","properties":{"endpointId":{"type":"string","description":"Webhook endpoint id (e.g. `ep_...`)."},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventName"}},"description":{"type":["string","null"]},"createdAt":{"type":"integer","description":"Seconds since epoch (Unix timestamp) when the endpoint was created."},"signingSecret":{"type":"string","description":"HMAC secret for verifying [Standard Webhooks](https://www.standardwebhooks.com/) signatures. Only returned once on create; store it securely."},"signingSecretLast4":{"type":"string","description":"Last four characters of the signing secret, for display purposes."}},"required":["endpointId","url","events","createdAt"],"title":"WebhookEndpoint"},"WebhookEndpointListResponse":{"type":"object","properties":{"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}},"hasMore":{"type":"boolean","description":"When true, there are more endpoints available. Pass `nextCursor` as the `cursor` query param to fetch the next page."},"nextCursor":{"type":["string","null"],"description":"Opaque cursor to fetch the next page. `null` when `hasMore` is false."}},"required":["endpoints","hasMore","nextCursor"],"title":"WebhookEndpointListResponse"},"CreateWebhookEndpointRequest":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"HTTPS URL that will receive webhook POST requests."},"description":{"type":["string","null"]},"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventName"},"description":"Webhook event names to subscribe to. Must contain at least one event."}},"required":["url","events"],"title":"CreateWebhookEndpointRequest"},"MeResponse":{"type":"object","properties":{"apiKeyId":{"type":"string","description":"The id of the API key used to authenticate this request."},"apiKeyNickname":{"type":"string","description":"The nickname given to the API key when it was created."},"email":{"type":"string","description":"The email address of the account the API key belongs to."},"displayName":{"type":["string","null"],"description":"The display name of the account the API key belongs to. `null` if the account has not set one."},"teamId":{"type":"string","description":"The id of the team the API key belongs to."}},"required":["apiKeyId","apiKeyNickname","email","displayName","teamId"],"title":"MeResponse"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key from [app.videogen.io/api](https://app.videogen.io/api). The full key is only shown once when you create it."}}}}