curl -X GET "https://api.hooked.so/v1/avatar/list?type=library&limit=20" \
-H "x-api-key: your_api_key_here"
const response = await fetch('https://api.hooked.so/v1/avatar/list?type=library&limit=20', {
headers: { 'x-api-key': 'your_api_key_here' }
});
const { data } = await response.json();
console.log(data.total, data.avatars.map((a) => a.id));
import requests
response = requests.get(
'https://api.hooked.so/v1/avatar/list',
params={'type': 'library', 'limit': 20},
headers={'x-api-key': 'your_api_key_here'}
)
avatars = response.json()['data']['avatars']
{
"success": true,
"data": {
"avatars": [
{
"id": "1",
"name": "Harper",
"type": "AI",
"gender": "Female",
"age": "Young Adult",
"image": "https://.../avatars/harper/thumbnail/harper.png",
"isHD": true,
"isPro": false,
"isNew": true,
"situation": ["couch"],
"emotions": ["Calm", "Attentive"],
"skinTone": "light",
"isCustom": false,
"source": "library"
},
{
"id": "2",
"name": "Emma",
"type": "Realistic",
"gender": "Female",
"age": "Young Adult",
"image": "https://.../avatars/emma/thumbnail/emma.png",
"isHD": true,
"isPro": false,
"isNew": true,
"situation": ["Kitchen"],
"emotions": ["Calm"],
"skinTone": "light",
"isCustom": false,
"source": "library"
}
],
"total": 83,
"limit": 20,
"offset": 0,
"library": 83,
"custom": 0
}
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
Avatars
List Avatars
Get the avatars you can use in videos: the Hooked library plus your team’s own
GET
/
v1
/
avatar
/
list
curl -X GET "https://api.hooked.so/v1/avatar/list?type=library&limit=20" \
-H "x-api-key: your_api_key_here"
const response = await fetch('https://api.hooked.so/v1/avatar/list?type=library&limit=20', {
headers: { 'x-api-key': 'your_api_key_here' }
});
const { data } = await response.json();
console.log(data.total, data.avatars.map((a) => a.id));
import requests
response = requests.get(
'https://api.hooked.so/v1/avatar/list',
params={'type': 'library', 'limit': 20},
headers={'x-api-key': 'your_api_key_here'}
)
avatars = response.json()['data']['avatars']
{
"success": true,
"data": {
"avatars": [
{
"id": "1",
"name": "Harper",
"type": "AI",
"gender": "Female",
"age": "Young Adult",
"image": "https://.../avatars/harper/thumbnail/harper.png",
"isHD": true,
"isPro": false,
"isNew": true,
"situation": ["couch"],
"emotions": ["Calm", "Attentive"],
"skinTone": "light",
"isCustom": false,
"source": "library"
},
{
"id": "2",
"name": "Emma",
"type": "Realistic",
"gender": "Female",
"age": "Young Adult",
"image": "https://.../avatars/emma/thumbnail/emma.png",
"isHD": true,
"isPro": false,
"isNew": true,
"situation": ["Kitchen"],
"emotions": ["Calm"],
"skinTone": "light",
"isCustom": false,
"source": "library"
}
],
"total": 83,
"limit": 20,
"offset": 0,
"library": 83,
"custom": 0
}
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
Overview
Returns the avatars available to your team: the Hooked library avatars first, then your team’s custom avatars. Avatars are the Actors of the dashboard, and your custom avatars are the ones under My Actors. Only custom avatars that finished processing are listed. The list is paged withlimit (default 50, at most 100) and offset; you are done when offset + limit >= total. Use an avatar’s id as avatarId in the create endpoints (Talking Avatar, UGC Studio, Podcast / Dualcast, Scenes, TikTok Slideshow, …).
Each avatar is a still image; every video is generated from it. Voice, lip movement and gestures come from the video model.
curl -X GET "https://api.hooked.so/v1/avatar/list?type=library&limit=20" \
-H "x-api-key: your_api_key_here"
const response = await fetch('https://api.hooked.so/v1/avatar/list?type=library&limit=20', {
headers: { 'x-api-key': 'your_api_key_here' }
});
const { data } = await response.json();
console.log(data.total, data.avatars.map((a) => a.id));
import requests
response = requests.get(
'https://api.hooked.so/v1/avatar/list',
params={'type': 'library', 'limit': 20},
headers={'x-api-key': 'your_api_key_here'}
)
avatars = response.json()['data']['avatars']
{
"success": true,
"data": {
"avatars": [
{
"id": "1",
"name": "Harper",
"type": "AI",
"gender": "Female",
"age": "Young Adult",
"image": "https://.../avatars/harper/thumbnail/harper.png",
"isHD": true,
"isPro": false,
"isNew": true,
"situation": ["couch"],
"emotions": ["Calm", "Attentive"],
"skinTone": "light",
"isCustom": false,
"source": "library"
},
{
"id": "2",
"name": "Emma",
"type": "Realistic",
"gender": "Female",
"age": "Young Adult",
"image": "https://.../avatars/emma/thumbnail/emma.png",
"isHD": true,
"isPro": false,
"isNew": true,
"situation": ["Kitchen"],
"emotions": ["Calm"],
"skinTone": "light",
"isCustom": false,
"source": "library"
}
],
"total": 83,
"limit": 20,
"offset": 0,
"library": 83,
"custom": 0
}
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
Errors
| Status | When |
|---|---|
| 401 | Missing or invalid API key |
| 403 | The team does not have the Hooked app product (code: "entitlement_required") |
| 500 | { "success": false, "message": "Failed to fetch avatars" } |
Notes
Custom avatars only appear once they have finished processing.
The library changes rarely; caching this list for a few hours is fine. The call is free and safe to retry.
Authorizations
Query Parameters
library (Hooked library only), custom (your team's only) or all. Any other value returns an empty list.
Available options:
library, custom, all Page size, 1 to 100. Larger values are capped at 100; missing or invalid values fall back to 50.
Required range:
1 <= x <= 100Rows to skip. Missing or invalid values fall back to 0. You are done when offset + limit >= total.
Required range:
x >= 0