Authentication
Every request must include your API key in the request headers. Keep this key secret and never expose it in client-side code.
curl -X GET \
https://api.syncmonster.ai/neuralgarage/saas/api/v1/clients/list_assets \
-H "x-api-key: YOUR_API_KEY"
Status Codes
All API responses include a status field and a corresponding HTTP status code. Use these to handle responses programmatically.
| Status | Name | Description |
|---|---|---|
| success | Success | The request was successful. |
| created | Created | The request has been fulfilled and a new resource has been created. |
| in_progress | In Progress | The request is being processed. |
| pending | Pending | The request is pending and awaiting processing. |
| invalid_request | Invalid Request | The request is invalid. |
| failed | Failed | The request failed to process. |
| unauthorized | Unauthorized | Authentication is required and has failed. |
| forbidden | Forbidden | You do not have permission to access this resource. |
| not_found | Not Found | The requested resource was not found. |
| internal_error | Internal Server Error | An unexpected error occurred on the server. |
Endpoints
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Required | Model identifier, e.g. e1, e2, e3 |
| assets | array | Required (JSON) | Array of asset objects with type and url or asset_id |
| video | file | Required (Form) | Video file — .mp4 or .mov |
| audio | file | Required (Form) | Audio file — .mp3 or .wav |
| video_asset_id | integer | Optional | Existing video asset ID (alternative to file upload) |
| audio_asset_id | integer | Optional | Existing audio asset ID (alternative to file upload) |
| options | object | Optional | Processing options. See options object below. |
| webhook | string | Optional | URL to notify when job completes |
| Field | Type | Default | Description |
|---|---|---|---|
| intensity | integer | 2 | Sync intensity level — 1 (subtle) to 3 (strong) |
{
"model": "e2",
"assets": [
{ "type": "video", "url": "https://example.com/video.mp4" },
{ "type": "audio", "url": "https://example.com/audio.mp3" }
],
"options": { "intensity": 2 },
"webhook": { "url": "https://yourapp.com/webhook", "headers": {}, "params": {} }
}
{
"status": "success",
"message": "Job Created",
"data": {
"request_id": "a1b2c3d4e5f6g7h8", // Use this to poll status
"assets": [
{ "type": "video", "asset_id": 123 },
{ "type": "audio", "asset_id": 124 }
],
"credit_details": { "credits_deducted": 0 }
}
}
{
"status": "failed",
"message": "Invalid audio format '.txt'. Allowed: .mp4, .mov, .wav, .mp3",
"data": {
"error_code": "ERR_008",
"error_name": "INVALID_FORMAT",
"message": "Invalid file type. Supported types are: .mp4, .mov"
}
}
| Parameter | Type | Default | Description |
|---|---|---|---|
| limit | integer | 10 | Records to return per page |
| page_no | integer | 0 | Page number for pagination |
GET /list_requests?limit=10&page_no=0
{
"status": "success",
"message": "Requests listed",
"data": [
{
"request_id": "740006cb51da497fa1930dfe10520cc4",
"status": "Success",
"status_code": "success",
"created_at": "2026-04-07T04:13:23",
"completed_at": "2026-04-07T04:14:04"
}
],
"total_requests": 14,
"end_of_records": false
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | The job request ID returned from POST /visualdub |
GET /get_status?request_id=a1b2c3d4e5f6g7h8
{
"status": "success",
"message": "Request status fetched",
"data": {
"request_id": "740006cb51da497fa1930dfe10520cc4",
"status": "Success",
"status_code": "success",
"assets": {
"video": 38,
"audio": 45
}
}
}
{
"status": "failed",
"message": "Request ID not found"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | The completed job request ID |
GET /get_file?request_id=a1b2c3d4e5f6g7h8
Content-Type: video/mp4 Content-Disposition: attachment; filename="output.mp4" // Binary video data stream
{
"status": "success",
"data": {
"request_id": "a1b2c3d4e5f6g7h8",
"status": "in_progress",
"status_code": 102,
"message": "Job is still processing. Please try again later."
}
}
No parameters required. Returns all assets associated with your API key.
GET /list_assets
{
"status": "success",
"message": "Assets listed",
"data": [
{ "asset_id": 123, "media_type": "video" },
{ "asset_id": 124, "media_type": "audio" },
{ "asset_id": 125, "media_type": "video" }
]
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| asset_id | integer | Required | The asset ID to retrieve |
GET /get_asset?asset_id=123
{
"status": "success",
"message": "Asset Fetched",
"data": {
"asset_id": 123,
"media_type": "video"
}
}
{
"status": "failed",
"message": "Asset not found"
}
Job Lifecycle
Every visual dubbing job follows this sequence. Poll /get_status until the job is complete, then download with /get_file.
Processing Phases
Error Codes
| Code | Name | Description |
|---|---|---|
| ERR_003 | INTERNAL_SERVER_ERROR | An internal server error occurred |
| ERR_004 | NO_FACE_FOUND | No face was detected in the provided video |
| ERR_006 | INSUFFICIENT_CREDITS | Not enough credits to complete the request |
| ERR_007 | DATA_CORRUPTED | Uploaded data is corrupted or invalid |
| ERR_008 | INVALID_FORMAT | Unsupported file type. Accepted: .mp4, .mov, .mp3, .wav |
| ERR_009 | LIMIT_EXCEEDS | Video duration exceeds the limit. |