Veo 3.1 (ECL) — Start-End Frame to Video
curl --request POST \
--url https://api.muvi.video/v1/jobs/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"aspect_ratio": "<string>",
"duration": "<string>",
"has_sound": "<string>",
"resolution": "<string>"
}
}
'import requests
url = "https://api.muvi.video/v1/jobs/submit"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"aspect_ratio": "<string>",
"duration": "<string>",
"has_sound": "<string>",
"resolution": "<string>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
prompt: '<string>',
first_frame_url: '<string>',
last_frame_url: '<string>',
aspect_ratio: '<string>',
duration: '<string>',
has_sound: '<string>',
resolution: '<string>'
}
})
};
fetch('https://api.muvi.video/v1/jobs/submit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"jobId": "<string>",
"status": "<string>",
"estimatedCompletionTime": "<string>",
"costMicroCents": 123
}Veo 3.1
Veo 3.1 (ECL) — Start-End Frame to Video
Generate videos that animate from a start frame to an end frame using Google’s Veo 3.1 (ECL) variant via PixelByte API
POST
/
v1
/
jobs
/
submit
Veo 3.1 (ECL) — Start-End Frame to Video
curl --request POST \
--url https://api.muvi.video/v1/jobs/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"aspect_ratio": "<string>",
"duration": "<string>",
"has_sound": "<string>",
"resolution": "<string>"
}
}
'import requests
url = "https://api.muvi.video/v1/jobs/submit"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"aspect_ratio": "<string>",
"duration": "<string>",
"has_sound": "<string>",
"resolution": "<string>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
prompt: '<string>',
first_frame_url: '<string>',
last_frame_url: '<string>',
aspect_ratio: '<string>',
duration: '<string>',
has_sound: '<string>',
resolution: '<string>'
}
})
};
fetch('https://api.muvi.video/v1/jobs/submit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"jobId": "<string>",
"status": "<string>",
"estimatedCompletionTime": "<string>",
"costMicroCents": 123
}Generate seamless video transitions between two key frames with Google’s Veo 3.1 (ECL) variant. Provide a first frame, a last frame, and an optional text prompt to guide the in-between motion. Supports optional audio generation.
| Property | Value |
|---|---|
| Provider | |
| Model | Veo 3.1 (ECL) |
| Capability | Start-End Frame to Video |
| Base Cost | 200,000 micro-cents/second ($0.20/sec) |
| Processing Time | ~85 seconds |
Request Body
string
required
Model slug. Use
google/veo-3.1-ecl/start-end-frame-to-video for start-end frame video generation.object
required
Input parameters for start-end frame to video generation.
Hide properties
Hide properties
string
Optional text description guiding the motion between frames (max 4000 characters).
string
required
URL of the start frame image.
string
required
URL of the end frame image.
string
Video aspect ratio. Default:
16:9. Options: 16:9, 9:16.string
Video duration in seconds. Default:
4. Options: 4, 6, 8. Affects pricing.string
Generate audio. Default:
false. Options: true, false. Affects pricing.string
Output resolution. Default:
720p. Options: 720p, 1080p, 4k.string
HTTPS URL to receive a webhook notification when the job completes or fails.
Pricing
Base cost: 200,000 micro-cents per second ($0.20/sec)finalCost = baseCost × duration × has_sound
| Factor | Option | Multiplier |
|---|---|---|
| Duration | 4 | 4x |
6 | 6x | |
8 | 8x | |
| Sound | false | 1x |
true | 1.5x |
Default cost: 4 seconds, no sound = 200,000 × 4 × 1 = 800,000 micro-cents ($0.80)
Response
string
Unique identifier for the submitted job.
string
Initial job status. Always
"pending" on successful submission.string
ISO 8601 timestamp of the estimated completion time.
number
The cost of the job in micro-cents.
Code Examples
curl -X POST https://api.muvi.video/v1/jobs/submit \
-H "Authorization: Bearer $PIXELBYTE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "google/veo-3.1-ecl/start-end-frame-to-video",
"input": {
"prompt": "A timelapse of clouds moving over mountains",
"first_frame_url": "https://example.com/image.jpg",
"last_frame_url": "https://example.com/image.jpg",
"aspect_ratio": "16:9",
"duration": "4",
"has_sound": "false",
"resolution": "720p"
}
}'
import requests
response = requests.post(
"https://api.muvi.video/v1/jobs/submit",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "google/veo-3.1-ecl/start-end-frame-to-video",
"input": {
"prompt": "A timelapse of clouds moving over mountains",
"first_frame_url": "https://example.com/image.jpg",
"last_frame_url": "https://example.com/image.jpg",
"aspect_ratio": "16:9",
"duration": "4",
"has_sound": "false",
"resolution": "720p"
}
}
)
data = response.json()
print(data)
const response = await fetch("https://api.muvi.video/v1/jobs/submit", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "google/veo-3.1-ecl/start-end-frame-to-video",
input: {
prompt: "A timelapse of clouds moving over mountains",
first_frame_url: "https://example.com/image.jpg",
last_frame_url: "https://example.com/image.jpg",
aspect_ratio: "16:9",
duration: "4",
has_sound: "false",
resolution: "720p"
}
})
});
const data = await response.json();
console.log(data);
