Docs · v1
Content Library
Generate videos from pre-built templates. List templates to discover required fields, start a
job, then poll by db_id.
GET/content-library/templates
Parameters
| Name | In | Required | Description |
|---|---|---|---|
category |
query | No | Filter by category. Default all. |
200 response
{
"status": true,
"message": "Templates retrieved successfully",
"data": [
{
"id": "template_uuid",
"title": "Template title",
"credit": "1",
"category": ["hook", "ugc"],
"require_fields": {
"product_name": { "type": "input", "label": "Product name" },
"product_image": { "type": "image", "label": "Product image" },
"script": { "type": "textarea", "label": "Script", "max": 400 }
}
}
]
}
GET/content-library/categories
200 response
{
"status": true,
"message": "Categories retrieved successfully",
"data": [
{ "label": "All", "value": "all" },
{ "label": "hook", "value": "hook" }
]
}
POST/content-library/generate
Dynamic body fields must match require_fields. Credits follow the template
credit value.
Parameters
| Name | Required | Description |
|---|---|---|
template_id |
Yes | Template UUID from list templates |
project_id |
No | Auto-creates a project if omitted |
webhook_url |
No | HTTPS URL for terminal job callbacks |
curl -X POST "https://app.makeugc.ai/api/platform/content-library/generate" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template_id": "template_uuid",
"product_name": "Glow Serum",
"product_image": "https://cdn.example.com/product.png",
"script": "This serum changed my morning routine."
}'
const response = await fetch("https://app.makeugc.ai/api/platform/content-library/generate", {
method: "POST",
headers: {
"X-Api-Key": process.env.MAKEUGC_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
template_id: "template_uuid",
product_name: "Glow Serum",
product_image: "https://cdn.example.com/product.png",
script: "This serum changed my morning routine.",
}),
});
import os
import requests
response = requests.post(
"https://app.makeugc.ai/api/platform/content-library/generate",
headers={"X-Api-Key": os.environ["MAKEUGC_API_KEY"]},
json={
"template_id": "template_uuid",
"product_name": "Glow Serum",
"product_image": "https://cdn.example.com/product.png",
"script": "This serum changed my morning routine.",
},
)
200 response
{
"status": true,
"message": "Video generation started",
"data": { "db_id": "uuid" }
}
Webhook callback
When webhook_url is set, MakeUGC POSTs application/json at a terminal
state. video_id matches the generate db_id.
Completed callback
{
"event": "video2video.job.terminal",
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"video_id": "660e8400-e29b-41d4-a716-446655440001",
"status": "completed",
"template_id": "tpl_789",
"video_url": "https://s3.amazonaws.com/.../final.mp4",
"thumbnail_url": "https://s3.amazonaws.com/.../thumb.jpg",
"error": null,
"completed_at": "2026-05-28T12:34:56.789123+00:00"
}
GET/content-library/status
Parameters
| Name | In | Required |
|---|---|---|
id |
query | Yes — the generate db_id |
Completed response
{
"status": true,
"message": "Video is completed",
"data": {
"db_id": "uuid",
"status": "completed",
"url": "https://signed-url.mp4"
}
}
Questions
How do I know which body fields a template needs?
GET /content-library/templates returns require_fields for each template. Every listed key is required on generate. Image fields must be public http(s) URLs — this route does not accept file uploads.
Should I poll or wait for the webhook?
If webhook_url is set, MakeUGC POSTs a JSON callback on a terminal state. Poll GET /content-library/status?id={db_id} as well; webhooks are not a guaranteed delivery channel.
