curl "https://api.hooked.so/v1/video/cm4x9n7q20003ab12xy98zt10" \
-H "x-api-key: your_api_key_here"
const videoId = "cm4x9n7q20003ab12xy98zt10";
const response = await fetch(`https://api.hooked.so/v1/video/${videoId}`, {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data: video } = await response.json();
console.log(video.status, `${video.progress}%`);
if (video.status === "COMPLETED") console.log("Download:", video.url);
import os
import requests
video_id = "cm4x9n7q20003ab12xy98zt10"
response = requests.get(
f"https://api.hooked.so/v1/video/{video_id}",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
video = response.json()["data"]
print(video["status"], f"{video['progress']}%")
if video["status"] == "COMPLETED":
print("Download:", video["url"])
{
"success": true,
"message": "Video details fetched successfully",
"data": {
"id": "cm4x9n7q20003ab12xy98zt10",
"name": "Morning routine tips",
"projectId": "cm4x9k2p10001ab12cd34ef56",
"projectType": "script_to_video",
"status": "COMPLETED",
"progress": 100,
"message": "Video ready",
"url": "https://files.hooked.so/team/videos/cm4x9n7q20003ab12xy98zt10.mp4?X-Amz-Signature=...",
"thumbnail": "https://files.hooked.so/team/thumbnails/cm4x9n7q20003ab12xy98zt10.jpg?X-Amz-Signature=...",
"durationInFrames": 1125,
"durationInSeconds": 45,
"size": 18874368,
"createdAt": "2026-10-01T09:15:58.000Z",
"updatedAt": "2026-10-01T09:16:41.000Z"
}
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
{
"code": "entitlement_required",
"error": "entitlement_required",
"message": "This endpoint requires the \"app\" product.",
"product": "app"
}
{
"success": false,
"message": "Video not found"
}
Videos
Get Video Details
Read one rendered video of your team
GET
/
v1
/
video
/
{videoId}
curl "https://api.hooked.so/v1/video/cm4x9n7q20003ab12xy98zt10" \
-H "x-api-key: your_api_key_here"
const videoId = "cm4x9n7q20003ab12xy98zt10";
const response = await fetch(`https://api.hooked.so/v1/video/${videoId}`, {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data: video } = await response.json();
console.log(video.status, `${video.progress}%`);
if (video.status === "COMPLETED") console.log("Download:", video.url);
import os
import requests
video_id = "cm4x9n7q20003ab12xy98zt10"
response = requests.get(
f"https://api.hooked.so/v1/video/{video_id}",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
video = response.json()["data"]
print(video["status"], f"{video['progress']}%")
if video["status"] == "COMPLETED":
print("Download:", video["url"])
{
"success": true,
"message": "Video details fetched successfully",
"data": {
"id": "cm4x9n7q20003ab12xy98zt10",
"name": "Morning routine tips",
"projectId": "cm4x9k2p10001ab12cd34ef56",
"projectType": "script_to_video",
"status": "COMPLETED",
"progress": 100,
"message": "Video ready",
"url": "https://files.hooked.so/team/videos/cm4x9n7q20003ab12xy98zt10.mp4?X-Amz-Signature=...",
"thumbnail": "https://files.hooked.so/team/thumbnails/cm4x9n7q20003ab12xy98zt10.jpg?X-Amz-Signature=...",
"durationInFrames": 1125,
"durationInSeconds": 45,
"size": 18874368,
"createdAt": "2026-10-01T09:15:58.000Z",
"updatedAt": "2026-10-01T09:16:41.000Z"
}
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
{
"code": "entitlement_required",
"error": "entitlement_required",
"message": "This endpoint requires the \"app\" product.",
"product": "app"
}
{
"success": false,
"message": "Video not found"
}
Overview
Returns one rendered video: its status, progress and, once it is ready, a download link. A video exists once a project’s render has started. Its ID comes from Get Project (data.video.id), List Videos, Render Project or a webhook payload (data.videoId). If you only have the projectId from a create endpoint, use Get Project: it returns the same video object under video, and also covers the generation stage before the render.
curl "https://api.hooked.so/v1/video/cm4x9n7q20003ab12xy98zt10" \
-H "x-api-key: your_api_key_here"
const videoId = "cm4x9n7q20003ab12xy98zt10";
const response = await fetch(`https://api.hooked.so/v1/video/${videoId}`, {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data: video } = await response.json();
console.log(video.status, `${video.progress}%`);
if (video.status === "COMPLETED") console.log("Download:", video.url);
import os
import requests
video_id = "cm4x9n7q20003ab12xy98zt10"
response = requests.get(
f"https://api.hooked.so/v1/video/{video_id}",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
video = response.json()["data"]
print(video["status"], f"{video['progress']}%")
if video["status"] == "COMPLETED":
print("Download:", video["url"])
{
"success": true,
"message": "Video details fetched successfully",
"data": {
"id": "cm4x9n7q20003ab12xy98zt10",
"name": "Morning routine tips",
"projectId": "cm4x9k2p10001ab12cd34ef56",
"projectType": "script_to_video",
"status": "COMPLETED",
"progress": 100,
"message": "Video ready",
"url": "https://files.hooked.so/team/videos/cm4x9n7q20003ab12xy98zt10.mp4?X-Amz-Signature=...",
"thumbnail": "https://files.hooked.so/team/thumbnails/cm4x9n7q20003ab12xy98zt10.jpg?X-Amz-Signature=...",
"durationInFrames": 1125,
"durationInSeconds": 45,
"size": 18874368,
"createdAt": "2026-10-01T09:15:58.000Z",
"updatedAt": "2026-10-01T09:16:41.000Z"
}
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
{
"code": "entitlement_required",
"error": "entitlement_required",
"message": "This endpoint requires the \"app\" product.",
"product": "app"
}
{
"success": false,
"message": "Video not found"
}
Video status
STARTED
STARTED
The video is rendering.
progress shows how far along it is and url is "".COMPLETED
COMPLETED
The video is ready. Download it from
url. The link is signed and expires: request the video again for a fresh one instead of storing it. The thumbnail is generated shortly after.FAILED
FAILED
The render failed;
message says why. Render the project again with Render Project, which costs no credits.Errors
| Status | Body | Cause |
|---|---|---|
| 401 | code: "not_authenticated" | Missing or invalid x-api-key. |
| 403 | code: "entitlement_required" | Your team does not have the Hooked app product. |
| 404 | Video not found | The ID does not exist or belongs to another team. |
| 500 | Internal server error | Retry the request. |
GET is always safe. To be notified instead of polling, pass a webhook when you create the project; see Webhooks.
Related
Get Project
Follow a project from create to video
List Videos
All rendered videos of your team
Webhooks
Get notified when a video is ready
Render Project
Render a project again
Authorizations
Path Parameters
The video ID: data.video.id from GET /v1/project/{projectId}, an item of GET /v1/video/list, data.videoId from POST /v1/render, or data.videoId in a webhook payload.