Export your video
Once a workflow has built your project (and any remix actions have finished), export it to an MP4. The export runs asynchronously: start it, poll until it finishes, then download from the returned URL.
Export and download
Start the export, then poll until status is succeeded. The SDK helpers pollProjectExport (TS) and poll_project_export (Python) loop for you and return the downloadUrl.
TypeScript
Python
cURL
Each poll response includes progressPercentage (0-100) for the current attempt, so you can render a live progress bar. The downloadUrl is present once status is succeeded.
Watermark and end screen
Exporting requires a paid plan in the app, but the API lets you export for free. Free exports carry two pieces of VideoGen branding: a watermark overlaid on the video (watermarkMode) and a short “Made with VideoGen” end screen appended to it (endScreenMode). Both are account-level entitlements controlled by the Production API add-on: with the add-on you can remove either or both, without it a request to remove them returns an error.
To export with no VideoGen branding, purchase the Production API add-on and set both to NONE:
watermarkMode accepts:
endScreenMode accepts the same values and behaves the same way, for the “Made with VideoGen” end screen:
Both default to AUTO, so leaving them unset keeps your exports working whether or not the add-on is active: branding is applied when required and dropped once the add-on is in place.
Signed URLs and expiry
downloadUrl and thumbnailUrl are private signed URLs. Each is valid for 7 days from when it was signed (downloadUrlExpiresAt and thumbnailUrlExpiresAt give the exact expiry, in seconds since epoch). Getting the export re-signs a URL automatically when it is within an hour of expiring, so a fresh call to GET /v1/projects/{projectId}/exports/{exportId} always returns a URL that is valid long enough to use. Once the export has finished, you can rely on this endpoint to always hand back a working URL: don’t cache the URL string long-term, just fetch the export again when you need it.
A succeeded export also returns the full hydrated export file object (same shape as GET /v1/files/{fileId}), so you have the file’s metadata and every rendition’s signed URLs in one call.
Every endpoint that returns hydrated files auto-rehydrates. Any response that carries signed file URLs — GET /v1/projects/{projectId}/exports/{exportId}, GET /v1/tools/executions/{toolExecutionId}, and the like — re-signs URLs that are within an hour of expiring before returning them, so you never receive an already-expired URL from these endpoints. The only exceptions are the file endpoints themselves — GET /v1/files/{fileId} and POST /v1/files/{fileId}/hydrate — which are the explicit, on-demand hydration paths you call directly when you’re holding just a file id.
The response also includes exportFileId, the file id of the exported MP4. Pass it to POST /v1/files/{fileId}/hydrate to fetch fresh signed URLs straight from the file at any time (useful if you kept only the file id and the 24-hour URLs have since expired).
Managing projects
The Projects API also lets you list and inspect projects:
Next steps
- Embedding videos: Make a file publicly streamable and embed it with the VideoGen player.
- Handling async tasks: Poll or use webhooks for export completion.
- REST API reference: Full endpoint documentation.