curl "https://api.hooked.so/v1/media/list?type=video&limit=20" \
-H "x-api-key: your_api_key_here"
const params = new URLSearchParams({ type: "video", limit: "20" });
const response = await fetch(`https://api.hooked.so/v1/media/list?${params}`, {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data } = await response.json();
const ready = data.media.filter((media) => media.status === "COMPLETED");
console.log(`${ready.length} ready of ${data.total} videos`);
import os
import requests
response = requests.get(
"https://api.hooked.so/v1/media/list",
params={"type": "video", "limit": 20},
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
data = response.json()["data"]
print(f"{len(data['media'])} of {data['total']} videos")
{
"success": true,
"message": "Media fetched successfully",
"data": {
"media": [
{
"id": "cm4x9s8u60009ab12kl56mn90",
"name": "Demo clip",
"type": "video",
"status": "COMPLETED",
"error": null,
"url": "https://files.hooked.so/team/public/demo--fid--9c1d.mp4",
"thumbnail": "https://files.hooked.so/team/public/demo--fid--9c1d.jpg",
"durationSeconds": 12.4,
"size": 8388608,
"aspectRatio": "ratio_9_16",
"isAIGenerated": false,
"createdAt": "2026-10-01T09:30:00.000Z"
}
],
"total": 42,
"limit": 20,
"offset": 0
}
}
{
"success": false,
"message": "type: Must be image or video"
}
Media library
List Media
List the images and videos of your team’s media library
GET
/
v1
/
media
/
list
curl "https://api.hooked.so/v1/media/list?type=video&limit=20" \
-H "x-api-key: your_api_key_here"
const params = new URLSearchParams({ type: "video", limit: "20" });
const response = await fetch(`https://api.hooked.so/v1/media/list?${params}`, {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data } = await response.json();
const ready = data.media.filter((media) => media.status === "COMPLETED");
console.log(`${ready.length} ready of ${data.total} videos`);
import os
import requests
response = requests.get(
"https://api.hooked.so/v1/media/list",
params={"type": "video", "limit": 20},
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
data = response.json()["data"]
print(f"{len(data['media'])} of {data['total']} videos")
{
"success": true,
"message": "Media fetched successfully",
"data": {
"media": [
{
"id": "cm4x9s8u60009ab12kl56mn90",
"name": "Demo clip",
"type": "video",
"status": "COMPLETED",
"error": null,
"url": "https://files.hooked.so/team/public/demo--fid--9c1d.mp4",
"thumbnail": "https://files.hooked.so/team/public/demo--fid--9c1d.jpg",
"durationSeconds": 12.4,
"size": 8388608,
"aspectRatio": "ratio_9_16",
"isAIGenerated": false,
"createdAt": "2026-10-01T09:30:00.000Z"
}
],
"total": 42,
"limit": 20,
"offset": 0
}
}
{
"success": false,
"message": "type: Must be image or video"
}
Overview
Returns the images and videos of your team’s media library, newest first, with the total count for paging. These are the ids every create endpoint takes inmedia (and in mediaId, startFrameMediaId, endFrameMediaId for Scenes).
The list includes media that are still on their way in: an import being downloaded (PROCESSING), an upload waiting for its file (PENDING), and ones that failed. Only a COMPLETED media can go into a video; any other answers 400 on create.
curl "https://api.hooked.so/v1/media/list?type=video&limit=20" \
-H "x-api-key: your_api_key_here"
const params = new URLSearchParams({ type: "video", limit: "20" });
const response = await fetch(`https://api.hooked.so/v1/media/list?${params}`, {
headers: { "x-api-key": process.env.HOOKED_API_KEY },
});
const { data } = await response.json();
const ready = data.media.filter((media) => media.status === "COMPLETED");
console.log(`${ready.length} ready of ${data.total} videos`);
import os
import requests
response = requests.get(
"https://api.hooked.so/v1/media/list",
params={"type": "video", "limit": 20},
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
)
data = response.json()["data"]
print(f"{len(data['media'])} of {data['total']} videos")
{
"success": true,
"message": "Media fetched successfully",
"data": {
"media": [
{
"id": "cm4x9s8u60009ab12kl56mn90",
"name": "Demo clip",
"type": "video",
"status": "COMPLETED",
"error": null,
"url": "https://files.hooked.so/team/public/demo--fid--9c1d.mp4",
"thumbnail": "https://files.hooked.so/team/public/demo--fid--9c1d.jpg",
"durationSeconds": 12.4,
"size": 8388608,
"aspectRatio": "ratio_9_16",
"isAIGenerated": false,
"createdAt": "2026-10-01T09:30:00.000Z"
}
],
"total": 42,
"limit": 20,
"offset": 0
}
}
{
"success": false,
"message": "type: Must be image or video"
}
Paging
total counts every media that matches the filters; you are done when offset + limit >= total. limit is 50 by default and at most 100. Use search to find a media by part of its name.
Errors
| Status | Message | Cause |
|---|---|---|
| 400 | type: Must be image or video | Unknown type. |
| 401 | code: "not_authenticated" | Missing or invalid x-api-key. |
| 403 | code: "entitlement_required" | Your team does not have the Hooked app product. |
| 500 | Failed to fetch media | Retry the request. |
Related
Import Media from URL
Add a file from a public URL
Upload Media
Upload a file from your machine
Authorizations
Query Parameters
Only image or only video. Both when left out. Any other value answers 400.
Available options:
image, video Only media whose name contains this text (case-insensitive).
Page size, 1 to 100. Larger values are capped at 100; missing or invalid values fall back to 50.
Required range:
1 <= x <= 100Media to skip. Missing or invalid values fall back to 0. You are done when offset + limit >= total.
Required range:
x >= 0