curl -X POST https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members \
-H "Authorization: Bearer vpk_live_xxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7d9f3e2b-4c5d-4e6f-a0b1-2c3d4e5f6a7b" \
-d '{
"role": "son",
"type": "child",
"age": "5-7",
"ethnicity": "hispanic",
"physical": "short dark hair, bright smile",
"clothing": "casual t-shirt and shorts"
}'
const response = await fetch('https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members', {
method: 'POST',
headers: {
'Authorization': 'Bearer vpk_live_xxxxx',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID()
},
body: JSON.stringify({
role: 'son',
type: 'child',
age: '5-7',
ethnicity: 'hispanic',
physical: 'short dark hair, bright smile',
clothing: 'casual t-shirt and shorts'
})
});
const result = await response.json();
console.log(`Adding member, task: ${result.task_id}`);
import requests
import uuid
response = requests.post(
'https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members',
headers={
'Authorization': 'Bearer vpk_live_xxxxx',
'Content-Type': 'application/json',
'Idempotency-Key': str(uuid.uuid4())
},
json={
'role': 'son',
'type': 'child',
'age': '5-7',
'ethnicity': 'hispanic',
'physical': 'short dark hair, bright smile',
'clothing': 'casual t-shirt and shorts'
}
)
result = response.json()
print(f"Adding member, task: {result['task_id']}")
{
"family_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"task_id": "task_fam456add",
"status": "generating",
"livemode": true,
"_links": {
"self": "/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6",
"task": "/v1/tasks/task_fam456add"
}
}
{
"error": {
"code": "PLAN_NOT_ALLOWED",
"message": "Families are available on the Pro, Max and Enterprise plans. Upgrade your plan to use this feature.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_NOT_FOUND",
"message": "Family not found or not accessible with this API key.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_NOT_READY",
"message": "Another generation is already in progress for this family. Poll the task until it finishes, then retry.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_MEMBER_LIMIT_EXCEEDED",
"message": "A family must have between 1 and 6 members.",
"request_id": "req_xyz123"
}
}
Families
Add Family Member
Add a new member to a family and regenerate its cast
POST
/
v1
/
families
/
{familyId}
/
members
curl -X POST https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members \
-H "Authorization: Bearer vpk_live_xxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7d9f3e2b-4c5d-4e6f-a0b1-2c3d4e5f6a7b" \
-d '{
"role": "son",
"type": "child",
"age": "5-7",
"ethnicity": "hispanic",
"physical": "short dark hair, bright smile",
"clothing": "casual t-shirt and shorts"
}'
const response = await fetch('https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members', {
method: 'POST',
headers: {
'Authorization': 'Bearer vpk_live_xxxxx',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID()
},
body: JSON.stringify({
role: 'son',
type: 'child',
age: '5-7',
ethnicity: 'hispanic',
physical: 'short dark hair, bright smile',
clothing: 'casual t-shirt and shorts'
})
});
const result = await response.json();
console.log(`Adding member, task: ${result.task_id}`);
import requests
import uuid
response = requests.post(
'https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members',
headers={
'Authorization': 'Bearer vpk_live_xxxxx',
'Content-Type': 'application/json',
'Idempotency-Key': str(uuid.uuid4())
},
json={
'role': 'son',
'type': 'child',
'age': '5-7',
'ethnicity': 'hispanic',
'physical': 'short dark hair, bright smile',
'clothing': 'casual t-shirt and shorts'
}
)
result = response.json()
print(f"Adding member, task: {result['task_id']}")
{
"family_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"task_id": "task_fam456add",
"status": "generating",
"livemode": true,
"_links": {
"self": "/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6",
"task": "/v1/tasks/task_fam456add"
}
}
{
"error": {
"code": "PLAN_NOT_ALLOWED",
"message": "Families are available on the Pro, Max and Enterprise plans. Upgrade your plan to use this feature.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_NOT_FOUND",
"message": "Family not found or not accessible with this API key.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_NOT_READY",
"message": "Another generation is already in progress for this family. Poll the task until it finishes, then retry.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_MEMBER_LIMIT_EXCEEDED",
"message": "A family must have between 1 and 6 members.",
"request_id": "req_xyz123"
}
}
Adds a new member to a family you own, then regenerates the member’s portrait and the family’s group
The family must be in
See Error Handling for more details.
card_image_url. Only the family’s owner can add members.
Adding a family member requires a Pro, Max, or Enterprise plan, like all other family write operations.
ready status: if another generation is already in progress for this family, the request is rejected with 422 FAMILY_NOT_READY. A family can have at most 6 members; adding a 7th is rejected with 422 FAMILY_MEMBER_LIMIT_EXCEEDED.
Path Parameters
string
required
The UUID of the family to add a member to. Only accepts families you own.Example:
3fa85f64-5717-4562-b3fc-2c963f66afa6Request Body
string
required
Broad age category.Allowed values:
adult, child, seniorGuides how the member is depicted in generated scenes.string
Short descriptive label for this member’s role in the family, e.g.
father, mother, daughter, grandmother. This guides avatar generation and how the member is referred to internally.string
Free-text age or age range to guide avatar generation, e.g.
5-7.string
Free-text ethnicity to guide avatar generation.
string
Free-text physical description to guide avatar generation, e.g.
short dark hair, bright smile.string
Free-text clothing description to guide avatar generation, e.g.
casual t-shirt and shorts.string
HTTPS URL to receive a webhook notification when the new portrait finishes generating.See Webhooks for payload format and verification details.
Webhook URLs must use HTTPS and cannot point to private/internal networks (SSRF protection).
string
Optional idempotency key. Retrying a request with the same key returns the original result instead of adding a duplicate member.
Response
Returns a202 Accepted response with a task to poll:
string
required
Unique identifier for the family.
string
required
Unique identifier for the generation task. Poll it via Get Task, or use
webhook_url for a notification instead.string
required
Always
generating for this response shape.boolean
required
true for live (vpk_live_) requests; false for test-mode (vpk_test_) requests. See Test Mode.object
required
HATEOAS links for navigation.
self: URL to fetch the family (/v1/families/{family_id})task: URL to poll for the generation task (/v1/tasks/{task_id})
curl -X POST https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members \
-H "Authorization: Bearer vpk_live_xxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7d9f3e2b-4c5d-4e6f-a0b1-2c3d4e5f6a7b" \
-d '{
"role": "son",
"type": "child",
"age": "5-7",
"ethnicity": "hispanic",
"physical": "short dark hair, bright smile",
"clothing": "casual t-shirt and shorts"
}'
const response = await fetch('https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members', {
method: 'POST',
headers: {
'Authorization': 'Bearer vpk_live_xxxxx',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID()
},
body: JSON.stringify({
role: 'son',
type: 'child',
age: '5-7',
ethnicity: 'hispanic',
physical: 'short dark hair, bright smile',
clothing: 'casual t-shirt and shorts'
})
});
const result = await response.json();
console.log(`Adding member, task: ${result.task_id}`);
import requests
import uuid
response = requests.post(
'https://api.vibepeak.ai/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6/members',
headers={
'Authorization': 'Bearer vpk_live_xxxxx',
'Content-Type': 'application/json',
'Idempotency-Key': str(uuid.uuid4())
},
json={
'role': 'son',
'type': 'child',
'age': '5-7',
'ethnicity': 'hispanic',
'physical': 'short dark hair, bright smile',
'clothing': 'casual t-shirt and shorts'
}
)
result = response.json()
print(f"Adding member, task: {result['task_id']}")
{
"family_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"task_id": "task_fam456add",
"status": "generating",
"livemode": true,
"_links": {
"self": "/v1/families/3fa85f64-5717-4562-b3fc-2c963f66afa6",
"task": "/v1/tasks/task_fam456add"
}
}
{
"error": {
"code": "PLAN_NOT_ALLOWED",
"message": "Families are available on the Pro, Max and Enterprise plans. Upgrade your plan to use this feature.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_NOT_FOUND",
"message": "Family not found or not accessible with this API key.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_NOT_READY",
"message": "Another generation is already in progress for this family. Poll the task until it finishes, then retry.",
"request_id": "req_xyz123"
}
}
{
"error": {
"code": "FAMILY_MEMBER_LIMIT_EXCEEDED",
"message": "A family must have between 1 and 6 members.",
"request_id": "req_xyz123"
}
}
Polling for Completion
Poll the returnedtask_id via Get Task. Once status is completed, Get Family reflects the new member, its portrait, and the regenerated group card_image_url.
If the task fails, the family is left exactly as it was: the new member is not added and no existing assets are changed.
Error Codes
| Code | Status | Description |
|---|---|---|
VALIDATION_ERROR | 400 | Invalid request parameters |
MISSING_API_KEY | 401 | No Authorization header was sent |
INVALID_API_KEY | 401 | The API key is invalid or has been revoked |
PLAN_NOT_ALLOWED | 403 | Your plan doesn’t allow editing a family (requires Pro, Max, or Enterprise) |
FAMILY_NOT_FOUND | 404 | Family doesn’t exist or isn’t yours |
FAMILY_NOT_READY | 422 | Another generation is already in progress for this family |
FAMILY_MEMBER_LIMIT_EXCEEDED | 422 | The family already has the maximum of 6 members |

