Authentication
All /api/* endpoints require an API token in the Authorization header.
Authorization: Bearer YOUR_API_TOKEN
Base URL
https://api.lovelybots.com/api
Uses PUBLIC_API_BASE_URL when set, then
PUBLIC_ACTIVE_STORAGE_BASE_URL, then
PUBLIC_APP_BASE_URL, then APP_PROTOCOL + APP_HOST.
Use https://api.lovelybots.com/api for bot and server-to-server calls.
Keep dashboard/login flows on https://lovelybots.com.
Common Error Response
{
"error": "Error message"
}
Typical statuses:
401 missing/invalid token,
403 IP blocked or quota/plan restriction,
404 video not found,
422 validation/input error,
503 API disabled.
POST /api/create
Create a video with script + one image input. The backend auto-detects whether it is an upload, URL, or base64.
Best output quality: use a clear front-facing portrait in 9:16 orientation (example: 1080x1920).
Input Schema
| Field |
Type |
Required |
Description |
| script |
string |
Yes |
Script text for generation. |
| image |
file or string (URL/base64) |
Yes |
Unified image input. Send multipart file upload, http/https URL string, or base64/data URL string. URL inputs must be publicly reachable (localhost/private-network URLs are blocked). For best quality, use a front-facing 9:16 portrait. |
| gender |
string |
No |
Manual gender ("male", "female"). Overrides AI detection. |
| age |
string |
No |
Manual age ("young_adult", "adult", "senior"). Overrides AI detection. |
| voice_id |
integer |
No |
Voice to force. If omitted, a voice is auto-selected. |
| action_prompt |
string |
No |
Presenter action/performance guidance (e.g. "Smiles warmly and waves"). |
| camera_prompt |
string |
No |
Camera/framing guidance (e.g. "Medium closeup, cinematic lighting"). |
| subtitles |
boolean |
No |
Enable subtitle generation. |
| public |
boolean |
No |
Set to false to keep the video private. Defaults to true (visible on the public feed lovelybots.com/feed). |
Output Schema (201 Created)
| Field |
Type |
Description |
| id |
integer |
Video ID. Use to poll GET /api/videos/:id. |
| status |
string |
Initial status — always queued on creation. |
| credits_remaining |
integer |
Videos remaining in your plan this month. |
| share_url |
string |
Public shareable page for this video. |
Request Example (Multipart Upload)
curl -X POST "https://api.lovelybots.com/api/create" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-F "script=Three launch hooks for this week" \
-F "image=@/absolute/path/to/image_1080x1920.jpg" \
-F "action_prompt=Confident delivery with hand gestures" \
-F "camera_prompt=Medium close-up, slight push-in" \
-F "subtitles=true" \
-F "voice_id=12"
Request Example (JSON Base64)
curl -X POST "https://api.lovelybots.com/api/create" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"script": "Three launch hooks for this week",
"voice_id": 12,
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...",
"action_prompt": "Confident delivery with hand gestures",
"camera_prompt": "Medium close-up, slight push-in"
}'
Response Example (201)
{
"id": 4321,
"status": "queued",
"credits_remaining": 12,
"share_url": "https://lovelybots.com/videos/4321/share/abc123token"
}
GET /api/voices
Returns voices you can use in voice_id when calling POST /api/create. Filter by gender and age.
Query Parameters
| Param |
Values |
| gender |
male, female |
| age |
young_adult, adult, mature, middle_aged, older |
Output Schema
| Field |
Type |
Description |
| voices |
array[object] |
Available voice entries. |
| voices[].id |
integer |
Use as voice_id in create requests. |
| voices[].name |
string |
Voice display name. |
| voices[].gender |
string |
male or female. |
| voices[].age |
string |
young_adult, adult, mature, middle_aged, or older. |
{
"voices": [
{
"id": 12,
"name": "Alloy (Female, Adult)",
"gender": "female",
"age": "adult"
}
]
}
GET /api/credits
Returns current user credit balances and reset timing.
Output Schema
| Field |
Type |
Description |
| credits.videos_remaining |
integer |
Remaining videos available now. |
| credits.videos_this_month |
integer |
Videos generated in current billing period. |
| credits.videos_created_all_time |
integer |
Lifetime videos generated. |
| credits.next_reset |
datetime or null |
Next credit reset time (ISO8601). |
{
"credits": {
"videos_remaining": 9,
"videos_this_month": 3,
"videos_created_all_time": 42,
"next_reset": "2026-03-01T00:00:00.000Z"
}
}
GET /api/videos
List videos for the authenticated user.
Query Parameters
| Parameter |
Type |
Description |
| status |
string |
Filter by one status: pending, queued, processing, completed, failed. |
| completed |
string |
If true, filters to completed videos. |
| failed |
string |
If true, filters to failed videos. |
| page |
integer |
Page number. |
| per_page |
integer |
Items per page. Default 12. |
Output Schema
| Field |
Type |
Description |
| videos |
array[Video] |
Array of video objects (latest first). |
| pagination.current_page |
integer |
Current page number. |
| pagination.total_pages |
integer |
Total number of pages. |
| pagination.total_count |
integer |
Total matching videos. |
{
"videos": [ { "...": "Video object" } ],
"pagination": {
"current_page": 1,
"total_pages": 4,
"total_count": 40
}
}
GET /api/videos/:id
Returns the polling-friendly summary used by the OpenClaw skill.
| Field |
Type |
Description |
| id |
integer |
Video ID. |
| status |
string |
queued, processing, completed, or failed. |
| share_url |
string |
Public shareable page URL. Always present. |
| credits_remaining |
integer |
Videos remaining on your plan this month. |
| video_url |
string or null |
Playable URL. Present when completed. |
| error |
string or null |
Failure reason. Present when failed. |
{
"id": 4321,
"status": "processing",
"credits_remaining": 12,
"share_url": "https://lovelybots.com/videos/4321/share/abc123token"
}
GET /api/videos/:id/status
Low-level provider status payload with progress and provider job metadata.
| Field |
Type |
Description |
| id |
integer |
Video ID. |
| status |
string |
pending, queued, processing, completed, or failed. |
| job_id |
string or null |
Provider job identifier when available. |
| video_url |
string or null |
Playable URL. Present when completed. |
| thumbnail_url |
string or null |
Thumbnail URL when available. |
| progress |
number, string, or null |
Provider progress indicator. |
| error |
string or null |
Failure reason. Present when failed. |
| created_at |
datetime |
Creation timestamp (ISO8601). |
| completed_at |
datetime or null |
Completion timestamp. |
{
"id": 4321,
"status": "processing",
"job_id": "fal_abc123",
"video_url": null,
"thumbnail_url": null,
"progress": 62,
"error": null,
"created_at": "2026-02-19T20:34:02.127Z",
"completed_at": null
}
Video Object Schema
| Field |
Type |
Description |
| id |
integer |
Video ID. |
| status |
string |
Current status. |
| video_url |
string or null |
Final playable video URL. |
| thumbnail_url |
string or null |
Thumbnail URL. Falls back to placeholder when not generated. |
| share_url |
string |
Public shareable page URL. |
| created_at |
datetime |
Creation timestamp (ISO8601). |
| completed_at |
datetime or null |
Completion timestamp. |
| image.id |
integer or null |
Source image record ID. |
| image.name |
string or null |
Source image display name. |
| image.image_url |
string or null |
Source image URL. |
| voice.id |
integer or null |
Voice ID. |
| voice.name |
string or null |
Voice display name. |