Skip to content
Create a key

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

List the exports of a project

list_exportsGET/v1/projects/{projectId}/exportsBeta

Lists the exports of a project, newest first, optionally of one composition only.

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

About

Call this to find the exports of a project, for example after accepting several clips, or to recover the export of a request whose answer you lost. Pass compositionId to see the exports of one composition only. The list is newest first and paged with cursor and limit. Every finished export whose file is kept comes with its own fresh downloadUrl, as get_export (GET /v1/exports/{exportId}) gives it; export files are kept for a limited time, see fileDeletesAt.

Example use

A script loses the answer of a create_export (POST /v1/compositions/{compositionId}/exports) call after a network error. It lists the exports of the project, finds the one for its composition, and goes on following that export instead of starting a second one.

Endpoint

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

Parameters

Path

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

Query

NameTypeRequiredDescription
compositionIdstringOptionalOnly the exports of this composition of the project. It starts with cmp_. Matches ^cmp_[0-9a-f]{20}$.
limitintegerOptionalHow many items to return, from 1 to 100. Defaults to 20. From 1 to 100. Default 20.
cursorstringOptionalThe nextCursor value from the previous page. Leave it out to get the first page. From 1 to 512 characters.

Request

List the exports of a project.

Request example
curl "https://api.gpt-video.com/v1/projects/prj_7c2e9a4f1b3d4e8096a5/exports" \
  -H "Authorization: Bearer $GPT_VIDEO_API_KEY"
const res = await fetch("https://api.gpt-video.com/v1/projects/prj_7c2e9a4f1b3d4e8096a5/exports", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${process.env.GPT_VIDEO_API_KEY}`,
  },
});
const data = await res.json();
console.log(data);
import os

import requests

r = requests.get(
    "https://api.gpt-video.com/v1/projects/prj_7c2e9a4f1b3d4e8096a5/exports",
    headers={
        "Authorization": f"Bearer {os.environ['GPT_VIDEO_API_KEY']}",
    },
)
data = r.json()
print(data)
{
  "method": "tools/call",
  "params": {
    "name": "list_exports",
    "arguments": {
      "projectId": "prj_7c2e9a4f1b3d4e8096a5"
    }
  }
}

Response

A successful call answers HTTP 200.

Fields to check

NameTypeDescription
data[].idstringThe export id. It starts with rnd_.
data[].jobIdstring or nullThe job that renders this export, to read with get_job (GET /v1/jobs/{jobId}). It starts with job_; null while the export has no job yet.
data[].statusstringqueued and rendering are still working; done, failed and cancelled are final.
data[].downloadUrlstring or nullA link that downloads the MP4 with no API key, for 15 minutes and for this file only. Only get_export (GET /v1/exports/{exportId}) and list_exports (GET /v1/projects/{projectId}/exports) give one, once the export is done and while the file is kept; every read gives a new link. create_export (POST /v1/compositions/{compositionId}/exports) always answers null.
data[].downloadUrlExpiresAtstring or nullWhen downloadUrl stops working; null when there is no link.
hasMorebooleantrue when there are more items after this page.
nextCursorstring or nullSend it as cursor to get the next page. It is null on the last page.

Response example

HTTP 200
{
  "data": [
    {
      "id": "rnd_0f6b3e9d2c7a4158b4a3",
      "compositionId": "cmp_4e8c2a6f09d14b73a1e5",
      "projectId": "prj_7c2e9a4f1b3d4e8096a5",
      "jobId": "job_a3e9d05c7b1f4e2896d4",
      "revision": 0,
      "status": "done",
      "progress": 1,
      "errorMessage": null,
      "createdAt": "2026-09-01T10:10:00.000Z",
      "finishedAt": "2026-09-01T10:15:00.000Z",
      "file": {
        "mimeType": "video/mp4",
        "sizeBytes": 18874368,
        "durationSec": 30,
        "width": 1080,
        "height": 1920
      },
      "downloadUrl": "https://www.gpt-video.com/media/ast_c47d2e8a19b54f06d2e1?exp=1788258600&sig=9b2e61c04d7f3a58e1b6c2d9f0a4e7b3",
      "downloadUrlExpiresAt": "2026-09-01T10:30:00.000Z",
      "fileDeletesAt": "2026-09-15T10:15:00.000Z",
      "fileDeletedAt": null
    }
  ],
  "hasMore": false,
  "nextCursor": null
}
All response fields
NameTypeRequiredDescription
dataarray of objectsRequiredThe items of this page.
data[]Export objectOptionalDescribed in Export object.
hasMorebooleanRequiredtrue when there are more items after this page.
nextCursorstring or nullRequiredSend it as cursor to get the next page. It is null on the last page.
More examples

List the exports of one composition

GET /v1/projects/prj_7c2e9a4f1b3d4e8096a5/exports?compositionId=cmp_4e8c2a6f09d14b73a1e5&limit=10

HTTP 200
{
  "data": [
    {
      "id": "rnd_0f6b3e9d2c7a4158b4a3",
      "compositionId": "cmp_4e8c2a6f09d14b73a1e5",
      "projectId": "prj_7c2e9a4f1b3d4e8096a5",
      "jobId": "job_a3e9d05c7b1f4e2896d4",
      "revision": 0,
      "status": "done",
      "progress": 1,
      "errorMessage": null,
      "createdAt": "2026-09-01T10:10:00.000Z",
      "finishedAt": "2026-09-01T10:15:00.000Z",
      "file": {
        "mimeType": "video/mp4",
        "sizeBytes": 18874368,
        "durationSec": 30,
        "width": 1080,
        "height": 1920
      },
      "downloadUrl": "https://www.gpt-video.com/media/ast_c47d2e8a19b54f06d2e1?exp=1788258600&sig=9b2e61c04d7f3a58e1b6c2d9f0a4e7b3",
      "downloadUrlExpiresAt": "2026-09-01T10:30:00.000Z",
      "fileDeletesAt": "2026-09-15T10:15:00.000Z",
      "fileDeletedAt": null
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

A project that does not exist

GET /v1/projects/prj_9f0d3b7e1c5a4d28b6f3/exports

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

Errors

CodeStatusWhenWhat to do
NOT_FOUND404A project that does not existChange the request, then send it again.

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

Cost

No credits are used.

  • create_export (POST /v1/compositions/{compositionId}/exports) Export a composition
  • get_export (GET /v1/exports/{exportId}) Get an export
  • get_project (GET /v1/projects/{projectId}) Get a project

Questions

Does the list include failed and cancelled exports?

Yes, every export of the project is listed with its status. A failed or cancelled one has no file; export the composition again for a new one.

What if compositionId is not a composition of this project?

The call answers NOT_FOUND, the same as for a composition that does not exist.

View as Markdown