APIs for creating and managing media (animated videos) with comprehensive control over generation parameters.
Upload one image to generate an animated video with AI-generated motion.
Upload two images (start and end frames) to create a transition video.
Provide a text description to generate a video from scratch.
Creates a new media object and initiates video generation from images or text prompts.
title: Media title (optional)description: Media description (optional)visibility_status: Access controlimage_files: Upload image files (array)image_urls: Provide image URLs (array)prompt: Text description for video generation (optional if images provided)motion_type: AI model for motion generation (optional)quantity: Number of videos to generate (1-4)duration: Video length in seconds (1-10)loop: Number of times to repeat motion (1-6)native_audio: Enable native sound effects and lip sync (True or False)narration: Narration text (optional)narrator: Voice for narration (optional)bg_music_prompt: Description for background music (optional)aspect_ratio: Video dimensions (e.g., "16:9", "9:16", "1:1")webhook_url: URL for completion notifications (optional)import requests
url = "https://api.vimmerse.net/media"
payload = {
'title': 'Morph Animation',
'description': 'Transition between two scenes'
}
files=[
('image_files', ('start_frame.png', open('path/to/start_frame.png', 'rb'), 'image/png')),
('image_files', ('end_frame.png', open('path/to/end_frame.png', 'rb'), 'image/png'))
]
headers = {
'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)
import requests
url = "https://api.vimmerse.net/media"
payload = {
'title': 'Character Animation',
'image_urls': [
'https://example.com/character1.png',
'https://example.com/character2.png'
],
'motion_type': 'KlingAI',
'quantity': 2, # Generate 2 variations
'duration': 8, # 8 seconds long
'native_audio': True
}
headers = {
'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
import requests
url = "https://api.vimmerse.net/media"
payload = {
'title': 'AI Generated Video',
'prompt': 'A cute bunny jumping through a magical forest with sparkling fairy dust',
'native_audio': True,
'bg_music_prompt': 'Gentle, magical background music with chimes',
'duration': 5,
'webhook_url': 'https://your-domain.com/webhook'
}
headers = {
'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
| title | string (Title) Default: "" | ||||||||||||||||||||||||
| description | string (Description) Default: "" | ||||||||||||||||||||||||
| visibility_status | string (Visibility Status) Default: "1" Visibility Status:
| ||||||||||||||||||||||||
| image_files | Array of strings <binary> (Image Files) Default: [] Images to upload. If you upload a single image, an auto motion video will be created from that image. If you upload two images, the second image will be treated as the final frame of the video, resulting in motion transitions between the two images. The most recently uploaded image will be considered the last frame. | ||||||||||||||||||||||||
| image_urls | Array of strings (Image URLs) Default: [] If you upload image files, this field will be ignored. | ||||||||||||||||||||||||
| media_items | string (Media Items) You can add start and/or end input. Here is an example.
[{"type":"image","url": "https://media.vimmerse.net/your/image/file.png", "position": "First"},{"type":"video","url": "https://media.vimmerse.net/your/video/file.mp4", "position": "Last"}]. Values from | ||||||||||||||||||||||||
| prompt | string (Text prompt) Default: "" Description to generate video. | ||||||||||||||||||||||||
| motion_type | string (Motion Type) Default: "Auto" Defines the motion style used for video animation. | ||||||||||||||||||||||||
| camera_control | string (Camera Path) Default: "" Defines the camera path of the bullet video. | ||||||||||||||||||||||||
| quantity | integer (Quantity) [ 1 .. 4 ] Default: 1 | ||||||||||||||||||||||||
| duration | integer (Duration of video) [ 1 .. 10 ] Default: 5 | ||||||||||||||||||||||||
| loop | integer (Number of times the same motion is repeated. This setting is ignored if a narrator is used.) [ 1 .. 6 ] Default: 1 | ||||||||||||||||||||||||
| motion_range | integer (The amount of motion, ranging from 1 to 10. Default value is 5.) [ 1 .. 10 ] Default: 5 | ||||||||||||||||||||||||
| audio_option | string (Audio Option) Audio configuration options for media generation. ⚠️ Note: These options are ignored if Audio Parameters
Usage ExamplesText-to-Speech Narration
Pre-recorded Audio
AI-Generated Background Music
External Music File
Best Practices
| ||||||||||||||||||||||||
| character_animate | boolean (Character Animate) Default: false Defines if the uploaded video will be animated as character animate. | ||||||||||||||||||||||||
| model | string (Model) Defines how a video will be animated. Available values are: 'SeedreamTryOn', 'NanoBananaProTryOn', 'FashnTryOn', 'ViduTryOn', or 'KlingTryOn' for TryOnVideo | ||||||||||||||||||||||||
| aspect_ratio | string (Aspect ratio) Available values are '16:9', '4:3', '1:1', '3:4' and '9:16' | ||||||||||||||||||||||||
| webhook_url | string (Webhook URL) a 'POST' request will be made to your webhook URL after media is fully generated. |
New Media
Insufficient Credit
Not Found
Validation Error
{- "data": {
- "id": "media_id",
- "title": "Example Media",
- "description": "Media description",
- "rating": "",
- "customer_id": "customer_id",
- "batch_id": "",
- "is_transition": "No",
- "duration_time": "0",
- "progress_percentage": 20,
- "processing_status": "queue_bullet",
- "visibility_status": "1",
- "file_map": [
- {
- "FileType": "Texture",
- "FileName": "filename.jpg"
}
], - "intermediate_results": [ ],
- "submit_params": {
- "native_audio": true,
- "pipeline_preset": "Fast",
- "file_size": "",
- "scale_factor": "1"
}, - "pose_preset": {
- "MotionType": "Auto",
- "Params": "Prompt=|CameraPath=|Quantity=1|MotionAmount=5|MotionLength=5|Loop=1"
}, - "bullet_version": "0",
- "video_history": [ ],
- "result": [ ],
- "webhook_url": "",
- "nsfw": "0",
- "created_at": "2025-04-01 18:57:37.355064+00:00",
- "updated_at": "2025-04-01 18:57:55.502020+00:00",
- "version": "2"
}
}Retrieves the current processing status and progress percentage of a media object.
progress_percentage: Processing progress (0-100)processing_status: Current stateimport requests
import time
def check_media_status(media_id):
url = f"https://api.vimmerse.net/media/{media_id}/processing-status"
headers = {'X-Api-Key': 'YOUR_API_KEY'}
while True:
response = requests.request("GET", url, headers=headers)
status = response.json()['data']
print(f"Progress: {status['progress_percentage']}%")
print(f"Status: {status['processing_status']}")
if status['processing_status'] in ['success', 'fail']:
break
time.sleep(10) # Check every 10 seconds
check_media_status('MEDIA_ID')
| Status | Meaning | Action |
|---|---|---|
| queue_bullet | Waiting in queue | Keep polling |
| processing | Video generation in progress | Keep polling |
| success | Video ready | Download or retrieve results |
| fail | Processing failed | Check error logs or retry |
Media progress percentage
Not Found
Validation Error
{- "data": {
- "progress_percentage": "100",
- "processing_status": "success"
}
}Retrieves detailed information about a specific media object.
id: Unique media identifiertitle: Media titleprocessing_status: Current processing stateprogress_percentage: Processing progress (0-100)result: Array of generated video URLsvideo_history: Processing history and detailsimport requests
url = "https://api.vimmerse.net/media/{MEDIA_ID}"
headers = {
'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.request("GET", url, headers=headers)
media_data = response.json()
# Access the result videos
if media_data['data']['processing_status'] == 'success':
videos = media_data['data']['result']
print(f"Generated {len(videos)} video(s)")
for video in videos:
print(f"Video URL: {video['url']}")
Media Object
Media Not Found
Validation Error
{- "data": {
- "data": {
- "id": "media_id",
- "title": "",
- "description": "",
- "rating": "",
- "customer_id": "customer_id",
- "batch_id": "batch_id",
- "is_transition": "No",
- "duration_time": "5.0",
- "progress_percentage": 100,
- "processing_status": "success",
- "visibility_status": "1",
- "file_map": [
- {
- "FileType": "Texture",
- "FileName": "uploaded_file1.png"
}
], - "intermediate_results": [ ],
- "submit_params": {
- "native_audio": true,
- "pipeline_preset": "Fast",
- "file_size": "",
- "scale_factor": "1"
}, - "pose_preset": {
- "MotionType": "Auto",
- "Params": "Prompt=|CameraPath=|Quantity=1|MotionAmount=5|MotionLength=5|Loop=1|AspectRatio=16:9"
}, - "bullet_version": "1",
- "video_history": [
- {
- "generate_type": "GENERATE_VIDEO",
- "pose_preset": {
- "MotionType": "Auto",
- "Params": "Prompt=|CameraPath=|Quantity=1|MotionAmount=5|MotionLength=5|Loop=1|AspectRatio=16:9"
}, - "file_map": [
- {
- "FileType": "Texture",
- "FileName": "uploaded_file1.png"
}
], - "service_name": "RunwayML",
- "service_seeds": [
- 6305
], - "created_at": "2025-04-01 13:20:36.607637+00:00",
- "service_version": "gen3a_turbo:2024-11-06",
- "bullet_version": "1",
- "resolution": [
- 1280,
- 704
], - "submit_params": {
- "native_audio": true,
- "pipeline_preset": "Fast",
- "file_size": "",
- "scale_factor": "1"
}
}
], - "result": [ ],
- "nsfw": "0",
- "service_name": "RunwayML",
- "service_version": "gen3a_turbo:2024-11-06",
- "created_at": "2025-04-01 13:19:10.786297+00:00",
- "updated_at": "2025-04-01 13:20:37.032634+00:00",
- "version": "2"
}
}
}Updates media metadata and optionally regenerates the video.
⚠️ Credit Usage: Updating certain fields triggers video regeneration and consumes credits.
prompt, motion_type, quantity, duration, loop, aspect_ratio, native_audioimport requests
url = "https://api.vimmerse.net/media/{MEDIA_ID}/edit"
headers = {
'X-Api-Key':'YOUR_API_KEY',
}
payload = {
'title': 'Updated Product Video',
'description': 'New description text',
'rating': '5',
'visibility_status': '2' # Make public
}
response = requests.request("PUT", url, headers=headers, data=payload)
print(response.text)
import requests
url = "https://api.vimmerse.net/media/{MEDIA_ID}/edit"
headers = {
'X-Api-Key': 'YOUR_API_KEY',
}
payload = {
'title': 'Updated Video',
'motion_type': 'RunwayML', # Triggers regeneration
'duration': 9, # Triggers regeneration
'native_audio': True # Triggers regeneration
}
response = requests.request("PUT", url, headers=headers, data=payload)
print(response.text)
| title | string (Title) Default: "" | ||||||||||||||||||||||||
| description | string (Description) Default: "" | ||||||||||||||||||||||||
| visibility_status | string (Visibility Status) Default: "1" Visibility Status:
| ||||||||||||||||||||||||
| rating | string (Rating) | ||||||||||||||||||||||||
| media_items | string (Media Items) You can add start and/or end input. Here is an example.
[{"type":"image","url": "https://media.vimmerse.net/your/image/file.png", "position": "First"},{"type":"video","url": "https://media.vimmerse.net/your/video/file.mp4", "position": "Last"}]. Values from | ||||||||||||||||||||||||
| prompt | string (Text prompt) Default: "" Description to generate video. | ||||||||||||||||||||||||
| motion_type | string (Motion Type) Defines the motion style used for video animation. | ||||||||||||||||||||||||
| camera_control | string (Camera Path) Default: "" Defines the camera path of the bullet video.Available values are [{'label': 'Auto', 'prompt': '', 'value': ''}, {'label': 'Static', 'prompt': 'Camera static and steady', 'value': 'Static'}, {'label': 'Crane up', 'prompt': 'Camera crane up', 'value': 'Crane up'}, {'label': 'Crane down', 'prompt': 'Camera crane down', 'value': 'Crane down'}, {'label': 'Tilt up', 'prompt': 'Camera tilt up', 'value': 'Tilt up'}, {'label': 'Tilt down', 'prompt': 'Camera tilt down', 'value': 'Tilt down'}, {'label': 'Pan right', 'prompt': 'Camera pan right', 'value': 'Pan right'}, {'label': 'Pan left', 'prompt': 'Camera pan left', 'value': 'Pan left'}, {'label': 'Roll right', 'prompt': 'Camera roll right', 'value': 'Roll right'}, {'label': 'Roll left', 'prompt': 'Camera roll left', 'value': 'Roll left'}, {'label': 'Orbit right', 'prompt': 'Camera orbit right', 'value': 'Orbit right'}, {'label': 'Orbit left', 'prompt': 'Camera orbit left', 'value': 'Orbit left'}, {'label': 'Rotate 360', 'prompt': 'Camera move in 360-degree rotation around', 'value': 'Rotate 360'}, {'label': 'Dolly zoom', 'prompt': 'Camera dolly zoom', 'value': 'Dolly zoom'}, {'label': 'Zoom in', 'prompt': 'Camera zoom in', 'value': 'Zoom in'}, {'label': 'Zoom out', 'prompt': 'Camera zoom out', 'value': 'Zoom out'}, {'label': 'Aerial', 'prompt': 'Camera aerial as FPV drone shot', 'value': 'Aerial'}] | ||||||||||||||||||||||||
| quantity | integer (Quantity) [ 1 .. 4 ] | ||||||||||||||||||||||||
| duration | integer (Duration of video) [ 1 .. 10 ] | ||||||||||||||||||||||||
| loop | integer (Number of times the same motion is repeated. This setting is ignored if a narrator is used.) [ 1 .. 6 ] | ||||||||||||||||||||||||
| motion_range | integer (The amount of motion, ranging from 1 to 10. Default value is 5.) [ 1 .. 10 ] | ||||||||||||||||||||||||
| audio_option | string (Audio Option) Audio configuration options for media generation. ⚠️ Note: These options are ignored if Audio Parameters
Usage ExamplesText-to-Speech Narration
Pre-recorded Audio
AI-Generated Background Music
External Music File
Best Practices
| ||||||||||||||||||||||||
| model | string (Model) Defines how a video will be animated. Available values are: 'SeedreamTryOn', 'NanoBananaProTryOn', 'FashnTryOn', 'ViduTryOn', or 'KlingTryOn' for TryOnVideo | ||||||||||||||||||||||||
| aspect_ratio | string (Aspect ratio) Available values are '16:9', '4:3', '1:1', '3:4' and '9:16' | ||||||||||||||||||||||||
| webhook_url | string (Webhook URL) a 'POST' request will be made to your webhook URL after media is fully generated. |
Media Object
Bad Request
Insufficient Credit
Not Found
Validation Error
{- "data": {
- "id": "media_id",
- "title": "",
- "description": "",
- "rating": "",
- "customer_id": "customer_id",
- "batch_id": "batch_id",
- "is_transition": "No",
- "duration_time": "5.0",
- "progress_percentage": 100,
- "processing_status": "success",
- "visibility_status": "1",
- "file_map": [
- {
- "FileType": "Texture",
- "FileName": "uploaded_file1.png"
}
], - "intermediate_results": [ ],
- "submit_params": {
- "native_audio": true,
- "pipeline_preset": "Fast",
- "file_size": "",
- "scale_factor": "1"
}, - "pose_preset": {
- "MotionType": "Auto",
- "Params": "Prompt=|CameraPath=|Quantity=1|MotionAmount=5|MotionLength=5|Loop=1|AspectRatio=16:9"
}, - "bullet_version": "1",
- "video_history": [
- {
- "generate_type": "GENERATE_VIDEO",
- "pose_preset": {
- "MotionType": "Auto",
- "Params": "Prompt=|CameraPath=|Quantity=1|MotionAmount=5|MotionLength=5|Loop=1|AspectRatio=16:9"
}, - "file_map": [
- {
- "FileType": "Texture",
- "FileName": "uploaded_file1.png"
}
], - "service_name": "RunwayML",
- "service_seeds": [
- 6305
], - "created_at": "2025-04-01 13:20:36.607637+00:00",
- "service_version": "gen3a_turbo:2024-11-06",
- "bullet_version": "1",
- "resolution": [
- 1280,
- 704
], - "submit_params": {
- "native_audio": true,
- "pipeline_preset": "Fast",
- "file_size": "",
- "scale_factor": "1"
}
}
], - "result": [ ],
- "nsfw": "0",
- "service_name": "RunwayML",
- "service_version": "gen3a_turbo:2024-11-06",
- "created_at": "2025-04-01 13:19:10.786297+00:00",
- "updated_at": "2025-04-01 13:20:37.032634+00:00",
- "version": "2"
}
}Downloads file from media.
This code shows an example of how to download Bullet Video from Auto motion.
import requests
url = "https://api.vimmerse.net/media/{MEDIA_ID}/download?object_type=bullet_video_mp4&motion_type=Auto"
headers = {
'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
This code shows an example of how to download Bullet Video with custom settings
import requests
url = "https://api.vimmerse.net/media/{MEDIA_ID}/download?object_type=bullet_video_mp4&motion_type=Auto&width=1080&file_size=4"
headers = {
'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
Return bullet video, gif or source files.
Bad Request
Validation Error
nullResubmits a media object for video generation.
⚠️ Note: This consumes credits each time it's called.
import requests
url = "https://api.vimmerse.net/media/{MEDIA_ID}/process"
headers = {
'X-Api-Key': 'YOUR_API_KEY'
}
# Send POST request with empty body
response = requests.request("POST", url, headers=headers)
print(response.text)
Media Object
Bad Request
Insufficient Credit
Not Found
Validation Error
{- "data": { }
}