Get movie status
GET https://api.json2video.com/v2/movies
Retrieves the status and metadata of a single project, or lists all projects for the authenticated account.
Request
Headers
| Header | Required | Value |
|---|---|---|
x-api-key |
yes | API key issued from the dashboard. |
Query parameters
| Parameter | Type | Description |
|---|---|---|
project |
string | 16-character project identifier. When present, returns a single movie. |
id |
string | Alias for project. |
format |
string | simple leaves the movie's json out of the response. Use it when you only need the status: responses are smaller and faster. |
date_start / from |
ISO-8601 | List mode: start of date range. Default: first day of current month. |
date_end / to |
ISO-8601 | List mode: end of date range. Default: end of current day. Maximum range: 93 days. |
limit |
integer | List mode: maximum page size, 1β100. Default: 100. A page can hold fewer movies (see Pagination). |
next_token |
string | List mode: pagination cursor returned in the previous response. |
Body
None.
Response
200 OK β single project
{
"success": true,
"movie": {
"success": true,
"status": "done",
"message": "",
"project": "JkGxEoPRF9EgRb32",
"url": "https://assets.json2video.com/clients/xxxxxxxx/renders/2026-05-12-36066.mp4",
"thumbnail": "https://assets.json2video.com/clients/xxxxxxxx/renders/2026-05-12-36066.jpg",
"ass": "https://assets.json2video.com/clients/xxxxxxxx/renders/2026-05-12-36066.ass",
"created_at": "2026-05-12T07:41:41.946Z",
"ended_at": "2026-05-12T07:44:57.108Z",
"duration": 108.2,
"size": 6876189,
"width": 1080,
"height": 1920,
"rendering_time": 195,
"client-data": {},
"consumed_credits": []
},
"remaining_quota": { "movies": 0, "drafts": 0, "time": 1807 }
}
200 OK β list of projects
{
"success": true,
"from": "2026-05-01T00:00:00.000Z",
"to": "2026-05-12T23:59:59.999Z",
"count": 25,
"limit": 100,
"has_next": false,
"has_prev": false,
"next_token": null,
"movies": [ { "...": "movie object as above" } ],
"remaining_quota": { "time": 1807 }
}
Pagination
Keep requesting pages with the previous response's next_token until has_next is false. Do not stop because count is lower than limit: a page can hold fewer movies than limit while more exist.
That happens when the movies' json would make the response too large (about 5 MB). The page then ends early, has_next is true, and next_token continues right after the last movie returned, so every movie is listed exactly once. In the rare case that a single movie's json is too large to fit in a page on its own, that movie is listed without json; get it with ?project=.
If you don't need json, add format=simple: pages are much smaller and faster. Some older movies may still include json in list pages even with format=simple.
Status enum
| Status | Meaning |
|---|---|
pending |
Job is queued. No worker has picked it up yet. |
running |
Render is in progress. |
done |
Render finished successfully. url is the final MP4. |
error |
Render failed. message carries the reason. |
timeout |
Computed client-side when status=running and created_at is older than 15 minutes. The server still keeps status=running internally; clients should treat timeout the same as a fatal error. |
Movie object fields
| Field | Type | Notes |
|---|---|---|
success |
boolean | true iff the render itself succeeded. |
status |
string | See status enum. |
message |
string | Error message when success=false; informational otherwise. |
project |
string | 16-character project ID. |
url |
string|null | Public URL of the rendered MP4. null until done, and again once the video file is gone. |
thumbnail |
string|null | Public URL of the movie thumbnail β a single frame taken 2 seconds in, or at the timecode set by the movie's thumbnail property. JPEG, or PNG for movies with a transparent background. null until done, and again once the file is gone. |
ass |
string|boolean | Public URL of the generated .ass subtitle file, if any; false if none. |
created_at |
string | ISO-8601 submission time. |
ended_at |
string|null | ISO-8601 completion time. null until done. |
deleted_at |
string|null | ISO-8601 time the video file was deleted through DELETE /v2/movies; null otherwise. The entry itself, including consumed_credits, is kept. |
duration |
number | Output duration in seconds. |
size |
number | Output size in bytes. |
width / height |
integer | Output pixel dimensions. |
rendering_time |
integer|null | Seconds between created_at and ended_at. |
client-data |
object | The client-data from the submitted Movie JSON, returned verbatim. |
json |
string | The movie's JSON, serialized as a string (for a movie created from a template, the JSON built from it). Left out with format=simple. |
consumed_credits |
array | Per-step credit consumption breakdown. Present for movies created after 2025-07-27. |
apikey_id |
string|null | Which credential created the movie: the ID of the API key (an identifier, never the key itself), primary for the primary API key, or session for the dashboard or the editor. null for movies created before 2026-10-02. Present only when the request is made with a session, the primary API key or an API key with the admin role. |
destinations_result |
array|null | Single-project responses only. What happened to each output destination of the movie β see Delivery results. null when nothing was delivered. |
Delivery results
When the movie has output destinations (exports[].destinations[]: webhooks, FTP, SFTP, Amazon S3, email), a single-project response includes destinations_result, one entry per destination, in the order of the movie JSON. The list response (movies) does not include it.
{
"destinations_result": [
{
"index": 0,
"type": "ftp",
"id": "media-server",
"status": "error",
"http_status": null,
"attempts": 1,
"message": "β¦",
"duration_ms": 30112,
"at": "2026-09-17T10:15:01.702Z"
},
{
"index": 1,
"type": "webhook",
"id": null,
"status": "ok",
"http_status": 200,
"attempts": 1,
"message": "Delivered to https://example.com (HTTP 200).",
"duration_ms": 412,
"at": "2026-09-17T10:15:02.114Z"
}
]
}
| Field | Type | Notes |
|---|---|---|
index |
integer|null | Position in exports[0].destinations. null when the entry is about the export as a whole. |
type |
string|null | webhook, ftp, sftp, aws-s3, email, β¦ |
id |
string|null | The connection ID, when the destination references one. |
status |
string | ok (delivered), error (not delivered) or skipped (nothing to do, for example an FTP upload for a render that produced no video, or a destination type that is not supported). |
http_status |
integer|null | Last HTTP status received (webhooks). |
attempts |
integer | Requests or connections made. 0 when nothing was attempted. |
message |
string|null | What happened, up to 300 characters. URLs appear as scheme and host only; passwords, URL paths and queries never appear. |
duration_ms |
integer | Time spent on this destination. |
at |
string | ISO-8601 time the destination finished. |
The same results appear in the dashboard under Render logs β the render β Deliveries. Retry rules for webhooks: Webhooks β Delivery and retries.
Errors
| Status | Message | Cause |
|---|---|---|
400 |
Project ID must be a 16-character string. Received ID: 'β¦' (length: N) |
project / id is wrong shape. |
400 |
Invalid start date |
date_start / from is not parseable. |
400 |
Invalid end date |
date_end / to is not parseable. |
400 |
Maximum date range is 3 months. |
Range exceeds 93 days. |
400 |
Movie <project> not found. Check that the project ID was returned by POST /v2/movies with an API key of this same account. |
No movie with that ID exists under the account of the API key (or session) used. An ID created with another account's API key is not found either. |
403 |
Invalid token |
Admin-only query parameter without a valid token. |
A project ID that is not found returns 400 with success: false and the Movie <project> not found⦠message above. It is not a render failure: retrying with the same ID returns the same error, so polling loops should stop on it.
Examples
Poll a single project
curl --location --request GET \
'https://api.json2video.com/v2/movies?project=JkGxEoPRF9EgRb32' \
--header 'x-api-key: YOUR_API_KEY'
List the last 50 projects
curl --location --request GET \
'https://api.json2video.com/v2/movies?limit=50&date_start=2026-04-12&date_end=2026-05-12' \
--header 'x-api-key: YOUR_API_KEY'
Paginate
# First page
curl 'https://api.json2video.com/v2/movies?limit=100' -H 'x-api-key: β¦'
# Subsequent pages: pass the previous response's `next_token`
curl 'https://api.json2video.com/v2/movies?limit=100&next_token=AAAβ¦' -H 'x-api-key: β¦'