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 tool runs

list_tool_runsGET/v1/tool-runsBeta

Lists the voiceovers, audio separations and brainstorms of the account, newest first.

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 tool runs of the account, for example to recover the run of a request whose answer you lost. Pass tool to see one kind only. The list is newest first and paged with cursor and limit. A page never carries download links: read a run with get_tool_run (GET /v1/tool-runs/{toolRunId}) to get one.

Example use

A script that lost the answer of a voiceover request lists the latest runs of that tool to find it again. It then reads the run with get_tool_run (GET /v1/tool-runs/{toolRunId}) to get a fresh download link.

Endpoint

Code
GET https://api.gpt-video.com/v1/tool-runs
  • 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

Query

NameTypeRequiredDescription
toolstringOptionalOnly the runs of this tool. Leave it out to list every tool. One of voiceover, audio_separation, brainstorm.
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 tool runs.

Request example
curl "https://api.gpt-video.com/v1/tool-runs" \
  -H "Authorization: Bearer $GPT_VIDEO_API_KEY"
const res = await fetch("https://api.gpt-video.com/v1/tool-runs", {
  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/tool-runs",
    headers={
        "Authorization": f"Bearer {os.environ['GPT_VIDEO_API_KEY']}",
    },
)
data = r.json()
print(data)
{
  "method": "tools/call",
  "params": {
    "name": "list_tool_runs",
    "arguments": {}
  }
}

Response

A successful call answers HTTP 200.

Fields to check

NameTypeDescription
data[].idstringThe tool run id. It starts with run_.
data[].statusstringqueued and running are still working; done and failed are final.
data[].file.downloadUrlstring or nullA link to download the file, on a read of a finished run; null otherwise.
data[].file.downloadUrlExpiresAtstring or nullAn ISO 8601 time in UTC.
data[].jobIdstring or nullThe job that carries out the run, to follow with get_job (GET /v1/jobs/{jobId}); null once it is gone.
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": "run_b014441ea91a51965c46",
      "tool": "voiceover",
      "status": "done",
      "progress": 1,
      "errorMessage": null,
      "voiceover": {
        "title": "Launch voiceover",
        "script": "Meet the editor that turns one long video into ten short clips.",
        "voice": "en-aria",
        "language": "en"
      },
      "separation": null,
      "brainstorm": null,
      "file": {
        "assetId": "ast_e8a35ed674148f27b585",
        "mimeType": "audio/mpeg",
        "durationSec": 14,
        "sizeBytes": 224000,
        "downloadUrl": null,
        "downloadUrlExpiresAt": null
      },
      "ideas": null,
      "jobId": "job_bd92cb70ed9c45575464",
      "createdAt": "2026-08-31T21:30:00.000Z",
      "finishedAt": "2026-08-31T21:32:00.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}
All response fields
NameTypeRequiredDescription
dataarray of objectsRequiredThe items of this page.
data[]Tool run objectOptionalDescribed in Tool run 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 voiceovers only

GET /v1/tool-runs?tool=voiceover&limit=10

HTTP 200
{
  "data": [
    {
      "id": "run_b014441ea91a51965c46",
      "tool": "voiceover",
      "status": "done",
      "progress": 1,
      "errorMessage": null,
      "voiceover": {
        "title": "Launch voiceover",
        "script": "Meet the editor that turns one long video into ten short clips.",
        "voice": "en-aria",
        "language": "en"
      },
      "separation": null,
      "brainstorm": null,
      "file": {
        "assetId": "ast_e8a35ed674148f27b585",
        "mimeType": "audio/mpeg",
        "durationSec": 14,
        "sizeBytes": 224000,
        "downloadUrl": null,
        "downloadUrlExpiresAt": null
      },
      "ideas": null,
      "jobId": "job_bd92cb70ed9c45575464",
      "createdAt": "2026-08-31T21:30:00.000Z",
      "finishedAt": "2026-08-31T21:32:00.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Errors

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

Cost

No credits are used.

Questions

Why is downloadUrl null in the list?

A page never carries download links. Read the run with get_tool_run (GET /v1/tool-runs/{toolRunId}): once it is done, every read gives a fresh downloadUrl.

Does the list include failed runs?

Yes, every run is listed with its status. A failed run has no file and no ideas; start it again with a new Idempotency-Key.

View as Markdown